通讯的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);}