自己做的 F373 板子,SPI 出现奇怪现象: 位数设置为 ≤8bit 时,每往 DR 写入一次数据,SCK 会发出两倍的脉冲。SPI1 和 SPI3 都这样。 设置为 >8bit 时,波形正常。(但可惜没法利用。) 如图,黄色波形为 SCK,蓝色为 MOSI (DR = 0xCA)。 NSSP = 0 时: NSSP = 1 时: 程序配置如下: 硬件、软件都已经最小化,试过STMcube产生的配置程序,也试过多个官方例程,情况相同, 而且 SPI1 和 SPI3 情况完全一样。 很简单的事,折腾两天,近乎绝望。 目前只能认为芯片有问题。但愿是自己遇到特例了,而不是芯片本身的 bug 。 |
基本搞清了:
要直接操作向量地址,而且要加 uint8 修饰,
才能正确操作 8bit 宽度。直接读写 SPI1 -> DR 是不行的,那是操作 16 位。
@toofree
我把 IAR 工程和 MDK 工程都做了,cube 工程也包含在文件夹里。而且都下载、运行过。
先传 IAR :
再传 MDK:生成的工程包有 110M,算了不传了。
评分
查看全部评分
1、默认的SPI发送数据长度是16位:
SPI_I2S_SendData(SPI_TypeDef* SPIx, uint16_t Data);
你可以一次发送2个字节。
2、而设定发送数据位长度8位:
#define SPI_DataSize_8b
SPI_DataSizeConfig(SPI_TypeDef* SPIx, SPI_DataSize);
3、而在F3的STM32Cube里的函数也可以试试
HAL_SPI_TransmitReceive_IT(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size);
评分
查看全部评分
多谢指点!
按你说的第三条,我直接用 STMcube 中的库函数 HAL_SPI_Transmit() 进行发送,
现在可以得到正常的波形。
我前面只用了官方的外设配置函数,发送过程是自己写的,直接操作 DR 寄存器,然后判断 RXNE 标志,结果波形错误。
虽然还不明白怎么回事,毕竟有进展了。我再继续摸索。
点评
从你主楼贴中的程序配置发现不了问题,因为的确没问题,问题出在了其它地方。
所以,以后还是最好上传个工程。
多谢热心关注,
白天一直在做各种尝试,明早把工程传上来。
希望放假前有个结果。
@toofree
我用的是 STMcubeMX / v4.24,IAR / v7.20,MDK / 5.23 。
CPU 型号是 STM32F373RCT6 。
STM32cubeMX,只配置外设 SPI1,端口 PC7 - SCK,PC8 - MISO, PC9 - MOSI 。最关心的是 SCK 和 MOSI 。
端口配置:
SPI配置:
生成工程以后,配置一下芯片型号、无优化、JLINK、SWD,
然后在原始 main 文件里、while (1)循环下,添加自己的应用语句。如下图:
=================下面是实验结果=========
使用第一种方式,用官方发送函数循环发送 0xCA,可以得到正确、漂亮的波形:
使用第二种方式,常规的寄存器操作,写 DR、等待、清标志,波形位数就不对了:
情况就是这样。一会上传工程。
多谢帮助!基本搞清了,结论在 9 层。
多谢帮助!基本搞清了,结论在 9 层。
评分
查看全部评分
看一下函数 HAL_SPI_Transmit() 的原型,里面有8位模式发送,见下图粉色框出来的部分。相信在用户指导手册中也应该说明。
这个是批量传输,当计数器内大于1的时候,按16位发送;当等于1的时候,按8位发送;等于0的时候不进来,直接结束了。
我就是仿照这个做的。这个F3居然与其他系列不一样。