原创 STM32F10X的硬件I2C操作

2008-7-14 14:39 5704 10 12 分类: MCU/ 嵌入式

 


之前我是参考STM32的I2C例子Example 5来做I2C外设实验。

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

但调用读之后,再写、或再读就死机了。。


分析原因,应该是读操作时没能正确的结束I2C时序。


后来在DATASHEET中找到原因:


点击开大图


从上面可以看出,读操作时要正确的结束I2C时序,需要在接收最后一个字节前设置NACK及STOP。


即:


        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);


         


搞好STM32的I2C用了1天又6个小时,不容易啊~~~


呵呵

PARTNER CONTENT

文章评论2条评论)

登录后参与讨论

用户1492773 2009-10-21 11:23

不对吧 I2C_AcknowledgeConfig(I2C1,DISABLE); //读最后一个字节后产生NAK信号 I2C_GenerateSTOP(I2C1,ENABLE); //结束总线要放在这里!!!!!! while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_RECEIVED)); *s = I2C_ReceiveData(I2C1); //接收数据 不对吧 最后一个数据还没有读,你就把总线停了????

用户391779 2008-7-17 16:02

有什么技术问题还是直接问万利好,因为开发板是我们万利做的有些事情还是我们比较清楚点!欢迎加入STM32使用交流群:64047499,一起来讨论,遇到的技术问题也可以直接问我们的技术人员!
相关推荐阅读
用户134288 2008-07-04 20:00
当一个GPIO既作为输入又作为输出时该如何操作?
 可以在操作之前改变方向或把管脚配置成开漏输出。相对来说设置成开漏输出操作要简单些,不需要频繁的改变输入/输出方向,应注意设置成开漏输出时应该是:GPIO_Mode_AF_OD。而不是GPIO_Mod...
用户134288 2008-07-02 20:34
建立一个自己的STM32F10x工程模板
在STM32组长的帮助下终于建立了一个自己的STM32F10X工程模板。该工程模板具有以下特点:IAR工程文件、Library库文件、User用户代码完全分开。分别在三个文件夹下。该工程中的程序代码是...
用户134288 2008-06-13 13:59
模糊控制试验教学平台开发
STM32项目/学习计划表      项目名称                        模糊控制试验教学平台开发请点击以下链接更新您的个人资料(包括“职位,部门,单位名称,地址,邮编,电子邮箱,...
我要评论
2
10
关闭 站长推荐上一条 /3 下一条