关于STM32的I2C从机模式下收到ADDR后如何判断读写位

[复制链接]
10398|7
 楼主| mohanwei 发表于 2011-10-17 16:04 | 显示全部楼层 |阅读模式
之前已用过的所有的I2C从机都能从识别7位ADDR后面的那个bit(1-读,0-写)……

但是现在用到STM32的I2C从机模式,发现收ADDR时,只告诉你ADDR发生了匹配,却没告诉你ADDR这7个bit以及最后的那个bit到底放到哪里了……
想想应该是DR寄存器吧,却在DR寄存器的描述后面找到一样:“注:在从模式下,地址不会被拷贝进数据寄存器DR;”
再看一下库的例程,不管是DMA还是中断方式,一但ADDR匹配,就要同时初始化接收和发送相关的缓冲区、变量……
搜了一下本版,这才发现STM32的I2C的奇特之处……我怀疑设计这个I2C模块的ST工程师脑袋肯定是被门夹过的:lol
香水城 发表于 2011-10-17 21:24 | 显示全部楼层
这个工程师的脑袋还是挺硬的,:lol
 楼主| mohanwei 发表于 2011-10-18 10:25 | 显示全部楼层
在“24.3.2 I2C从模式”找到一句:
在从模式下TRA位指示当前是处于接收器模式还是发送器模式。
继续搜“TRA”
在"24.6.7 状态寄存器2 (I2C_SR2)"寄存器描述里找到了R/W位的归处:
位2
TRA:发送/接收 (Transmitter/receiver)
0:接收到数据;
1:数据已发送;
在整个地址传输阶段的结尾,该位根据地址字节的R/W位来设定
在检测到停止条件(STOPF=1)、重复的起始条件或总线仲裁丢失(ARLO=1)后,或当PE=0时,硬件将其清除。
 楼主| mohanwei 发表于 2011-10-18 10:31 | 显示全部楼层
似乎中断后,读取SR1判断是从模式,接着读取SR2的TRA位就可以判断本次是写入还是读取了……但问题又来了,库例程中要求读取SR1后,需先设置好缓冲变量什么的(此时SCL时钟线自动被STM32从机拉住),再通过读取SR2来清除ADDR位(STM32从机就会自动释放SCL,通信继续)……

手册里也找到了相关的描述……那么TRA是否就是一个**肋?
juanhao 发表于 2015-11-16 10:39 | 显示全部楼层
帖子还没完啊,到底如何判断读还是写呢?
maxingyu 发表于 2015-11-26 19:23 | 显示全部楼层
LZ 最近我也在做I2C从机,从机发送数据,数据一直在DR里发不出去这是为什么啊
区茗南 发表于 2016-12-14 16:19 | 显示全部楼层
maxingyu 发表于 2015-11-26 19:23
LZ 最近我也在做I2C从机,从机发送数据,数据一直在DR里发不出去这是为什么啊 ...

我也遇到同样问题!!!现在解决了么?怎么解决的呀?
区茗南 发表于 2016-12-14 17:51 | 显示全部楼层
我这边现在while(!I2C_CheckEvent(I2C1,I2C_EVENT_SLAVE_BYTE_TRANSMITTED)); 一直过不去。因为SR1里面的BTF始终不为1
您需要登录后才可以回帖 登录 | 注册

本版积分规则

177

主题

9317

帖子

24

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