STM32 可以同时支持Master以及Slave mode。
通常我们I2C如果作为slave设备的时候,如果主机是Linux系统,我们往往先通过i2ctools进行设备的扫描,检测下设备是否存在。命令如下:
#i2cdetect -y -r i2c-id
如果能正确的发现设备,比如我们发现设备为0x17。这时候我们就可以通过0x17跟i2c slave进行通信了。比如我们可以通过以下命令查看这个设备的全部寄存器值。
#i2cdump -y -f 1 0x17
那么进一步思考,我们就会想为什么我们知道slave address是0x17,或者说为什么能通过0x17跟设备进行通信呢?
下面我们就来一点一点的揭开谜底。
我们随便打开一个介绍I2C的文档都是这么描述的,在I2C开始之后,先发送7bit的数据,然后一个读写位,如果设备slave address匹配成功,则会在第九个clock接收到ACK。

也就是说,在上面我们在Linux系统下其实只传递了前面7bit的数据,并没有添加读写位。而这个读写位是我们在调用读、写函数的时候,函数完成了对这个数据位的填充(此处需要注意,在单片机中,没有完成对这个第7位数据的填充功能,因此需要自己将这个slave address转换成函数能够正确传递的值,一般为slave address<<1)。
而当我们传递了slave address之后,数据到底是怎么被slave设备识别并且回复一个ACK的呢?
首先我们看一下STM32 I2C部分寄存器的定义:

这里我们需要对照源码来看一下这个地方的赋值情况。
h
STM32 I2C Slave模式解析

本文深入探讨了STM32在I2C Slave模式下的工作原理,特别是如何通过Linux系统的i2ctools进行设备扫描和通信,以及STM32内部寄存器配置的细节,解释了7bit和10bit地址模式的区别。
最低0.47元/天 解锁文章
844

被折叠的 条评论
为什么被折叠?



