打印

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

[复制链接]
9327|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是否就是一个**肋?

使用特权

评论回复
5
juanhao| | 2015-11-16 10:39 | 只看该作者
帖子还没完啊,到底如何判断读还是写呢?

使用特权

评论回复
6
maxingyu| | 2015-11-26 19:23 | 只看该作者
LZ 最近我也在做I2C从机,从机发送数据,数据一直在DR里发不出去这是为什么啊

使用特权

评论回复
7
区茗南| | 2016-12-14 16:19 | 只看该作者
maxingyu 发表于 2015-11-26 19:23
LZ 最近我也在做I2C从机,从机发送数据,数据一直在DR里发不出去这是为什么啊 ...

我也遇到同样问题!!!现在解决了么?怎么解决的呀?

使用特权

评论回复
8
区茗南| | 2016-12-14 17:51 | 只看该作者
我这边现在while(!I2C_CheckEvent(I2C1,I2C_EVENT_SLAVE_BYTE_TRANSMITTED)); 一直过不去。因为SR1里面的BTF始终不为1

使用特权

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

本版积分规则

177

主题

9320

帖子

24

粉丝