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

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

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

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

读取寄存器数值

寄存器F407F103写入初值
RCOUNT_CH0347B34FB34FB
SETTLECOUNT_CH0001B001B001B
CLOCK_DIVIDERS_C_CH0200220022002
DRIVE_CURRENT_CH07BC07BC07800
ERROR_CONFIG000000000000
MUX_CONFIG420DC20DC20D
CONFIG140114011401
DRIVE_CURRENT_CH178007BC07800

通过对比发现,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);}

  • 3
    点赞
  • 29
    收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论 4

打赏作者

jhb222

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值