3942|7

69

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

请教香主,I2C外设的问题 [复制链接]

万利的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该如何操作了?
此帖出自stm32/stm8论坛

最新回复

                                 固件库中的函数很多地方没有处理异常情况,不适合于不了解I2C的工作原理的人使用。请使用另一个帖子中的函数操作,这个函数封装的比较好,处理了各种异常情况。 相关链接:https://bbs.eeworld.com.cn/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  详情 回复 发表于 2009-4-21 18:30
点赞 关注
 

回复
举报

71

帖子

0

TA的资源

一粒金砂(初级)

沙发
 

问题出在全速运行时

初步分析了一下,问题是全速运行时产生了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,否则会产生错误,是这样吗?
此帖出自stm32/stm8论坛
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

板凳
 

请香主帮忙给判断一下

                                  
此帖出自stm32/stm8论坛
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

4
 

能用Step Over方式调试

                                   STM32的I2C外设能用Step Over方式调试,我常常这么做。
此帖出自stm32/stm8论坛
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

5
 

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

                                 I2C一点都不好用,全是while()。 产品中我不敢这么用, 现在该用模拟的了,也不比它慢。
此帖出自stm32/stm8论坛
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

6
 

关中断也是一样的结果

                                 我在I2C1操作前加了关中断,程序退出前开中断,结果还是一样的。
此帖出自stm32/stm8论坛
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

7
 

香主不理我?

                                 不知道我的问题是否超出了香主的职权范围,都一直不理我,我真的很着急!!!
此帖出自stm32/stm8论坛
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

8
 

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

固件库中的函数很多地方没有处理异常情况,不适合于不了解I2C的工作原理的人使用。请使用另一个帖子中的函数操作,这个函数封装的比较好,处理了各种异常情况。
相关链接:https://bbs.eeworld.com.cn/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
此帖出自stm32/stm8论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表