IIC(I2C)通讯

IIC(Inter-Integrated Circuit)集成电路总线是飞利浦公司开发的一种两线式、串行、半双工同步通信二线,可以挂载多个参与通信的器件,每个器件都有自己的地址,常用于板内通信,比如单片机与外围芯片之间短距离、低速的信号传输。

IIC协议一般使用2条信号线通信 分别为数据线SDA、时钟线SCL,发送一个字节是以高位先发送原则(MSB)
我们这里以主机的视角来阐述过程
1、空闲状态:SCL:高、SDA:高
2、起始位:SDA从高变低的下降沿为起始位,SCL不变
3、地址位(发送将要通讯的设备地址):SCL的每次高电平时记录一次SDA的电平,所以得注意此时数据线的信号得稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化,即数据在时钟线SCL的上升沿到来之前就需准备好。并在下降沿到来之前必须稳定,确保SCL在整个高电平周期中SDA的电平始终不变。一共发送7位;
4、读写位(方向位):选择接收数据还是发送数据,低电平0表示要发送数据,高电平1表示请求接收数据,大多数从设备的地址是7位的,然后协议规定再给地址添加一个最低位用来表示接下来数据传输的方向,即读写位。
5、应答信号:发送器每发送一个字节(8个bit),就在时钟脉冲9期间释放数据线,由接收器反馈一个应答信号。
应答信号为低电平0时,规定为有效应答位(ACK,简称应答位),表示接收器已经成功地接收了该字节;
应答信号为高电平1时,规定为非应答位(NACK),一般表示接收器接收该字节没有成功。
6、数据位:与地址位相同,只不过发送的是八位数据
7、停止位:先将SCL拉高,SDA从低到高的上升沿为停止位

对于反馈有效应答位ACK的要求是:
接收器在第9个时钟脉冲之前的低电平期间将数据线SDA拉低,并且确保在该时钟的高电平期间为稳定的低电平。 如果接收器是主控器,则在它收到最后一个字节后,发送一个NACK信号,以通知被控发送器结束数据发送,并释放数据线SDA,以便主控接收器发送一个停止信号P。如果我想继续接收数据,就回应ACK,不想收了就回复NACK以此结束传输。
请添加图片描述
对于STM32的硬件I2C,如果使用单独的硬件iic,或者中断里面优先级最高,或者没有多任务,多操作的话,st的硬件iic工作的很完美,但是多任务多操作之后,使用dma的iic有时候也是很完美,但是这只是个表象和开始,会有很多意想不到的问题出现,大家慎用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值