基于嵌入式Linux的ARM/DSP多机I2C通信(2)
- UID
- 1029342
- 性别
- 男
|
基于嵌入式Linux的ARM/DSP多机I2C通信(2)
2 ARM和DSP通信软件设计
运行Linux操作系统的ARM微控制器作为主控制器,在数据管理及多任务调度等方面有显著优势,可以很好地组织外围器件采集的数据;主要实现对系统的整体控制,并通过总线设备驱动程序控制I2C总线模块,通过主机寻址实现向I2C总线上挂载的下层DSP的数据收发。为保证数据通信的实时性,F28015通过中断响应的方式实现数据接收和发送。
2.1 ARM9平台的嵌入式Linux的I2C总线驱动设计
2.1.1 I2C总线读写时序
ARM9微控制器作为主机向从机DSP写数据,首先向从机发送启动信号,然后发送7位从机地址和1位写标志位,再等待从机的应答信号。在收到应答信号后,主机发送数据给从机,再次等待应答信号。当主机收到应答信号之后再次发送数据。之后,主机等待从机的应答信号,如此直到数据发送完成,主机发送停止信号。I2C总线写数据帧格式如图3所示。
主模式下读数据,是指每次从指定的位置读取一个或多个字节数据。主机首先向从机发送启动信号,然后发送7位从机地址和1位读标志位,等待从机应答。当收到从机的应答信号后,主机准备接收从机发送的数据,接收完成后发送一个应答信号,如此直到数据接收完成,主机发送一个停止信号。图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总线框架的相关函数实现设备的注册,并为用户提供上层应用程序编程接口。
Linux的I2C总线驱动框架中的主要数据结构包括:i2c_driver、i2c_client、i2c_adapter和i2c_algorithm,它们被定义在内核中的i2c.h头文件中。i2c_adapter对应于物理上的一个适配器,而i2c_algorithm对应一套通信方法,用来为适配器提供通信函数。i2c_algori thm中的关键函数master_xfei()用于产生I2C总线访问周期需要的信号,以i2c_msg(即I2C总线消息)为单位。该结构体原型如下:
i2c_driver对应一套驱动方法,是用于辅助作用的数据结构。i2c_client对应于真实的物理设备,每个I2C总线设备都需要一个i2c_clie nt来描述。i2c_adapter和i2c_client的关系与I2C总线硬件体系中适配器和设备关系一致,即i2c_client依附于i2c_adapter。 |
|
|
|
|
|