已经调试通过的stm32 I2C 中断方式程序

[复制链接]
14328|38
 楼主| shizaigaole 发表于 2010-7-15 17:22 | 显示全部楼层 |阅读模式
已经调试通过的stm32 I2C 中断方式程序,
感兴趣的可以研究参考一下,顺便帮挑挑毛病. IAR_STM32_I2C.rar (304.14 KB, 下载次数: 1554)

写0 - 128到AT24C01B全部空间,再读出来,比较通过,
亮PB14,PB15管脚LED灯。
ST_ARM 发表于 2010-7-16 09:49 | 显示全部楼层
I2C接口除非是每次数据量小,偶尔有一次通讯,用中断方式最合适。
香水城 发表于 2010-7-16 10:50 | 显示全部楼层
不知道对不对,但鼓励共享精神,赏裤子一条,:victory:
lixiaoxu2meng 发表于 2010-7-28 16:08 | 显示全部楼层
你好楼主 我用你调试通过的例子 用STM32f103ze  读写 24lc02  怎么不好用啊
lixiaoxu2meng 发表于 2010-7-28 16:14 | 显示全部楼层
能帮我分析一下吗 谢谢
 楼主| shizaigaole 发表于 2010-7-28 16:43 | 显示全部楼层
你的具体情况是啥样子?
 楼主| shizaigaole 发表于 2010-7-28 16:44 | 显示全部楼层
看看器件地址以及硬件写保护管脚是否对,
别再小问题上栽跟头
xsgy123 发表于 2010-7-28 23:22 | 显示全部楼层
很不错的例子,多谢楼主共享
lixiaoxu2meng 发表于 2010-7-29 08:01 | 显示全部楼层
没有问题啊  我用的是安富莱的开发板 芯片是 STM32103ze   pb6 和 pb7 接到了 24l02 上了 没有错啊  直接用你的例程  发现进入死循环了
lixiaoxu2meng 发表于 2010-7-29 08:05 | 显示全部楼层
你的程序 我没有改 就是直接用的  进入中断后


   case I2C_EVENT_MASTER_BYTE_RECEIVED:   //EV7
     i2cRevBuf[i2cRevCount++] = I2C_ReceiveData (I2C1);
     if(i2cRevCount == (i2cRevLen - 1))
     {
       I2C_AcknowledgeConfig(I2C1, DISABLE);
       I2C_GenerateSTOP(I2C1, ENABLE);
     }
     else if(i2cRevCount == i2cRevLen)//如果接收完毕
     {
       rdTaskState = 3;//   置位 接受完毕标志
     }


总是不执行       else if(i2cRevCount == i2cRevLen这条语句
 楼主| shizaigaole 发表于 2010-7-29 08:26 | 显示全部楼层
if(i2cRevCount == (i2cRevLen - 1))
     {
       I2C_AcknowledgeConfig(I2C1, DISABLE);
       I2C_GenerateSTOP(I2C1, ENABLE);
     }

能执行到吗?
 楼主| shizaigaole 发表于 2010-7-29 08:40 | 显示全部楼层
不行的话,
把                #define ClockSpeed              2000
改为             #define ClockSpeed              20000

把时钟改为20K试试。
lixiaoxu2meng 发表于 2010-7-29 09:19 | 显示全部楼层
啊 好的我试试
lixiaoxu2meng 发表于 2010-7-29 09:56 | 显示全部楼层
时钟我改了  我看了一下
if(i2cRevCount == (i2cRevLen - 1))
     {
       I2C_AcknowledgeConfig(I2C1, DISABLE);
       I2C_GenerateSTOP(I2C1, ENABLE);
     }
执行不到这个语句
 楼主| shizaigaole 发表于 2010-7-29 10:21 | 显示全部楼层
前面的
i2cRevBuf[i2cRevCount++] = I2C_ReceiveData (I2C1);
这条语句能执行到吗?
lixiaoxu2meng 发表于 2010-7-29 10:33 | 显示全部楼层
也执行不到 好像是 写好使3 读就不行 了

对了楼主  我编译你的程序是 有警告 应该没事吧
lixiaoxu2meng 发表于 2010-7-29 10:37 | 显示全部楼层
if(i2cSendCount < i2cSendLen)这条语句的警告

Warning[Pa082]: undefined behavior: the order of volatile accesses is undefined in this statement F:\STM32\IAR ARM Prj\IIC\stm32f10x_it.c 534

     if(i2cRevCount == (i2cRevLen - 1))这条语句的警告
Warning[Pa082]: undefined behavior: the order of volatile accesses is undefined in this statement F:\STM32\IAR ARM Prj\IIC\stm32f10x_it.c 571

   else if(i2cRevCount == i2cRevLen)这条语句的警告

Warning[Pa082]: undefined behavior: the order of volatile accesses is undefined in this statement F:\STM32\IAR ARM Prj\IIC\stm32f10x_it.c 576
lixiaoxu2meng 发表于 2010-7-29 10:42 | 显示全部楼层
/* Master Receiver -------------------------------------------------------*/
    case I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED:/* EV6 */

这个语句就是始终不执行 。


我看数据手册上写

根据送出从地址的最低位,主设备决定进入发送器模式还是进入接收器模式。
● 在7位地址模式时,
─ 要进入发送器模式,主设备发送从地址时置最低位为’0’。
─ 要进入接收器模式,主设备发送从地址时置最低位为’1’。


是这个的事吗  那也不对啊 你都调试成功了 没有理由啊 我什么也没改啊 楼主
 楼主| shizaigaole 发表于 2010-7-29 11:32 | 显示全部楼层
警告不会读写问题。
接收的时候已经自动改为1了,也不是这个问题。

你把接收之前的等待时间再延长一点试试。

过几天我买个24lc02试试,按说不应该会有问题
 楼主| shizaigaole 发表于 2010-7-29 11:36 | 显示全部楼层
你可以看看i2cEventGroup这个全局变量里面存储的I2C消息序列最终到哪一步,
判断哪一步除了问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则

146

主题

3741

帖子

11

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