IC 验证之I2C控制器使用

IC 验证之I2C控制器使用

  • 1.I2C使用流程
  • 2.I2C中断处理问题

1.I2C使用流程

I2C总线使用流程:
1. 配置I2C使能寄存器EN中关闭I2C使能;
2. 配置标准速度I2C时钟高电平寄存器SS_SCL_HCNT;
3. 配置标准速度I2C时钟低电平寄存器SS_SCL_LCNT;
4. 配置数据保持时间寄存器SDA_HOLD;
5. 配置目标地址寄存器TAR,值为从设备地址;
6. 配置从设备地址寄存器SAR,值为从设备地址;
7. 配置中断屏蔽寄存器IMR打开中断使能;
8. (特殊)中断清除寄存器ICR,清除所有中断,读该寄存器只会清除软件可清楚中断,而不会清除硬件可清楚中断;
9. 配置发送FIFO threshold;
10. 配置接受FIFO threshold;
11.配置I2C使能寄存器EN中打开I2C使能;
12.向DATA_CMD寄存器写入或读取数据,高位在前,低位在后! I2C从设备EEPROM读写时序图如下 :IC 验证之I2C控制器使用_第1张图片
IC 验证之I2C控制器使用_第2张图片
就观察来看,读操作和写操作中的第一个CONTROL BYTE 是I2C控制器自动发送的,不需要手动向DATA_CMD写入TARADDR地址,只需要写入寄存器地址ADDR BYTE ,但是在读操作中第二个CONTROL BYTE是需要向DATA_CMD写入数据,手动发出的!
在连续读操作时,master每收到一个数据,就需要向DATA_CMD寄存器的CMD位置1发出,这样控制器会发出ack给从设备,从设备在收到ack后才会继续返回数据!IC 验证之I2C控制器使用_第3张图片

2.I2C中断处理问题

以I2C为例,在模块内部通常是多个中断信号经过或操作后,变为一个模块级的中断信号I2C_INTR输出给CPU的中断控制器GIC。假如要使用接收中断,但是在接收中断来临时,伴有有其他未知中断产生,但是中断服务函数里,却没有将相应中断标志位清除,那么中断服务函数退出后,模块级中断信号I2C_INTR仍为高电平,那么将会阻碍下一次中断服务函数正常响应,无法正常进入中断。

I2C的发送中断阈值寄存器可配置范围为0-255,对应1-256字节,也就是最小发送中断阈值是1。I2C在使能后,即使不用发送功能,但是只要发送FIFO里小于1个字节数据,硬件就会自动产生TX_EMPTY中断。这样有可能就会干扰其他中断正常使用,所以要如果不用发送功能,可以将发送中断屏蔽掉。

以上纯属个人理解,如有错误,欢迎指正!
末尾收藏一篇I2C笔记, I2C学习笔记.

你可能感兴趣的:(#,IC验证实例,arm)