I2C
有一个用于测试的器件, AP3216C, 链接到一个I2C接口上面, , 还有一个APINT的中断, I2C_SCL使用的是UART4_TXD引脚, I2C_SDA使用的是UART4_RXD
两条线都是用一个4.7k上拉, 支持一个多从机, 使用唯一的地址进行访问
信号时序:I2C协议(用于stm32) (xusenfeng.github.io)
应答信号, 由从机进行拉低, 设置应答信号
- 写:
1)、开始信号。
2)、发送I2C设备地址,每个I2C器件都有一个设备地址,通过发送具体的设备地址来决定访问哪个I2C器件。这是一个8位的数据,其中高7位是设备地址,最后1位是读写位,为1的话表示这是一个读操作,为0的话表示这是一个写操作。
3)、I2C器件地址后面跟着一个读写位,为0表示写操作,为1表示读操作。
4)、从机发送的ACK应答信号。
5)、重新发送开始信号。
6)、发送要写写入数据的寄存器地址。
7)、从机发送的ACK应答信号。
8)、发送要写入寄存器的数据。
9)、从机发送的ACK应答信号。
10)、停止信号。
- 读
1)、主机发送起始信号。
2)、主机发送要读取的I2C从设备地址。
3)、读写控制位,因为是向I2C从设备发送数据,因此是写信号。
4)、从机发送的ACK应答信号。
5)、重新发送START信号。
6)、主机发送要读取的寄存器地址。
7)、从机发送的ACK应答信号。
8)、重新发送START信号。
9)、重新发送要读取的I2C从设备地址。
10)、读写控制位,这里是读信号,表示接下来是从I2C从设备里面读取数据。
11)、从机发送的ACK应答信号。
12)、从I2C器件里面读取到的数据。
13)、主机发出NO ACK信号,表示读取完成,不需要从机再发送ACK信号了。
14)、主机发出STOP信号,停止I2C通信
时钟
66MHz
寄存器
I2Cx_IADR: 自己的从机地址
I2Cx_IFDR: 设置频率bit0-5分频因子, 设置为0x38或0x15的时候会进行640分频, 大概为103.125Kbit
I2Cx_I2CR: bit7, 使能I2C, bit6中断, bit5主从模式选择0为从机, bit4发送接收设置为, 0接收1发送,
I2Cx_I2SR: 状态寄存器, bit7数据传输, 0正在传输, 1完成, bit5, 总线忙闲位, 为0的时候空闲, bit0读却认位ACK信号
I2Cx_I2DR: 数据寄存器
在发送从机地址的时候自动产生开始信号
I2Cx_I2CR[MSTA]:
0Slave mode. Changing MSTA from 1 to 0 generates a Stop and selects Slave mode.
1Master mode. Changing MSTA from 0 to 1 signals a Start on the bus and selects Master mode
AP3216C
是一个三合一的环境光传感器, ALS(环境光)+PS(接近传感器)+IRLED(红外LED灯), 使用I2C最高400K频率
ALS是十六位输出, PS10bit输出, IR传感器也是10bit
从机地址为七位, 地址为0x1E
寄存器
- 0x00系统配置, bit0,-2设置开启的传感器设置为3的时候开启所有, 读取周期大于112ms
- 0x0a是IR Data的low,bit7 为0的时候, 表示IR和PS数据有效, bit1, bit0是IR低两位
- 0x0b是bit0-7:IR Data的高字节, 和0xa一起组成10bit
- 0x0c: ALS低字节bit0-7
- 0x0d: ALS高字节bit0-7
- 0x0e: bit0-3是ps的低四位, bit6
- 0x0f: bit0-5高六位数据