你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F030的I2C发送数据疑惑 求解答 谢谢

[复制链接]
三创电子(Tcreate) 提问时间:2014-2-13 21:55 /
最近在调试STM32F030单片机的I2C总线,现在虽然参考官方实例调试成功了 但是有一些地方还不是很明白,暂时也未看懂,希望知道的大神可以赐教 小弟先谢过了!

void I2C_uWriteData(INT8U SlaveAddr,INT16U WriteAddr,INT8U WriteLen,INT8U *WriteBuf)
{
 INT8U i;

 while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY));
 I2C_TransferHandling(I2C1,SlaveAddr,2,I2C_Reload_Mode,I2C_Generate_Start_Write);   // I2C_SoftEnd_Mode
 while(I2C_GetFlagStatus(I2C1,I2C_FLAG_TXIS) == RESET);
 I2C_SendData(I2C1,WriteAddr >> 8);
 while(I2C_GetFlagStatus(I2C1,I2C_FLAG_TXIS) == RESET);
 I2C_SendData(I2C1,WriteAddr % 256);
 while(I2C_GetFlagStatus(I2C1,I2C_FLAG_TCR) == RESET);
 I2C_TransferHandling(I2C1,SlaveAddr,WriteLen,I2C_AutoEnd_Mode,I2C_No_StartStop);   // I2C_Generate_Start_Write
 for(i=0;i
<
收藏 2 评论21 发布时间:2014-2-13 21:55

举报

21个回答
回答时间:2014-2-15 17:34:02

回复:STM32F030的I2C发送数据疑惑 求解答 谢谢

这里的I2C_SoftEnd_Mode 是在地址数据发送以后产生一个restart信号,以表示用来读取E2的数据。而在写模式下,不用产生这个restart信号。
开始我理解的是发送一个NOACK,用来控制I2C总线停止工作做。通过手册,这里控制的是restart信号,可以参考下图中restart产生的信号位置。
1.jpg
三创电子(Tcreate) 回答时间:2014-2-13 22:04:18

RE:STM32F030的I2C发送数据疑惑 求解答 谢谢

自己先顶一个 期待高人指教呀
回答时间:2014-2-14 09:55:27

RE:STM32F030的I2C发送数据疑惑 求解答 谢谢

这个过程就是要看I2C协议了。I2C协议规定,首先要先通过设备地址访问设备,然后告诉设备是读还是写状态,然后再进行读写,读写完毕后发送一个结束命令。如果你上述红色字体修改,第一个命令就是结束了。
三创电子(Tcreate) 回答时间:2014-2-14 10:24:50

回复:STM32F030的I2C发送数据疑惑 求解答 谢谢

回复第 3 楼 于2014-02-14 09:55:27发表:
这个过程就是要看I2C协议了。I2C协议规定,首先要先通过设备地址访问设备,然后告诉设备是读还是写状态,然后再进行读写,读写完毕后发送一个结束命令。如果你上述红色字体修改,第一个命令就是结束了。 

红色标注的是可以实现操作的,蓝色标注的无法成功
这是可以实现读数据的代码 相比之下,写操作的配置我就看不明白了

void I2C_uReadData(INT8U SlaveAddr,INT16U ReadAddr,INT8U ReadLen,INT8U *ReadBuf)
{
 INT8U i;
 
 // 等待总线空闲
 while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY));
 I2C_TransferHandling(I2C1,SlaveAddr,2,I2C_SoftEnd_Mode,I2C_Generate_Start_Write);
 while(I2C_GetFlagStatus(I2C1,I2C_FLAG_TXIS) == RESET);
 I2C_SendData(I2C1,ReadAddr &gt;&gt; 8);
 while(I2C_GetFlagStatus(I2C1,I2C_FLAG_TXIS) == RESET);
 I2C_SendData(I2C1,ReadAddr % 256);
 while(I2C_GetFlagStatus(I2C1,I2C_FLAG_TC) == RESET);
 I2C_TransferHandling(I2C1,SlaveAddr,ReadLen,I2C_AutoEnd_Mode,I2C_Generate_Start_Read);
 for(i=0;i
回答时间:2014-2-14 11:01:01

RE:STM32F030的I2C发送数据疑惑 求解答 谢谢

我说的意思就是换成蓝色的,就是停止了。对于I2C操作不理解,建议看一下I2C协议,里面详细描述了I2C如何读写。
三创电子(Tcreate) 回答时间:2014-2-14 14:21:39

回复:STM32F030的I2C发送数据疑惑 求解答 谢谢

我就是不理解蓝色的配置怎么会导致停止呢
三创电子(Tcreate) 回答时间:2014-2-14 14:22:37

回复:STM32F030的I2C发送数据疑惑 求解答 谢谢

回复第 5 楼 于2014-02-14 11:01:01发表:
我说的意思就是换成蓝色的,就是停止了。对于I2C操作不理解,建议看一下I2C协议,里面详细描述了I2C如何读写。 

我就是不怎么理解蓝色的配置怎么会导致I2C停止了
回答时间:2014-2-14 14:50:48

RE:STM32F030的I2C发送数据疑惑 求解答 谢谢

I2C_SoftEnd_Mode,这个就是进入结束模式。如果需要从设备继续工作,就要重新连接,你I2C基础不好。建议还是看看协议吧。
三创电子(Tcreate) 回答时间:2014-2-14 16:10:41

回复:STM32F030的I2C发送数据疑惑 求解答 谢谢

回复第 8 楼 于2014-02-14 14:50:48发表:
I2C_SoftEnd_Mode,这个就是进入结束模式。如果需要从设备继续工作,就要重新连接,你I2C基础不好。建议还是看看协议吧。 

那读数据的配置也是I2C_SoftEnd_Mode呀,而且个人理解I2C_SoftEnd_Mode配置的意思是 有软件具体操作来发送停止位吧(又自动发送停止位)
回答时间:2014-2-15 08:54:04

RE:STM32F030的I2C发送数据疑惑 求解答 谢谢

I2C_SoftEnd_Mode,说明要发送停止位了。这个只是一个定义,为了方便大家理解这个标志位用来做什么。
123下一页

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版