基于Linux操作系统的ARM/DSP多机I2C通信设计方案

发布者:码农创想家最新更新时间:2012-02-21 来源: 21IC关键字:Linux操作系统  ARM  DSP  I2C通信 手机看文章 扫描二维码
随时随地手机看文章

  引言

  在很多嵌入式控制系统中,系统既要完成大量的信息采集和复杂的算法,又要实现精确的控制功能。采用运行有嵌入式Linux操作系统的ARM9微控制器完成信号采集及实现上层控制算法,并向DSP芯片发送上层算法得到控制参数,DSP芯片根据获得的参数和下层控制算法实现精确、可靠的闭环控制。

  1 多机系统组成

  该多机控制系统以ARM9微控制器s3c2440为核心,采用I2C总线挂载多个DSP芯片TMS320F28015作为协控制器,构成整个控制系统的核心。

  1.1 S3C2440及TMS320F28015简介

  Samsung公司的处理器S3C2440是内部集成了ARM公司ARM920T处理器内核的32位微控制器,资源丰富,带独立的16 KB的指令Cache和16 KB数据Cache,最高主频可达400 MHz.它拥有130个通用I/O、24个外部中断源以及丰富的外部接口能实现各种功能,包括支持多主功能的I2C总线接口、3路URAT、2路SPI、摄像头接口等。

  TMS320F28015(以下简称F28015)是TI公司的32位处理器,它具有强大的控制和信号处理能力,能够实现复杂的控制算法。片上整合了Flash存储器、I2C总线模块、快速的A/D转换器、增强的CAN总线模块、事件管理器、正交编码电路接口及多通道缓冲串口等外设,此种整合能够方便地实现功能的扩展。同时,快速的中断响应使它能够保护关键的寄存器并快速(更小的中断延时)地响应外部异步事件。

  1.2 I2C总线接口

  I2C总线是一种用于IC器件之间连接的串行总线,采用SDA(数据线)和SCL(时钟线)两线连接每个带有I2C总线接口的器件或模块。串行的8位双向数据传输率在标准模式下可达100 kb/s,快速模式下可达400 kb/s.多个微控制器可以通过I2C总线接口非常方便地连接在一起构成系统,并根据地址识别每个器件。这种总线结构的连线和连接引脚少,器件间总线简单,结构紧凑。因此其构成系统的成本较低,并且在总线上增加器件不会影响系统的正常工作,所有的I2C总线器件共用一套总线,因此其系统修改和可扩展性好。

  总线必须由主机(通常为微控制器)控制,主机产生串行时钟( SCL) 控制总线的数据传输,并产生起始和停止条件。SDA 线上的数据状态仅在SCL为低电平的期间才能改变,SCL为高电平的期间,SDA 状态的改变被用来表示起始和停止条件。I2C总线起始和停止时序如图1所示。

图1 I2C总线起始和停止时序

  1.3 硬件电路

  S3C2440和F28015自身均集成了I2C总线模块,支持多主设备I2C总线串行接口,可以方便地挂接到I2C总线上。因此,两者之间的I2C总线接口电路的设计变得十分简单,只要将两者的对应引脚I2C_CLK(对应I2C总线中的SCL线)和I2C_SDA(对应I2C总线中的DATA线)连接起来即可。S3C2440和TMS320F28015的硬件接口电路如图2所示。

图2 S3C2440和TMS320F28015的硬件接口

  电路S3C2440的PA55和PA56引脚分别对应I2C_SDA和I2C_CLK,而F28015的GPIO32和GPIO33也可以分别复用为I2C_SDA和I2C_CLK.考虑到阻抗不匹配等因素会影响总线数据传输效果,因此在将两块芯片的I2C_DATA和I2C_CLK引脚直连时,在直连线路上各串联一个小电阻。

  I2C_SDA和I2C_CLK是双向电路,必须都通过一个电流源或上拉电阻连接到正电源电压上。由于S3C2440和F28015的输出高电平均为3.3 V,所以在硬件设计时将I2C_SDA和I2C_CLK总线通过上拉电阻连接到了3.3 V的VCC电源上。

  2 ARM和DSP通信软件设计

  运行Linux操作系统的ARM微控制器作为主控制器,在数据管理及多任务调度等方面有显着优势,可以很好地组织外围器件采集的数据;主要实现对系统的整体控制,并通过总线设备驱动程序控制I2C总线模块,通过主机寻址实现向I2C总线上挂载的下层DSP的数据收发。为保证数据通信的实时性,F28015通过中断响应的方式实现数据接收和发送。[page]

  2.1 ARM9平台的嵌入式Linux的I2C总线驱动设计

  2.1.1 I2C总线读写时序

  ARM9微控制器作为主机向从机DSP写数据,首先向从机发送启动信号,然后发送7位从机地址和1位写标志位,再等待从机的应答信号。在收到应答信号后,主机发送数据给从机,再次等待应答信号。当主机收到应答信号之后再次发送数据。之后,主机等待从机的应答信号,如此直到数据发送完成,主机发送停止信号。I2C总线写数据帧格式如图3所示。

图3 I2C总线写数据帧格式

  主模式下读数据,是指每次从指定的位置读取一个或多个字节数据。主机首先向从机发送启动信号,然后发送 7位从机地址和1位读标志位,等待从机应答。当收到从机的应答信号后,主机准备接收从机发送的数据,接收完成后发送一个应答信号,如此直到数据接收完成,主机发送一个停止信号。图4为I2C总线读数据帧格式。

图4 I2C总线读数据帧格式

  2.1.2 Linux下I2C总线驱动程序概述

  Linux系统的I2C总线驱动采用体系化结构设计,包括I2C总线适配器驱动和I2C总线设备驱动。总线驱动实现对I2C总线适配器(S3C2440的I2C总线模块)的控制,设备驱动实现对具体设备(F28015的I2C总线模块)的读写控制。图5为总体驱动框架,可以分为三个层次:

  ① I2C框架。内核中i2c.h和i2ccore.c为I2C总线框架的主体,提供了核心数据结构的定义、I2C总线适配器驱动和设备驱动的注册、注销管理、I2C总线通信方法上层的、与具体适配器无关的代码、检测设备地址的上层代码等。i2cdev.c用于创建I2C总线适配器的设备节点,提供I2C总线设备访问方法等。

  ② I2C总线适配器驱动。定义描述具体I2C总线适配器的数据结构,实现在具体I2C总线适配器上的I2C总线通信方法。

  ③ I2C总线设备驱动。定义描述具体设备的数据结构,借助I2C总线框架的相关函数实现设备的注册,并为用户提供上层应用程序编程接口。

图5 总体驱动框架

  Linux的I2C总线驱动框架中的主要数据结构包括: i2c_driver、i2c_client、i2c_adapter和 i2c_algorithm,它们被定义在内核中的i2c. h头文件中。i2c_adapter对应于物理上的一个适配器,而i2c_algorithm对应一套通信方法,用来为适配器提供通信函数。i2c_algorithm中的关键函数master_xfer()用于产生I2C总线访问周期需要的信号,以i2c_msg(即I2C总线消息)为单位。该结构体原型如下:

  struct i2c_msg{

  _ _u16 addr;/*设备地址*/

  _ _u16 flags;/*标志*/

  _ _u16 len;/*消息长度*/

  _ _u8 *buf;/*消息数据*/

  };

  i2c_driver对应一套驱动方法,是用于辅助作用的数据结构。i2c_client对应于真实的物理设备,每个I2C总线设备都需要一个i2c_client来描述。i2c_adapter和i2c_client的关系与I2C总线硬件体系中适配器和设备关系一致,即i2c_client依附于i2c_adapter.[page]

图6 设备驱动模块加载流程

  在Linux内核源代码中drivers目录下的i2c_dev.c文件,是通用的I2C总线设备驱动文件,为应用程序提供open()、write()、read )、ioctl()和close()等操作接口来访问设备。应用层可以借用这些接口访问挂接在适配器上的I2C总线设备的存储空间或寄存器,并控制I2C总线设备的工作方式。

  2.1.3 S3C2440的I2C总线驱动

  设备驱动S3C2440内部的I2C总线控制器通过4个寄存器实现对通信的控制,分别是I2C控制寄存器(I2CCON)、I2C状态寄存器(I2CSTAT)、I2C收发数据移位寄存器(I2CDS)、I2C地址寄存器(I2CADD)。

  按照Linux中I2C总线框架要求,S3C2440的I2C总线驱动设计主要完成以下工作:设计i2c_adapter_s3c_init()模板加载函数和对应于i2c_adapter_s3c_exit()模板卸载函数;设计i2c_adapter_s3c_xfer()模板S3C2440适配器通信方法函数。

  i2c_adapter_s3c_init()通过注册s3c2440_i2c_driver结构体实现总线驱动的平台注册,s3c2440_i2c_driver结构体包含了具体适配器的probe()函数、remove()函数、resume()函数指针等信息。代码如下:

  static int _ _init i2c_adap_s3c_init(){

  int ret;

  ret=platform_driver_regisiter(&s3c2440_i2c_driver);//注册platform_driver结构体

  if(ret==0){//注册失败

  ret=platform_driver_regisiter(&s3c2440_i2c_driver);

  if(ret)

  platform_driver_unregisiter (&s3c2440_i2c_driver);

  }

  return ret;

  }

  static struct platform_driver s3c2440_i2c_driver={

  .probe=s3c24xx_i2c_probe,

  .remove=s3c24xx_i2c_remove,

  .resume=s3c24xx_i2c_resume,

  .driver={

  .owner=THIS MODULE,

  .name=“s3c2440i2c”,

  },

  } ;

  完成了S3C2440的I2C总线适配器驱动注册后,就可以将具体设备驱动注册到该总线平台上,实现I2C总线数据通信。i2c_dev.c文件是内核源码提供的通用I2C总线设备驱动文件,针对每个I2C总线适配器生成一个主设备号为89的设备文件,设备驱动模块加载流程如图6所示。完成加载后,驱动提供i2cdev_read()、i2cdev_write()、i2cdev_ioctl()函数来对应用户空间的read()、write()、ioctl()函数,供用户使用。用户通过这些接口函数实现I2C总线数据的读写功能。

  2.2 DSP数据接收中断程序设计

图7 I2C总线中断服务程序流程[page]

  通过配置F28015的I2C模块寄存器,设置I2C模块为从工作方式,同时利用I2C总线中断响应程序实现对总线上数据的接收和发送,进而完成数据通信。F28015产生了I2C总线中断后,就执行中断服务程序,图7为I2C总线中断服务程序流程。

  中断服务程序通过查询状态寄存器(I2CSTR)标志位,得出中断类型码,然后调用相应的子程序,完成数据接收发送。代码如下:

  interrupt void i2c_int1a_isr(void) {//I2CA的中断响应函数

  Uint16 IntSource;// 读取中断码

  IntSource=I2caRegs.I2CISRC.bit.INTCODE & 0x7;//I2CA中断源,读后3位

  switch(IntSource){//依中断源而确定相关接收和发送策略

  case I2C_NO_ISRC://=0

  case I2C_ARB_ISRC://=1

  case I2C_NACK_ISRC: //=2

  case I2C_ARDY_ISRC: //=3

  case I2C_SCD_ISRC://=6

  case I2C_AAS_ISRC://=7

  break;

  case I2C_RX_ISRC://=4,接收数据已准备好

  DataReceive();//调用数据接收子函数接收数据

  break;

  case I2C_TX_ISRC://=5,发送数据已准备好

  DataTransmit();//调用数据发送子函数接收数据

  break;

  default:

  asm(“ESTOP0”); //无效数据,则停止

  }

  PieCtrlRegs.PIEACK.all=PIEACK_GROUP8;

  }

  F28015中的数据接收子程序和数据发送子程序是在I2C总线的中断服务程序中根据不同的状态码进行调用,它们是整个通信程序的核心部分。数据接收子程序和数据发送子程序的流程如图8所示。

图8 数据接收和发送子程序

  3 测试结果

  通过NFS文件系统将编译成模块的I2C的总线驱动和设备驱动加载到运行Linux操作系统的S3C2440平台上(先加载总线驱动),再将F28015的测试程序烧写到RAM中。运行F28015等待I2C总线上的数据,再执行Linux系统中的I2C总线测试程序。测试结果显示,芯片通过I2C总线接口完成了数据通信,具有良好的实时性和可靠性。

  4 结论

  该设计利用I2C总线实现了ARM9微控制器与DSP芯片间实时可靠的数据通信。ARM9微控制器结合Linux操作系统作为上层控制核心,DSP芯片实现下层控制算法,可充分发挥ARM9微控制器在数据采集和任务管理等方面的优势以及DSP芯片在算法实现和底层控制的长处。

关键字:Linux操作系统  ARM  DSP  I2C通信 引用地址:基于Linux操作系统的ARM/DSP多机I2C通信设计方案

上一篇:基于DSP+FPGA多视频通道的切换控制
下一篇:基于ARM和μC/OS-Ⅱ的嵌入式USB主机设计与应用

推荐阅读最新更新时间:2024-03-16 12:53

如何在MCU内完成ADC?
STM32的优点在哪里?除去宣传环节,细细分析,STM32时钟不算快,72MHZ,也不能扩展大容量的RAM FLASH,同样没有DSP那样强大的指令集。它的优势在哪里呢? ---就在快速采集数据,快速处理上。 ARM的特点就是方便。 这个快速采集,高性能的ADC就是一个很好的体现,12位精度,最快1uS的转换速度,通常具备2个以上独立的ADC控制器,这意味着,STM32可以同时对多个模拟量进行快速采集,这个特性不是一般的MCU具有的。以上高性能的ADC,配合相对比较块的指令集和一些特色的算法支持,就构成了STM32在电机控制上的强大特性。 好了,正题,怎么做一个简单的ADC? 注意是简单的,ADC是个复杂的问题,涉及硬件设
[单片机]
如何在MCU内完成ADC?
DSP出货量减少 无线产品保持增长
  调研公司ForwardConcepts报道称,2008年底的DSP出货量业绩不佳,销售额从10月到11月下降33%,同比去年11月份的下降幅度超过49%。   尽管大多数应用都出现了销售明显下降,但无线应用却呈上升趋势。无线基础设施的DSP销售额从10月到11月仅出现温和的下降,跌幅为3.4%。手机处理器的表现也可圈可点,出货量为12%。   ForwardConcepts预计,2008年总出货量将比2007年低14%,相对来说算是较为温和的下降。不过,更大的下降会出现在2008年以后,这意味着2009年DSP市场将会有明显的衰退。
[嵌入式]
基于DSP的实时互相关测速系统设计与实现
以往,速度测量系统普遍采用单片机和转速传感器相结合的结构,其稳定性和快速响应性较差。针对这一缺点 ,本系统利用信息相关理论结合电子技术来设计和开发测速装置,可实现对任何运动物体速度的非接触式测量,具有测量精度高、装置电路简单、成本低以及智能化等特点,因此可在汽车测速、产品检测线测速和管道流量检测等许多领域内得到广泛应用 。 1 测速原理 应用信息相关理论来测量物体运动速度的基本原理是:物体运动过程中,物体同一位置上的信息在不同时间依然保持相同的特性。通过在某时间内,利用对固定位置上的两个信息采集点进行连续采集,所采集到的两组信号具有相关特性 。对两组信号进行相关运算,即可找出两组采集信号的时间间隔,从而计算出该物体运动速
[工业控制]
基于<font color='red'>DSP</font>的实时互相关测速系统设计与实现
基于ARM控制器LPC2294的CAN/PCI智能通信卡设计
引言 LPC2294是 PHILIPS 公司推出的一款功能强大、超低功耗且具有 ARM7TDMI 内核的32位微控制器。它具有丰富的片上资源,完全可以满足一般的工业控制需要,同时还可以减少系统硬件设计的复杂度,提高系统的稳定性。 CAN(“Controller Area Network”)总线控制器局域网是一种能有效支持分布式控制或实时控制的串行通信网络。CAN总线以其高性能、高可靠性、廉价等特性,越来越受到人们的重视和青睐。为了有效的管理工业现场的CAN节点,充分发挥CAN总线的性能,通信卡的设计与研究十分必要。但目前市场上类似产品存在着两点不足。 首先是一般工业现场中可能拥有不止1条CAN总线,而目前设计的通信卡上的C
[单片机]
基于<font color='red'>ARM</font>控制器LPC2294的CAN/PCI智能<font color='red'>通信</font>卡设计
在EPP模式下利用并口实现与DSP高速数据通信
    摘要: DSP与PC机之间进行高速数据通信是DSP的一个重要应用。本文分析了并口处于EPP模式下与ADSP21060之间的高速数据交换的原理,同时详细讨论了其硬件设计的结构图及其相应的并口程序设计。     关键词: 计算机并口 EPP DSP FIFO 随着技术的进步和大量外设的增加,不仅要求计算机并行口可以连接打印机,而且可以连接到其他外设,并要求能够双向传输数据,对高速外设还要求高速数据传输,如DPS。在科技飞速发展的今天,DSP的处理能力和速度也快速提高,广泛用户在科学研究、军事及通信等电子领域。在这些应用中免不了要和PC机进行高速数据传输。计算机并口传统的传输模式为SPP(标准并口),数据传
[嵌入式]
基于DSP技术的MP3播放器的研究与设计
  前言   现在市场上推出了各种型号的MP3随身听,它们采用先进的智能控制技术,利用先进的芯片,不仅实现了MP3格式语音的播放,而且集多种功能于一身。 但这些精巧的随身听价格较昂贵,因此本文根据要求设计了一种廉价MP3播放器,利用硬件存储语音文件,并能够从PC 机下载,从而可随时更新MP3音乐。该MP3播放器同时附加了文本阅读的功能,可做到语音和文本的同步输出。   MP3播放器系统构成   MP3播放器系统结构由图1所示,根据MP3播放器特点要求选择了TI公司的TMS320VC5402芯片,该DSP芯片优越的效价比既可充分胜任本设计的信号处理又能满足本设计要求的价廉目的。而主机选用功能较强的AT89C51芯片。设计原理上
[嵌入式]
一种DSP的远程多加载方案设计
引言     芯片的烧写与自加载是一个DSP系统能够顺利运行的基本条件。在DSP加载技术方面已经有大量文献和工作成果,比较好地解决了DSP自加载方面的许多基本问题。而传统的烧写/加载方案在调试、更新程序时需要反复外接仿真器,配置跳线,并且只能加载运行指定地址空间上的工程。这些对处于安装调试阶段的系统影响不大,但在诸如航天设备、大型机械或其他恶劣环境中工作,难以直接进行仿真器连接的DSP系统中,无法采用普通的烧写/加载方案对其进行更新和调试。     通过分析DSP系统加载原理,提出了一种基于TI公司C6x芯片的远程多加载DSP系统设计。该系统由通信芯片、DSP、外部动态存储器、外部闪存(Flash)共同组成,具备远程烧写、程序选择
[嵌入式]
CEVA连续三年参展IIC,携DSP核厚望中国消费电子市场
DSP核的领导厂商CEVA正在加强其在亚太地区的业务能力,在上海举行的IIC上,该公司表示,鉴于中国市场CEVA客户以及合作伙伴数量的不断增长,该公司已经在不久前于上海设立了其在中国大陆的第一个办事处,从而为更多的本土客户进行技术支持。 “在过去的两年当中,中国市场正在变得日益成熟。本土工程师的技术能力也在迅速提高。另外,越来越多的管理人员正在从硅谷源源不断的涌入中国。”最新上任的CEVA公司亚太区副总裁Gweltaz Toquet在日前举行的IIC上海站上表示,“如果说两年前我们还不能确定上述事实的话,那么现在无疑是说‘是’的时候了。” “CEVA参加IIC的历史可以上溯到2004年。我们每一年的参展规模都比之前扩大一些,”
[焦点新闻]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved