打印

问:STM32的I2C操作

[复制链接]
3666|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);
的位置,搞来搞去,问题依旧。


大侠出来指点一下塞~~~~~~~~~~~~~

使用特权

评论回复
5
phoenixmy| | 2008-7-13 20:31 | 只看该作者

ls用的是搜狗拼音

鉴定完毕

使用特权

评论回复
6
id001|  楼主 | 2008-7-14 11:19 | 只看该作者

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


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

使用特权

评论回复
7
id001|  楼主 | 2008-7-14 11:41 | 只看该作者

这个说明,是不是有错?


使用特权

评论回复
8
香水城| | 2008-7-14 11:49 | 只看该作者

没有错

为什么你认为有错呢?

使用特权

评论回复
9
id001|  楼主 | 2008-7-14 13:46 | 只看该作者

同样的提问要问你了

为什么你认为没有错呢?

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

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

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



使用特权

评论回复
10
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);

使用特权

评论回复
11
vigia| | 2008-7-14 15:41 | 只看该作者

ST公布的LIB最新版本是2.0.1

更新下吧。

使用特权

评论回复
12
winloop| | 2008-7-14 16:29 | 只看该作者

我已经更新了

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

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

35

主题

107

帖子

0

粉丝