i2c问题整理
高优先级线程打断I2C读写线程导致数据err
解决方法:
1.把I2C读写线程优先级提高
2.配置DMA方式读写也能规避改问题,但是DMA通道有限。要看下有没有其他设备在用

pcba走线/布局有问题,导致高速率(400khz)读写时出现异常数据
问题怎么定位:
1.先确定是否软件问题导致,配置dma模式抓逻辑分析仪数据看看。
2.飞线接到I2C器件开发板(器件原厂一般都有开发板)尝试是否还能复现,原厂一般都有布局跟走线要求。要确认下是否符合要求。
I2C速率和上拉电阻不匹配,I2C波形上升下降沿过缓,400Kbps推荐1.5K-2.2K上拉电阻。
按照项目经验,我们推荐跑400khz速率的客户外部上拉用1.5K-2.2K.
阻值过大时,跑400khz或导致波形上升下降波形出现斜坡。如下图客户外部上拉用的10k,跑400khz

I2C设备配置dma
1.menuconfig先打开通道,注意55x/56x要看下I2C设备是在大核还是小核

2.注册I2C设备open时需要|RT_DEVICE_FLAG_DMA_TX/RX

3.检查对应I2C的dma通道,软件是否有配置dma通道,是否被其他外设占用,检查dma_config.h
像是52x的solution 1.2.2代码,默认只给I2C2配置了dma通道。其他I2C通道没有配置。
配置时需要注意,I2C_DMA_REQUEST是对应的物理寄存器地址,在芯片上是固定的。
每个外设不一样,需要看芯片手册。其他的几个参数都是对应的channel,这个只要没被其他的设备使用都可以配置。



4.软件算法调用I2C dma读数据
1)用dma读数时需要注意,需要配置一个全局的静态数组。如果缓存数据的地址不是固定的会导致dma搬数后,应用层返回的是0值。

2)软件运行频繁,速率高时对数组的加载位置也有影响。默认注册的静态数组是在psram,如果读数据频<繁,数据多。在psram搬运可能来不及,会出现上层拿到的数据部分为0。解决方法,把注册的静态数组放在sram里。这么做会让dma搬运速度提升,避免速度不够出现的dma搬运没完成。
