XuSenfeng

个人站

复读了,更新随缘,有的文件不全或者图片缺失具体看我的笔记库(https://github.com/XuSenfeng/note)


I2C

目录

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高六位数据