关于IIC
IIC是一种半双工的通讯协议
他不能同时进行发送和接受
他有两个线
一个是SCLK一个是SDA
SCLK是负责同步时钟信号引脚的
SDA是负责发送和接受的引脚
他可以是多主多从的设计
IIC的通讯
IIC开始通讯
SCL高电平期间,SDA从高电平切换到低电平

IIC发送数据
发送一个字节:SCL低电平期间,主机将数据位依次放到SDA线上(高位先行),
然后释放SCL,从机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化
依次循环上述过程8次,即可发送一个字节

IIC应答
接收应答:主机在发送完一个字节之后,在下一个时钟接收一位数据(由从机进行发送),判断从机是否应答
数据0表示应答,数据1表示非应答(主机在接收之前,需要释放SDA)

IIC结束通讯
终止条件:SCL高电平期间,SDA从低电平切换到高电平

IIC接受数据
接收一个字节:SCL低电平期间,从机将数据位依次放到SDA线上(高位先行)
然后释放SCL,主机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化
依次循环上述过程8次,即可接收一个字节(主机在接收之前,需要释放SDA)
接受完成后,主机记得要给从机回复一个应答信号

IIC通讯全流程查看
几个概念:
IIC开始:相当告诉全部的设备,我准备要发送数据了,其他做好准备
发送设备地址: 一般是主机直接点从机名字。相当于是某某同学我要准备向你提问了做好准备
最后一位数据决定是要发还是要读
一般地址只有7位,最后一位是留给主机决定是写还是读
ACK 就是应答信号,由接受完数据的设备发出(可以是主机也能是从机)
相当于是我已经完成数据接受
NACK应答的信号的一种,也是由接受完数据的设备发出
但是代表的是设备要求结束通讯,可能是故障或者发送完成
IIC停止:告诉全部人,我已经完成通讯,我将释放总线
发送流程

1:IIC开始 告诉全部人我要准备发送数据了
2:发送设备地址(带写入指令) 相当于是我指定某人,我要和你讲话
3:接受到从机发来的ACK 从机接收到数据做出应答
4:发送数据 主机继续发送数据可以是指定寄存器也可以是命令
5:接受到从机发来的ACK 从机继续发送ACK代表接受到数据
6:IIC停止 主机发送停止,代表我已经完成发送
接收流程

1:IIC开始 告诉全部人我要准备发送数据了
2:发送设备地址(带写入指令) 发送设备地址,相当于是我指定某人,我要和你讲话
3:接受到从机发来的ACK 从机接收到数据做出应答
4:发送设备地址(带读指令)
5:接受到数据
6:然后发送ACK给从机
7:然后继续接受数据
8:可以发送NACK代表通讯结束
9:IIC停止 主机发送停止,代表我已经完成发送
你可以直接发送停止不发送NACK,也可以停止结束通讯
如果你收到了NACK那么就要结束通讯
参考代码(提供思路)
IIC开始
1 | mob_iic_sda_out(HIGH); //sda 高 |
IIC停止信号
1 | mob_iic_scl(LOW);//scl 低 |
产生ACK
1 | mob_iic_scl(LOW);//scl 低 |
产生NACK应答
1 | mob_iic_scl(LOW);//scl 低 |
等待接受ACK
1 | uint8_t iic_wait_ack(uint32_t time) |
发送一个字节
1 | //IIC发送一个字节 |
SDA 输出一个电平
然后SCLK负责一高一低就代表传输完成了
读取电平
1 | uint8_t iic_read_byte(bool ack) |
关于发送设备地址
7位转8位数据
Address是7位设备地址
最后一位:
0 = 写
1 = 读
1 | 发送 :Address << 1 |