TI系列DSP的I2C模块配置与应用
2006-07-12 来源:单片机及嵌入式系统应用
I2C总线最早是由Philips公司提出的串行通信接口规范,标准I2C总线只使用两条线通信,能将多个具有I2C接口的设备连接,进行可靠的通信,连接到同一总线的I2C器件数量,只受总线最大电容400pF的限制,而且最高通信速率可以达到3.4Mb/s,由于I2C接口简单,使用方便,被很多芯片采用,成为一种广泛应用的接口[1]。
DSP即数字信号处理器,是一种广泛应用的嵌入式处理器,主要应用是实时快速地实现各种数字信号处理算法,目前,国际主要的DSP供应商是TI公司,其TMS32系列产品占据了DSP市场近一半的份额,为了用户能方便快捷的进行系统的开发与集成,TI公司在一些型号的DSP中集成了I2C通信模块,本文以TMS320C6713为例,使用TI公司DSP开发工具CCS2.2提供的CSL(Chip Support Lib,片级支持库)配置I2C模块。
图像采集和处理是DSP应用的一个重要领域,本文结合作者开发的基于DSP的图像采集、处理系统、以CMOS图像采集芯片OV7620为例,介绍DSP芯片通过I2C模块对I2C设备进行配置的过程。
1 TI公司带I2C接口的DSP
在嵌入式系统开发过程中,如果处理器没有I2C接口而系统中又存在I2C器件时,通用的办法是利用处理器的两根引脚分别模拟SDA和SCL信号,并利用程序模拟接口,这种方法的通用性好,灵活可靠,但是移植性差,不同型号的处理器需要不同的程序,尽管在网上能够下载到这类程序的源代码,但是进行程序移植仍会浪费开发人员大量的时间,而且使得程序变得庞大,不易维护。
为了用户能方便快捷地进行系统的开发与集成,TI公司在一些型号的DSP中集成了I2C通信模块,例如TMS320C6713、TMS320C6416、TMS320C5509等。
TMS320C6713是一款高性能浮点DSP,内部集成2个I2C接口:I2C0和I2C1。其中,I2C1的引脚与McBSP1(Multichannel Buffered Serial Port 1,多通道缓存串口1)的引脚复用,默认情况下是激活McBSP1,使用I2C1必须将寄存器DEVCFG的最低位置1[2,3]。I2C模块的结构如图1所示。
I2CDXR是发送缓存,I2CXSR是发送移位寄存器。总线上的数据送到I2CDXR之后,被拷贝到I2CXSR,按位移出,送到SDA,先移出的位是最高位。I2CDRR与I2CRSR分别是接收缓存和接收移位寄存器,负责将SDA上的数据移入,合并成字节后,放到接收缓存,并将数据发送到数据总线。
I2C模块有5种状态会产生中断信号,作为中断源提供给DSP中断系统调用,这5种状态是:准确好发送数据、准确好接收数据、可以访问寄存器、主机没收到响应信号和总线仲裁失败。因为I2C模块能够提供中断信号,可以编制中断处理函数,中断中相应I2C事件,确保了响应的实时性。
I2C模拟还可以与EDMA(Enhanced Direct Memory Access,增强型内存直接访问)配合工作。当数据由I2CDXR拷贝到I2CXSR或由I2CRSR拷贝到I2CDRR时,都会触发EDMA操作,EDMA会发送下一个数据或读取收到的数据。由于EDMA操作不占用DSP处理时间,可以大大提高DSP的运算速度,避免流水线被不停的打断,因此,如果使用I2C模块与外设进行数据量比较大的数据交换,比如,将缓存中的大量数据保存到I2C接口的Flash中,可以使用EDMA操作,如果交换的数据量比较小,而对实时性比较高,比如,接收I2C接口传感器的采集数据,可以采用DSP中断的方式;如果交换的数据量比较小,对实时性要求又不高,比如,对I2C设备进行设置,则可以使用DSP查询状态位的方式,本文例程使用I2C模块配置OV7620,采用查询方式。
为使I2C模块正常工作,必须为其提供驱动时钟,在TMS320C6713中,I2C模块的时钟由系统时钟经分频得到,如图2所示。
外接时钟为DSP系统的外接时钟,本文设计的系统时钟频率为25MHz,PLL为系统的锁相环,先对外接时钟分频,再倍频,锁定时钟,然后按照不同的分频系数,分出三个时钟,供TMS320C6713使用,其中的一个输出到I2C模块,I2C模块先根据IPSC的值将时钟预分频,分频后的时钟供I2C模块使用,同时,根据ICCL与ICCH的值再将时钟分频,分别控制SCL的低电平与高电平周期,SCL的频率为
在配置I2C模块之前,必须配置PLL。TMS320C6713的I2C不支持高速模式,一般配置在标准模式下。
2 使用CSL配置I2C模块
对I2C模块的控制是通过操作控制/状态寄存器组实现的。TMS320C6713的寄存器映射到地址空间,可以通过地址操作直接读写寄存器,如
#define I2CMDR0 0x01B40024
*(volatile unsigned int *)I2CMDR0&=~0x20;
通过地址操作读写寄存器,语法简单,编译效率高,但是程序的可读性和可移植性差,不易维护。
在DSP应用系统中,一般会涉及到大量DSP器件,特别是片上外设的编程处理工作,在开发初期消耗了开发人员较多精力,TI公司在开发环境CCS中,提供了CSL。多数CSL模块都由对应的函数、宏、类和表示符号组成。可以简单方便地完成对DSP器件片上外设配置和控制的编程工作,从而简化DSP片上外设开发工作,缩短了开发周期,具有标准化控制和管理片上外设的能力,减少了DSP硬件特殊性对用户程序代码的影响,方便用户在不同器件间进行代码移植。但是使用CSL进行外设控制对用户代码执行效率可能会造成一些影响[4]。
本文先给出配置PLL的程序,再给出配置I2C模块的程序,因为DSP电路板的时钟并不相同,PLL配置程序并不具有很强的可移植性,同时为了提高编译、执行效率,配置PLL的程序采用直接地址操作的方式,寄存器的宏定义请参考相应的DSP数据手册。本例程参考了文献[2],DSP系统的外接时钟为25MHz。
注意,DSP系统的内部时钟大部分来自于PLL,PLL设置程序必须放在全部的最前面,只有对PLL配置成功,系统才能正常的工作。
提供时钟之后,可以对I2C模块进行配置。本文将I2C0配制成主机发送模式,工作频率为100kHz,非连续发送,7位地址。因为本程序是为配置OV7620作准备,所以并没有使用EDMA与DSP中断。
注意,I2C0在发送一个字节后,自动缓缓到主机接收模式,为了验证I2C0工作是否正常,可以将I2C0与I2C1环接。
本例程只提供配置I2C模块所需的头文件。
3 使用I2C模块配置OV7620
Omnivision公司推出的CMOS彩色图像传感器OV7620,最大分辨率为664×492,不但能工作在逐行扫描方式下,也能工作在隔行扫描方式下,可通过I2C总线配置片内寄存器,以使其输出RGB原始数据,本文设计的系统加电复位后,先由TMS320C6713产生I2C总线信号来对OV7620工作寄存器进行初始化,然后OV7620即可开始按要求输出图像信号,包括行同步信号HREF、场同步信号VSYNC、像素时钟信号PCLK和数字图像信号[5]。DSP通过EDMA接收原始图像数据,进行中值滤波,去掉噪声,再进行有关的图象处理,下面给出OV7620的初始化程序。
OV7620initial()函数的4个参数分别为CMOS感光区域起始点和区域范围,I2C_SetOV7620()为自定义的函数,通过I2C发送两个数据,第一个数据为OV7620的寄存器地址,第二个数据为寄存器内容。
4 结论
本文介绍了I2C总线规范,以TMS320C6713为例,说明TI一些DSP中I2C模块的结果及各部分的功能,介绍了如何配置DSP的PLL及系统时钟;给出了开发环境CCS中CSL的使用方法,对TMS320C6713的I2C模块进行了配置,对OV7620进行了配置。
上一篇:自动断电的CPLD