问:STM32的I2C操作

[复制链接]
4860|11
 楼主| id001 发表于 2008-7-13 19:47 | 显示全部楼层 |阅读模式

用STM32的硬件I2C读写24C02,用的是万利的板。

运到的问题是:

我每调用一次读24C02的函数后,以后再发读或写I2C的库函数都会造成死机。
即再调用:
  I2C_GenerateSTART(I2C1, ENABLE);
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); //这出不来了。

我自己分析是我的读操作函数没能正确的结束I2C时序。我的读24C02函数最后部分代码是:
     for(i=0;i<no-1;i++)
        {   
           while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED));
           *s = I2C_ReceiveData(I2C1);      //接收数据
            s++;                            //接收数据地址调整
        }  

        I2C_AcknowledgeConfig(I2C1,DISABLE); //读最后一个字节后产生NAK信号
        
       while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_RECEIVED));
     *s = I2C_ReceiveData(I2C1);         //接收数据
        
        I2C_GenerateSTOP(I2C1,ENABLE);     //结束总线
        
        I2C_AcknowledgeConfig(I2C1,ENABLE); //为下次读写准备ACK
         
        return(1);

请大家看看
 楼主| id001 发表于 2008-7-13 19:57 | 显示全部楼层

补充一下:


我是参考STM32的I2C例子Example 5来写的。

Example 5例子中对24C02写了一次,再读了一次就结束了。

我写的代码写一次,读一次程序也运行正常。

但调用读之后,再写、或再读就死机了。。
ESTM32 发表于 2008-7-13 20:20 | 显示全部楼层

同病相怜!

我也遇到过,请高手及香主给回答一下,不要打击我对STM32的兴趣和我的自信心呀
 楼主| id001 发表于 2008-7-13 20:27 | 显示全部楼层

3楼:我晕~~~~~~~~~~~~~

不要“ 同病相怜”哦~~~~~~~~~~~~~~~~

有啥也别有病哦~~~~~~~~~~~~~~~

(*^__^*) 嘻嘻……


我的分析:

我自己觉得是没有能正确的结束I2C时序。

第一次读的数据结果正确,可能是在读取最后一个字节时候,STM32没有能发送正确的NAK信号,使24C02那边没有释放SDA、SCL。

我调整
        I2C_AcknowledgeConfig(I2C1, DISABLE);
的位置,搞来搞去,问题依旧。


大侠出来指点一下塞~~~~~~~~~~~~~
phoenixmy 发表于 2008-7-13 20:31 | 显示全部楼层

ls用的是搜狗拼音

鉴定完毕
 楼主| id001 发表于 2008-7-14 11:19 | 显示全部楼层

朋友们支持下~~~~~~~


搞好了的出来支援一下啊~~~~~~~~~~~~`

 楼主| id001 发表于 2008-7-14 11:41 | 显示全部楼层

这个说明,是不是有错?


香水城 发表于 2008-7-14 11:49 | 显示全部楼层

没有错

为什么你认为有错呢?
 楼主| id001 发表于 2008-7-14 13:46 | 显示全部楼层

同样的提问要问你了

为什么你认为没有错呢?

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

果然没错!! 还是香~~NB!!

那是你们的Example有错,所以说质量不咋的嘛!



 楼主| id001 发表于 2008-7-14 14:28 | 显示全部楼层

最后这里总结一下,方便后来的兄弟伙:



        I2C_AcknowledgeConfig(I2C1,DISABLE); //读最后一个字节后产生NAK信号
               I2C_GenerateSTOP(I2C1,ENABLE); //结束总线要放在这里!!!!!!!!! 
       while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_RECEIVED));
     *s = I2C_ReceiveData(I2C1);         //接收数据
        

        
        I2C_AcknowledgeConfig(I2C1,ENABLE); //为下次读写准备ACK
         
        return(1);
vigia 发表于 2008-7-14 15:41 | 显示全部楼层

ST公布的LIB最新版本是2.0.1

更新下吧。
winloop 发表于 2008-7-14 16:29 | 显示全部楼层

我已经更新了

用2.0.1的例子在EK-STM32F上跑了下,准备访问24C02,但是无论读写都死机,发现死在
I2C_Send7bitAddress(I2C1, EEPROM_ADDRESS, I2C_Direction_Transmitter);
一直在查询忙状态,我怀疑是不是上次启动总线之后状态位没有清掉?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

35

主题

107

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部