记录一次从stm32F1向F4移植模拟iic的困惑

通讯的IC 是FDC2214 ,在F1运行时通讯正常,移植到F4时只需要修改下引脚IO的初始化,以及输入输出方向。

但是在测试时候发现了一个问题,在向FDC2214写入数据时,MSB的最高位始终无法写入 。

这里是对使用F103和f407对寄存器进行读写操作的测试结果。

读取寄存器数值

寄存器 F407 F103 写入初值
RCOUNT_CH0 347B 34FB 34FB
SETTLECOUNT_CH0 001B 001B 001B
CLOCK_DIVIDERS_C_CH0 2002 2002 2002
DRIVE_CURRENT_CH0 7BC0 7BC0 7800
ERROR_CONFIG 0000 0000 0000
MUX_CONFIG 420D C20D C20D
CONFIG 1401 1401 1401
DRIVE_CURRENT_CH1 7800 7BC0 7800

通过对比发现,F103写入和读取的值是大部分一致的。

只有 MUX_CONFIG 在STM32F103和F407中读取的数据时不同的。进一步测试发现 是最高位数据发生了错误。

发送设置时,写入0XC20D,实际写入为0X420D

分析原因,应该是在写通信过程中发生了错误。

最后误打误撞发现了问题的原因和解决办法,在这里告诉大家:

问题出在SDA引脚设置方向这里。

这里是本来的代码,可能是F4换输入输出方向有一点问题。

//IO方向设置
#define FDC_SDA_IN()  {GPIOD->MODER&=~(3<<(9*2));GPIOD->MODER|=0<<(9*2);}	
#define FDC_SDA_OUT() {GPIOD->MODER&=~(3<<(9*2));GPIOD->MODER|=1<<(9*2);}

最后的解决方案就是在换向之后加入一个延时,问题解决;

//IO方向设置
#define FDC_SDA_IN()  {GPIOD->MODER&=~(3<<(9*2));GPIOD->MODER|=0<<(9*2);delay_us(1);}	
#define FDC_SDA_OUT() {GPIOD->MODER&=~(3<<(9*2));GPIOD->MODER|=1<<(9*2);delay_us(1);}

你可能感兴趣的:(日常bug)