I2C

FAQ1 高优先级线程打断I2C通讯线程导致I2C获取到数据异常

  • I2C采用轮询和中断模式进行通讯时,存在I2C通讯所在线程被其他高优先级线程打断的情况。

  • 有些I2C设备被打断通讯后,会导致获取到的数据异常;

解决方法:

  1. 提高I2C通讯线程优先级,降低I2C通讯被打断的概率;

  2. I2C通讯更改为DMA模式,这样I2C通讯过程中不需要cpu参与,就不会被其他高优先级线程打断。

../../_images/i2c_task_err.png

FAQ2 PCBA走线/布局有问题,导致高速率(400khz)读写时出现异常数据

问题怎么定位:

  1. 用逻辑分析仪数据抓取I2C通讯数据,利用逻辑分析仪软件自带的I2C协议分析功能,分析通讯是否异常。

  2. 用示波器查看I2C通讯实际波形是否正常。

  3. 飞线接到I2C器件开发板(器件原厂一般都有开发板),对比开发板上I2C波形和出问题的板子I2C波形的差异。


FAQ3 I2C速率和上拉电阻不匹配,I2C波形上升下降沿过缓,400Kbps推荐1.5K-2.2K上拉电阻。

按照项目经验,推荐跑400khz速率的客户外部上拉用1.5K-2.2K。当阻值过大时,400khz通讯会导致波形上升下降波形出现斜坡。

如下图为客户400khz通讯外部上拉用的10k的波形

../../_images/i2c_10k.jpg

图中I2C 的上升沿出现了明显的斜坡,高电平的时间被缩短,严重影响I2C有效数据的识别;


FAQ4 I2C DMA模式读写buff的影响

I2C 选择DMA模式通讯时,读写buff为psram时,可能会影响DMA搬运数据的效率,一般需要把读写buff放到sram。

可以尝试一下两种办法:

  1. 通过声明的方式的让变量处于sram

例如:

RETM_BSS_SECT_BEGIN(i2c_buf)
static uint8_t sram_buff[12] RETM_BSS_SECT(sram_buff);
RETM_BSS_SECT_END
  1. 从heap申请sram内存

例如:

void * buff = app_sram_alloc(12);