文章目录
- 读取单字节过程
- 读取多字节过程
- 写入单字节过程
- 写入多字节过程
对于开发板C型的IST8310,I2C的地址是0x0E,读取0x00寄存器的值
读取单字节过程
- 发送一个起始信号(如图一)
- 发送IST8310的I2C地址和读写位(其中读写位为0,即写)
- 等待IST8310从机的ACK位
- 发送IST8310需要读取的寄存器地址
- 等待IST8310从机的ACK位
- 再次发送一个起始信号(如图二)
- 发送IST8310的I2C地址和读写位(这次读写位为1,即读)
- 等待IST8310从机的ACK位
- IST8310从机会发送对应寄存器的数据
- 由于主机只接受一个字节数据,故而主机不发送ACK位
- 主机在发送停止信号后,停止通信
发送过程:
顺序 | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|
信号 | 起始信号 | I2C地址(写) | ACK | 寄存器地址 | ACK |
发送值 | SCL高 SDA从高电平拉低 | 0x0E<<1 | SDA从高电平拉低 | 0x00 | SDA从高电平拉低 |
发送者 | 主机 MCU | 主机 MCU | 从机 IST8310 | 主机 MCU | 从机 IST8310 |
6 | 7 | 8 | 9 | 10 | 11 |
---|---|---|---|---|---|
起始信号 | I2C地址(读) | ACK | IST8310的0x00寄存器值 | NACK | 停止信号 |
SCL高 SDA从高电平拉低 | 0x0E<<1 | SDA从高电平拉低 | 0x10 | SDA保持高电平 | SCL高 SDA从低电平拉高 |
主机 MCU | 主机 MCU | 从机 IST8310 | 从机 IST8310 | 主机 MCU | 主机 MCU |
读取多字节过程
主机接收到一个字节后,主机发送ACK信号,则从机IST8310会接着再发送下一个寄存器的值,直到主机发送一个NACK信号,从机便停止发送数据
发送过程:
顺序 | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|
信号 | 起始信号 | I2C地址(写) | ACK | 寄存器地址 | ACK |
发送值 | SCL高 SDA从高电平拉低 | 0x0E<<1 | SDA从高电平拉低 | 0x00 | SDA从高电平拉低 |
发送者 | 主机 MCU | 主机 MCU | 从机 IST8310 | 主机 MCU | 从机 IST8310 |
6 | 7 | 8 | 9 | 10 | 11 |
---|---|---|---|---|---|
起始信号 | I2C地址(读) | ACK | IST8310的0x00寄存器值 | ACK | IST8310的0x01寄存器值 |
SCL高 SDA从高电平拉低 | 0x0E<<1 | SDA从高电平拉低 | 0x10 | SCL高 SDA从高电平拉低 | 0xNN |
主机 MCU | 主机 MCU | 从机 IST8310 | 从机 IST8310 | 主机 MCU | 从机 IST8310 |
12 | 13 | n | 15 | 16 |
---|---|---|---|---|
ACK | IST8310的0x02寄存器值 | … | NACK | 停止信号 |
SCL高 SDA从高电平拉低 | X-axis的低八位数据 | n个数据 | SDA保持高电平 | SCL高 SDA从低电平拉高 |
主机 MCU | 从机 IST8310 | 主机 MCU | 主机 MCU |
写入单字节过程
与读取数据过程相比,写入数据过程相对简单
少了中间重新产生起始信号以及第二次发送I2C地址的过程
- 首先发送一个起始信号
- 发送IST8310的I2C地址和读写位(这次读写位为1,即写)
- 等待IST8310从机的ACK位
- 发送需要写入的寄存器地址值
- 等待IST8310的ACK位
- 主机发送需要写入的值
- 等待IST8310的ACK位
- 主机产生一个停止信号,完成本次通信
向IST8310的寄存器0x0A地址写入0x0B值,过程如下:
顺序 | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|
信号 | 起始信号 | I2C地址(写操作) | ACK | 寄存器地址 | ACK |
发送值 | SCL高 SDA从高电平拉低 | 0x0E<<1 | SDA从高电平拉低 | 0x0A | SDA从高电平拉低 |
发送者 | 主机 MCU | 主机 MCU | 从机 IST8310 | 主机 MCU | 从机 IST8310 |
6 | 7 | 8 |
---|---|---|
写入值 | ACK | 停止信号 |
0x0B | SDA从高电平拉低 | SCL高 SDA从低电平拉高 |
主机 MCU | 从机 IST8310 | 主机 MCU |
写入多字节过程
与写入单字节相比,在写入一个字节后不发送停止信号,而是接着发送数据
向IST8310的寄存器0x0A地址写入0x0B值,往0x0B写入0x08,过程如下:
顺序 | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|
信号 | 起始信号 | I2C地址(写操作) | ACK | 寄存器地址 | ACK |
发送值 | SCL高 SDA从高电平拉低 | 0x0E<<1 | SDA从高电平拉低 | 0x0A | SDA从高电平拉低 |
发送者 | 主机 MCU | 主机 MCU | 从机 IST8310 | 主机 MCU | 从机 IST8310 |
6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|
0x0A写入值 | ACK | 0x0B写入值 | ACK | 停止信号 |
0x0B | SDA从高电平拉低 | 0x08 | SDA从高电平拉低 | SCL高 SDA从低电平拉高 |
主机 MCU | 从机 IST8310 | 主机 MCU | 从机 IST8310 | 主机 MCU |