原创 I2C存储器读写程序设计(四)

2009-10-31 15:42 4078 8 8 分类: MCU/ 嵌入式

https://static.assets-stash.eet-china.com/album/old-resources/2009/10/31/30d8fa8a-a9ed-4b21-bfb4-11afc9066fed.rar  该程序已实现8个命令,最新命令为i2cwr,i2crd,写入7个字节以下可以成功操作。


一、程序调试过程<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


1、时序问题


       刚开始写的程序知识着重于<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />24c02读写的时序:比如写多个字节的时候:


   I2C_Ack (0);               //接收一个字节后,发送确认信号


   I2C_Start();                                      //开启I2C总线传输。


   I2C_SendAdd ( 0xA0 );                //发送控制字,传输方向写


   I2C_SendDat ( AddIndex );          //数据在存储器写初始位置


   for ( i="0"; i<CharCount; i++ )


      {


           I2C_SendDat ( CharBuf );     //传输数据


         }


   I2C_Stop();


 


读多个字节的时候:


   I2C_Start();


   I2C_SendAdd ( 0xA0 );


   I2C_SendDat ( AddIndex );


    I2C_Start();    


   I2C_SendAdd ( 0xA1 );             //发送控制字,传输方向读


   I2C_Ack (0);               //接收一个字节后,发送确认信号


   for ( i="0"; i<CharCount-1; i++ )


      {


           TempChar = I2C_ReceiveDat ( );


              CharBuf= TempChar &0x7F;


         }


   I2C_Ack (1);                         //接收最后一个字节后,发送不确认信号


   TempChar = I2C_ReceiveDat ( );


   CharBuf[CharCount-1] =TempChar &0x7F;


   I2C_Stop();                           //然后停止总线


 


但是对I2C总线本身操作的时序掌握得不够,结果对于24c02的写入和读入操作都没有成功。


 


2stm32 i2c总线操作时序。


1)工作于主模式,7位地址:I2C1->CR2=0x24这是指明外围总线速率36MHz  I2C_InitStructure.I2C_ClockSpeed = 66666 ,由于库编译的时候是以8MHz作为晶振频率,故与实际系统有1.5倍的偏差,设置100K速率的时候,实际给定值只有66666


 


2)利用库函数产生起始条件,SB位置位,紧接着要读取SR1,并且伴随一次数据写入


 


3)若地址末尾为0,是主发送模式,地址写入后,ADDR会置位,这时候应该要顺序读取SR1SR2------然后再将数据写到数据寄存器,发送完成后若收到了对方的ACKTXE置位,,若没有新的数据写入BTF会置位。


4)若地址末位为1,是主接收模式,地址写入后,ADDR会置位,这时候应该要顺序读取SR1SR2------然后等待RXNE置位、或BTF置位,读取数据寄存器。通过对ACK信号的掌控,可以接受多个字节。


 


二、新的问题发现


1、经过一番摆弄,终于可以写入数据和读出了,但是出现一个新的问题,好像24c02的容量只有八个字节似地,出现了这种现象:


点击看大图


<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />


输入8个字节,好像又回到了开头。


 


2、断点测试。没有找到问题比如写入123456789,断点调试中第一个接收到的就是9


 


3、再读一篇24c02的数据文档。应该是256个字节啊。


 


4、从01地址写,好像写不进去;地址超过8,写入也没有效果。


 


5、折腾半天,没有发现问题所在。I2C的学习就到这里吧,现在对总线操作时序还是比较熟悉了。

文章评论0条评论)

登录后参与讨论
我要评论
0
8
关闭 站长推荐上一条 /2 下一条