《DSP精选I精选C接口应用.doc》由会员分享,可在线阅读,更多相关《DSP精选I精选C接口应用.doc(2页珍藏版)》请在三一文库上搜索。
1、DSPI2C应用说明1. 示例程序中几种状态第一次看 i2c_eeprom 示例程序,对程序中的MsgStatus 信息状态切换非常懵懂,为什么要有这几个状态?状态切换顺序如何安排?一大堆的状态,让人有些摸不着头脑。 先把程序中的头文件涉及的 7 种状态分析一下。程序说明及流程图详细的注释可以参见程序附录, ,这里主要解释一下设备地址取0x50的缘由。从AT24C1024的数据手册可知,设备地址为。而在程序中设置的地址是 0x50,即0B01010000。看似不妥, 其实,这个例子中设备地址采用 7位地址模式,这样只取 0x50的低 7位作为设备地址的高七位, 设备地址的最低位 R/W则由寄存
2、器 I2CMDR中的TRX位决定。这样读数据时设备地址为 0B,写数据时设备地址改为 0B。通过示波器可以验证这些数据。问题 1:每次检测到SCD中断时,也就是顺利发完指定数量的数据或者接收指定数量的数据了,理论上=0,但是本人设了几个中断点去观察该寄存器的值,发现总是不为零。通过观察和,可以发现这两个寄存器为零时,也不为零。由此可知, I2CCNT不能实时反映发送/ 接收存储器中数据的数量,不过可以用 TXFFST/RXFFST来代替。图 1 主程序流程图 , 图 2 为写数据程序流程图,图 3 为读数据程序流程图,图 4 为中断函数流程图。图 1 主程序流程图图 2 写数据程序流程图图 3
3、 读数据程序流程图图 4 中断函数流程图4. 程序附录voidI2CA_Init(void);Uint16I2CA_WriteData(structI2CMSG*msg);Uint16I2CA_ReadData(structI2CMSG*msg);interruptvoidi2c_int1a_isr(void);voidpass(void);voidfail(void);#defineI2C_SLAVE_ADDR0x50InitSysCtrl();InitPieVectTable();EALLOW; if=I2C_MSGSTAT_SEND_WITHSTOP)Write_load_num+;Er
4、ror=I2CA_WriteData(&I2cMsgOut1);/ 更新作为中断服务路径的指针CurrentMsgPtr。/ 文件中找到ICINTR1A_ISR 。if(Error=I2C_SUCCESS)if=I2C_MSGSTAT_INACTIVE)if=I2C_MSGSTAT_SEND_NOSTOP)Read_load_num1+;/EEPROM空闲了,并返回ACK确认为止。/msg 状态在中断程序中被更新了。elseif=I2C_MSGSTAT_RESTART)if=1)returnI2C_STP_NOT_READY_ERROR;if=1)returnI2C_STP_NOT_READY_ERROR;=msg-SlaveAddress;if(msg-MsgStatus=I2C_MSGSTAT_SEND_NOSTOP)if(CurrentMsgPtr-MsgStatus=I2C_MSGSTAT_SEND_NOSTOP_BUSY)elseif(CurrentMsgPtr-MsgStatus=I2C_MSGSTAT_READ_BUSY)/=