I2C¶
FAQ1 高优先级线程打断I2C通讯线程导致I2C获取到数据异常¶
I2C采用轮询和中断模式进行通讯时,存在I2C通讯所在线程被其他高优先级线程打断的情况。
有些I2C设备被打断通讯后,会导致获取到的数据异常;
解决方法:
提高I2C通讯线程优先级,降低I2C通讯被打断的概率;
I2C通讯更改为DMA模式,这样I2C通讯过程中不需要cpu参与,就不会被其他高优先级线程打断。
FAQ2 PCBA走线/布局有问题,导致高速率(400khz)读写时出现异常数据¶
问题怎么定位:
用逻辑分析仪数据抓取I2C通讯数据,利用逻辑分析仪软件自带的I2C协议分析功能,分析通讯是否异常。
用示波器查看I2C通讯实际波形是否正常。
飞线接到I2C器件开发板(器件原厂一般都有开发板),对比开发板上I2C波形和出问题的板子I2C波形的差异。
FAQ3 I2C速率和上拉电阻不匹配,I2C波形上升下降沿过缓,400Kbps推荐1.5K-2.2K上拉电阻。¶
按照项目经验,推荐跑400khz速率的客户外部上拉用1.5K-2.2K。当阻值过大时,400khz通讯会导致波形上升下降波形出现斜坡。
如下图为客户400khz通讯外部上拉用的10k的波形
图中I2C 的上升沿出现了明显的斜坡,高电平的时间被缩短,严重影响I2C有效数据的识别;
FAQ4 I2C DMA模式读写buff的影响¶
I2C 选择DMA模式通讯时,读写buff为psram时,可能会影响DMA搬运数据的效率,一般需要把读写buff放到sram。
可以尝试一下两种办法:
通过声明的方式的让变量处于sram
例如:
RETM_BSS_SECT_BEGIN(i2c_buf)
static uint8_t sram_buff[12] RETM_BSS_SECT(sram_buff);
RETM_BSS_SECT_END
从heap申请sram内存
例如:
void * buff = app_sram_alloc(12);