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的写入和读入操作都没有成功。
2、stm32 i2c总线操作时序。
(1)工作于主模式,7位地址:I2C1->CR2=0x24这是指明外围总线速率36MHz。 I2C_InitStructure.I2C_ClockSpeed = 66666 ,由于库编译的时候是以8MHz作为晶振频率,故与实际系统有1.5倍的偏差,设置100K速率的时候,实际给定值只有66666。
(2)利用库函数产生起始条件,SB位置位,紧接着要读取SR1,并且伴随一次数据写入。
(3)若地址末尾为0,是主发送模式,地址写入后,ADDR会置位,这时候应该要顺序读取SR1和SR2。------然后再将数据写到数据寄存器,发送完成后若收到了对方的ACK,TXE置位,,若没有新的数据写入BTF会置位。
(4)若地址末位为1,是主接收模式,地址写入后,ADDR会置位,这时候应该要顺序读取SR1和SR2。------然后等待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条评论)
登录后参与讨论