打印

请教香主,I2C外设的问题

[复制链接]
2550|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhangxk|  楼主 | 2009-4-20 15:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
万利的EK-STM32F板子,MDK3.22a调试,下面这段程序:

/*----- Transmission Phase -----*/
/* While the bus is busy */
   while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));
/* Send I2C1 START condition */
   I2C_GenerateSTART(I2C1, ENABLE);
/* Test on I2C1 EV5 and clear it */
   while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
/* Send I2C2 slave Address for write */
   I2C_Send7bitAddress(I2C1, I2C_DataStruct->DeviceAddr, I2C_Direction_Transmitter);
/* Test on I2C1 EV6 and clear it */
   while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));

全速执行时程序在最后一行的while死循环了,于是我这样试了一下:全速执行到最后一行while(这一行还没执行,Run to Cursor line),查看SR1=0x0400,SR2=0x0003,出现了AF失败;又试了第二种结果,全速执行到I2C_GenerateSTART(I2C1, ENABLE);(这一行还没执行),查看SR1=SR2=0x0000,再全速执行到最后一行while(这一行还没被执行),查看SR1=0x0082,SR2=0x0007,值正常,是I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED定义的值,再用F10(Step Over)执行,程序进入了while死循环。

这都是ST官方的操作流程,现在有点不明白I2C该如何操作了?
沙发
zhangxk|  楼主 | 2009-4-20 15:21 | 只看该作者

问题出在全速运行时

初步分析了一下,问题是全速运行时产生了AF失败,是否那儿设置的不对,都是官方提供的示例代码,每一行都分析过了,应该没错的,速度设置为100K的。

I2C初始化部分:

/* I2C1 configuration */
   I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
   I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
   I2C_InitStructure.I2C_OwnAddress1 = I2C1_SLAVE_ADDRESS7;
   I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
   I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
   I2C_InitStructure.I2C_ClockSpeed = I2C1_SPEED;
   I2C_Init(I2C1, &I2C_InitStructure);

有看到说应该在主模式接收的时候可以设置ACK,否则会产生错误,是这样吗?

使用特权

评论回复
板凳
zhangxk|  楼主 | 2009-4-20 16:03 | 只看该作者

请香主帮忙给判断一下

使用特权

评论回复
地板
ijk| | 2009-4-20 17:05 | 只看该作者

能用Step Over方式调试

  STM32的I2C外设能用Step Over方式调试,我常常这么做。

使用特权

评论回复
5
刀疤老七| | 2009-4-20 17:18 | 只看该作者

不能在寄存器读写过程中停下

I2C一点都不好用,全是while()。 产品中我不敢这么用, 现在该用模拟的了,也不比它慢。

使用特权

评论回复
6
zhangxk|  楼主 | 2009-4-21 07:55 | 只看该作者

关中断也是一样的结果

我在I2C1操作前加了关中断,程序退出前开中断,结果还是一样的。

使用特权

评论回复
7
zhangxk|  楼主 | 2009-4-21 17:00 | 只看该作者

香主不理我?

不知道我的问题是否超出了香主的职权范围,都一直不理我,我真的很着急!!!

使用特权

评论回复
8
香水城| | 2009-4-21 18:30 | 只看该作者

因为你不了解I2C的工作原理,我没办法回答你的问题

固件库中的函数很多地方没有处理异常情况,不适合于不了解I2C的工作原理的人使用。请使用另一个帖子中的函数操作,这个函数封装的比较好,处理了各种异常情况。
相关链接:https://bbs.21ic.com/club/bbs/list.asp?boardid=49&page=1&t=3194196&tp=STM32%20I2C%20%u5C01%u88C5%u5E93%uFF08%u67E5%u8BE2%u65B9%u5F0F+29%u697C%u4E2D%u65AD%u65B9%u5F0F+32%u697CDMA%u65B9%u5F0F%uFF09

使用特权

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

本版积分规则

20

主题

69

帖子

1

粉丝