单片机入门---I2C通信

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

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
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值