打印

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

[复制链接]
12516|38
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
shizaigaole|  楼主 | 2010-7-15 17:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
已经调试通过的stm32 I2C 中断方式程序,
感兴趣的可以研究参考一下,顺便帮挑挑毛病. IAR_STM32_I2C.rar (304.14 KB)

写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  怎么不好用啊

使用特权

评论回复
5
lixiaoxu2meng| | 2010-7-28 16:14 | 只看该作者
能帮我分析一下吗 谢谢

使用特权

评论回复
6
shizaigaole|  楼主 | 2010-7-28 16:43 | 只看该作者
你的具体情况是啥样子?

使用特权

评论回复
7
shizaigaole|  楼主 | 2010-7-28 16:44 | 只看该作者
看看器件地址以及硬件写保护管脚是否对,
别再小问题上栽跟头

使用特权

评论回复
8
xsgy123| | 2010-7-28 23:22 | 只看该作者
很不错的例子,多谢楼主共享

使用特权

评论回复
9
lixiaoxu2meng| | 2010-7-29 08:01 | 只看该作者
没有问题啊  我用的是安富莱的开发板 芯片是 STM32103ze   pb6 和 pb7 接到了 24l02 上了 没有错啊  直接用你的例程  发现进入死循环了

使用特权

评论回复
10
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这条语句

使用特权

评论回复
11
shizaigaole|  楼主 | 2010-7-29 08:26 | 只看该作者
if(i2cRevCount == (i2cRevLen - 1))
     {
       I2C_AcknowledgeConfig(I2C1, DISABLE);
       I2C_GenerateSTOP(I2C1, ENABLE);
     }

能执行到吗?

使用特权

评论回复
12
shizaigaole|  楼主 | 2010-7-29 08:40 | 只看该作者
不行的话,
把                #define ClockSpeed              2000
改为             #define ClockSpeed              20000

把时钟改为20K试试。

使用特权

评论回复
13
lixiaoxu2meng| | 2010-7-29 09:19 | 只看该作者
啊 好的我试试

使用特权

评论回复
14
lixiaoxu2meng| | 2010-7-29 09:56 | 只看该作者
时钟我改了  我看了一下
if(i2cRevCount == (i2cRevLen - 1))
     {
       I2C_AcknowledgeConfig(I2C1, DISABLE);
       I2C_GenerateSTOP(I2C1, ENABLE);
     }
执行不到这个语句

使用特权

评论回复
15
shizaigaole|  楼主 | 2010-7-29 10:21 | 只看该作者
前面的
i2cRevBuf[i2cRevCount++] = I2C_ReceiveData (I2C1);
这条语句能执行到吗?

使用特权

评论回复
16
lixiaoxu2meng| | 2010-7-29 10:33 | 只看该作者
也执行不到 好像是 写好使3 读就不行 了

对了楼主  我编译你的程序是 有警告 应该没事吧

使用特权

评论回复
17
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

使用特权

评论回复
18
lixiaoxu2meng| | 2010-7-29 10:42 | 只看该作者
/* Master Receiver -------------------------------------------------------*/
    case I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED:/* EV6 */

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


我看数据手册上写

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


是这个的事吗  那也不对啊 你都调试成功了 没有理由啊 我什么也没改啊 楼主

使用特权

评论回复
19
shizaigaole|  楼主 | 2010-7-29 11:32 | 只看该作者
警告不会读写问题。
接收的时候已经自动改为1了,也不是这个问题。

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

过几天我买个24lc02试试,按说不应该会有问题

使用特权

评论回复
20
shizaigaole|  楼主 | 2010-7-29 11:36 | 只看该作者
你可以看看i2cEventGroup这个全局变量里面存储的I2C消息序列最终到哪一步,
判断哪一步除了问题

使用特权

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

本版积分规则

146

主题

3735

帖子

11

粉丝