官方提供的移植资料,可以借鉴一下。2.7.1 CLK线重复配置
有客户反馈当SPI处于主模式下,重复配置SPI的CLK线会引起内部计数器紊乱:
问题代码: GPIO->CRL&=0x000fffff;
GPIO->CRL|=0xBBB00000;
上面这段代码是执行SPI口的IO初始化,调用两次后会使CLK上面产生一个脉冲。引起内部计数器出错,ST的
在SPI再次初始化的时候会将内部计数器清零,GD不会将内部计数器清零。
修改办法: vu32 temp;
temp=GPIOA->CFL;
temp&=0x000fffff;
temp|=0xbbb00000;
GPIOA->CRL=temp;
先进行运算再去进行赋值,内部的SPI 计数器就不会因为CLK数据的变化引起误操作。
2.7.2 SPI 通信BSY标志位
在SPI程序编写的过程中,轮询使用BSY作为检测标志位,传送数据丢失或者是错误。这是因为GD的BSY
标志位不是在写入DR后就置位的,而是有很小的一个延时后才置起的。传输过程中不要使用BSY作为每次传
输的判断,使用TXE和 RXNE来进行判断。
2.7.3 SPI 控制寄存器1(SPI_CR1)配置流程
客户如果从低到高一位一位配置该寄存器会出现MODF的错误,经过排查是由于GD的MCU在SPE使能之
前就开始检测是否有模式错误,而ST是在SPE使能之后,所以在MSTR写1之前要保证模式正确。SSM为0时
保证外接高电平或者SSM和SSI都写1或者是把SSOE打开。130\150没有该问题.
案例:BIDIMODE=0; RXONLY=0;MSTR=1;DFF=0;CPOL=0;CPHA=0;SSM=1;
SSOE=1;TXEIE=1;BR=2;LSBFIRST=0;CRCPOLY=7;SPE=1;
这个顺序在ST上正常,在GD上出现MODF错误,解决的话可以将整个寄存器一次写入,也可调整初始化顺
序,同时加上SSI的配置。
|