1.与EEPROM通信
工程中常常需外扩非易失存储器,用来保存系统运行或断电时的参数。本例基于eZdsp板,使用DSP的I2C模块实现与支持I2C协议的EEPROM的通信。
本程序功能描述:使用GPIO32作为I2C的SDA功能引脚,使用GPIO33作为I2C的SCL功能引脚。eZdsp板上连接的EEPROM器件为24WC256,存储空间为256KB,即32K字节,其支持按页写入,每页为64字节空间。eZdsp板上的电路图如图7-53所示。
图7-53 eZdsp板上电路图
其中,数据线SDA、时钟线SCL通过电阻上拉至3.3V,写保护WP控制信号I2C_ROM_WP及地址A1控制信号分别由eZdsp板上拨码开关SW2中的5、6控制。在此,将SW2中的5、6开关拨向ON状态,允许DSP向24WC256写入数据,并且其地址A1为0。根据手册描述,24WC256芯片的从器件地址格式如图7-54所示,所以这样配置下24WC256的从器件地址为0x50再加上一位读写位。
图7-54 24WC256从器件地址格式
图7-55 24WC256按页写时序
对24WC256按页写的时序图如图7-55所示,主机先发送24WC256的从机地址(读写位为0,表示随后要向从机写入),之后发送16位字节地址(表示从哪个存储空间开始写,因为空间为32K,2^15,所以最高位无效),然后主机即向从机发送需要写入的数据。这里需要注意的是,只有同处于一页的存储空间,才能一次性按页写入,页空间大小为64,所以一次最多可连续写入64个存储空间。对于不处于同一页的空间,则需要重新向从机发送写时序(从机地址、需要写入数据的存储空间的字节地址)。
24WC256读指定地址空间内容的时序如图7-56所示。主机先发送24WC256的从机地址(读写位为0,表示随后要向从机写入字节地址),之后发送16位字节地址(表示从哪个存储空间开始读取,因为空间为32K,215,所以最高位无效),然后主机重新向24WC256发送从机地址(读写位为1,表示随后要向从机读取内容),最后从机将数据输出给主机,当从机输出完一个8位数据后,若主机予以应答,则表示主机将继续读取下一空间的内容,从机也将予以准备;若主机不予以应答,且主机产生停止信号,则读取过程结束。
图7-56 24WC256读取指定地址处内容时序
在配置程序中,需要注意以下几点:
1)从器件地址寄存器(I2CSAR)赋值为0x50,即不包含读写位。I2C模块将根据发送/接收操作模式(TRX位决定)自动补上的信息。
2)从图7-56可看出,当主机发送完字节地址后,其后并没有停止信号,因为读操作还未完成。整个读操作需要向从机写入两次从机地址,一次为0,表示随后写入字节地址;一次为1,表示读取从机内容。
本程序来源于TI官网V131中i2c_eeprom例程,编者对程序进行了简化改编,以方便读者阅读,程序流程图如图7-57所示。
图7-57 I2C例程(与EEPROM通信)主程序流程图
源程序如下:
(www.xing528.com)
运行程序,测试通过后会在消息窗口打印出“I2Ca test passed…”,且程序暂停。在该程序中,如果编译时出现警告“creating output section.cio without SECTIONS specification”是因为使用了stdio.h库文件中的printf函数,可在cmd的SECTIONS中添加“.cio:>RAML0,PAGE=0”来消除该警告。
2.与ADC模块通信
有些外部ADC模块也支持I2C接口协议,在此,以ADS1112型号ADC模块为例,介绍DSP通过I2C接口与外部ADC模块通信。
ADS1112为16位ADC模块,其与DSP的硬件连接原理图如图7-58所示。DSP的I2C总线分别经电阻上拉后,接至ADS1112相应的端口。
图7-58 I2C例程(与ADC模块通信)硬件原理图
ADS1112的写、读操作时序图分别如图7-59、图7-60所示。图中,从机地址的A2为0,A1和A0由硬件电路决定。本例中,A1、A2均接地,因此ADS1112的从机地址为0x48再加上读/写位。
图7-59 ADS112写时序图
图7-60 ADS1112读时序图
写操作时,DSP先向ADS1112发送从机地址(R/W为0,表示写),待ADS1112应答后,DSP再发送8位控制命令字。其中,若向位写1,则表示启动A-D转换。
对于读操作,DSP先发送从机地址(为1,表示读),待ADS1112应答后,ADS1112将开始输出数据,先输出A-D转换结果的高8位,待DSP应答后,ADS1112继续输出A-D转换结果的低8位;若DSP继续应答,则表示DSP将继续读取寄存器内容,ADS1112随后将输出控制寄存器的内容。其中,若读取为0,则表示此次读取的A-D转换结果为新的值,还未被读取过;若读取为1,则表示读取的A-D转换结果为旧的值,即新的A-D转换还未完成。
与上例相同,无论读/写操作,写入到I2CSAR中的值均为0x48,I2C模块将根据发送/接收操作模式(TRX位决定)自动补上R/W的信息。
本程序由编者编写,程序流程图如图7-61所示。
图7-61 I2C例程(与ADC模块通信)主程序流程图
源程序如下:
这里,需要注意的是,在发送数据时,当将数据写入到I2CDXR时,并不意味着数据已经发送出去,写缓冲中的数据是随着时钟一位一位从数据引脚移出,可以通过查看I2CMD中的STP位来检查通信是否结束。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。