基于Linux操作系统的ARM/DSP多机I2C通信设计方案 - 中国一卡通网
用户名密码 [免费注册] [找回密码] 推广技巧 发布求购 建商铺  发产品  会员体制比较  
 

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

来源:中国一卡通网  作者:中国一卡通收录  发布时间:2012-02-20 09:02:49  字体:[ ]

关键字:通信  嵌入式技术  DSP芯片  

摘   要:在高性能嵌入式控制系统中,运行嵌入式Linux操作系统的主机ARM和DSP实现主从控制的设计方案具有显着优势,并获得广泛运用。而实现ARM与DSP之间的可靠通信是其关键技术之一。本文以Samsung公司的ARM9芯片S3C2440和TI公司的DSP芯片TMS320F28015为例,分析了I2C通信接口的原理及特点,提出了基于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通过中断响应的方式实现数据接收和发送。

  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. 



  图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)。 

更多

新闻投稿合作邮箱:yktchina-admin@163.com    字体[ ] [收藏] [进入论坛]

推荐文章

论坛热帖