F373的SPI,数据位数为什么不能设置?
自己做的 F373 板子,SPI 出现奇怪现象:
位数设置为 ≤8bit 时,每往 DR 写入一次数据,SCK 会发出两倍的脉冲。SPI1 和 SPI3 都这样。
设置为 >8bit 时,波形正常。(但可惜没法利用。)
如图,黄色波形为 SCK,蓝色为 MOSI (DR = 0xCA)。
NSSP = 0 时:
NSSP = 1 时:
程序配置如下:
硬件、软件都已经最小化,试过STMcube产生的配置程序,也试过多个官方例程,情况相同,
而且 SPI1 和 SPI3 情况完全一样。
很简单的事,折腾两天,近乎绝望。
目前只能认为芯片有问题。但愿是自己遇到特例了,而不是芯片本身的 bug 。
本帖最后由 玄德 于 2018-2-12 11:59 编辑
基本搞清了:
要直接操作向量地址,而且要加 uint8 修饰,
才能正确操作 8bit 宽度。直接读写 SPI1 -> DR 是不行的,那是操作 16 位。
while (1)
{
*(__IO uint8_t *) ( (uint32_t) SPI1 + 0x0C ) = 0xCA; //发送。不能这样写:SPI1 -> DR = 0xCA;
while ( !( SPI1 -> SR & ( 1 << 0 ) ) ); //等待 RXNE 标志。
j = *(__IO uint8_t *) ( (uint32_t) SPI1 + 0x0C ); //接收,同时清除 RXNE 标志。同样不能这样写:j = SPI1 -> DR;
for ( i=0; i<0x1000; i++ );
}
本帖最后由 玄德 于 2018-2-12 11:05 编辑
@toofree
我把 IAR 工程和 MDK 工程都做了,cube 工程也包含在文件夹里。而且都下载、运行过。
先传 IAR :
再传 MDK:生成的工程包有 110M,算了不传了。
把你的STMcubeMX生成的配置文件和应用工程都传上来看看。:) 本帖最后由 wenyangzeng 于 2018-2-11 13:47 编辑
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);
wenyangzeng 发表于 2018-2-11 13:27
1、默认的SPI发送数据长度是16位:
SPI_I2S_SendData(SPI_TypeDef* SPIx, uint16_t Data);
你可以一次发送2 ...
多谢指点!
按你说的第三条,我直接用 STMcube 中的库函数 HAL_SPI_Transmit() 进行发送,
现在可以得到正常的波形。
我前面只用了官方的外设配置函数,发送过程是自己写的,直接操作 DR 寄存器,然后判断 RXNE 标志,结果波形错误。
虽然还不明白怎么回事,毕竟有进展了。我再继续摸索。
本帖最后由 toofree 于 2018-2-11 16:40 编辑
玄德 发表于 2018-2-11 15:07
多谢指点!
按你说的第三条,我直接用 STMcube 中的库函数 HAL_SPI_Transmit() 进行发送,
从你主楼贴中的程序配置发现不了问题,因为的确没问题,问题出在了其它地方。
所以,以后还是最好上传个工程。 toofree 发表于 2018-2-11 16:38
从你主楼贴中的程序配置发现不了问题,因为的确没问题,问题出在了其它地方。
所以,以后还是最好上传个 ...
多谢热心关注,
白天一直在做各种尝试,明早把工程传上来。
希望放假前有个结果。
@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、等待、清标志,波形位数就不对了:
情况就是这样。一会上传工程。
wenyangzeng 发表于 2018-2-11 13:27
1、默认的SPI发送数据长度是16位:
SPI_I2S_SendData(SPI_TypeDef* SPIx, uint16_t Data);
你可以一次发送2 ...
多谢帮助!基本搞清了,结论在 9 层。
页:
[1]
2