ARM学习笔记(8)

发布时间:2026/9/24 10:24:58
ARM学习笔记(8)
今天整理 i2c 的笔记总线这个东西看着简单把时序捋清楚也就通了大半。I2C 是什么I2C 是两根线的串行通信总线一根 SCL 时钟线、一根 SDA 数据线。靠地址寻址从机地址是 7 位最多能挂 127 个从机。起始信号之后发的第一个字节很有讲究高 7 位是设备地址低 1 位是数据流向。最低位是 0 表示主机写数据给从机是 1 表示从机读数据给主机。比如笔记里记的 0x10 展开成二进制就是 0001 0001 。I2C 的通信速率分几档100 kHz、400 kHz、1.x M、3.x M用得最多的是标准 100k 和快速 400k。I2C 时序时序核心就是 SCL 和 SDA 两条线的电平配合分四步- 起始信号SCL 为高电平时SDA 从高变低出现下降沿- 数据传输SCL 高电平期间SDA 电平保持稳定接收方在这个窗口采样SCL 低电平期间SDA 可以随意改变发送方趁这段时间发数据- 应答信号第 9 个时钟周期接收方向发送方回复应答——低电平是 ACK高电平是 NACK- 结束信号SCL 为高电平时SDA 从低变高出现上升沿把收发两端和电平对上写驱动时思路就顺了// 起始信号SCL 高电平时SDA 高-低static void i2c_start(void){SDA 1; SCL 1;SDA 0; // 下降沿SCL 0;}// 结束信号SCL 高电平时SDA 低-高static void i2c_stop(void){SDA 0; SCL 1;SDA 1; // 上升沿}// 发一个字节SCL 低电平时放数据高电平时采样static void i2c_write_byte(unsigned char data){for (int i 0; i 8; i){SCL 0;SDA (data 0x80) ? 1 : 0; // 先发高位data 1;SCL 1; // 接收方在高电平采样}}寄存器访问外设的寄存器映射在地址空间里从 0xFF 一路排到 0x00 每个寄存器对应一块存储单元。读写的时候按地址去操作寄存器位就行这也是 I2C 最常见的应用场景——挂个传感器、EEPROM 之类就是往它寄存器地址里读写数据。