玄德 发表于 2018-2-11 11:46:25

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:57:42

本帖最后由 玄德 于 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 09:58:18

本帖最后由 玄德 于 2018-2-12 11:05 编辑

@toofree

我把 IAR 工程和 MDK 工程都做了,cube 工程也包含在文件夹里。而且都下载、运行过。

先传 IAR :      
再传 MDK:生成的工程包有 110M,算了不传了。



toofree 发表于 2018-2-11 12:39:38

把你的STMcubeMX生成的配置文件和应用工程都传上来看看。:)

wenyangzeng 发表于 2018-2-11 13:27:13

本帖最后由 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);

玄德 发表于 2018-2-11 15:07:49

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:38:35

本帖最后由 toofree 于 2018-2-11 16:40 编辑

玄德 发表于 2018-2-11 15:07
多谢指点!

按你说的第三条,我直接用 STMcube 中的库函数 HAL_SPI_Transmit() 进行发送,


从你主楼贴中的程序配置发现不了问题,因为的确没问题,问题出在了其它地方。
所以,以后还是最好上传个工程。

玄德 发表于 2018-2-11 23:50:12

toofree 发表于 2018-2-11 16:38
从你主楼贴中的程序配置发现不了问题,因为的确没问题,问题出在了其它地方。
所以,以后还是最好上传个 ...


多谢热心关注,
白天一直在做各种尝试,明早把工程传上来。

希望放假前有个结果。


玄德 发表于 2018-2-12 09:46:53



@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、等待、清标志,波形位数就不对了:

情况就是这样。一会上传工程。

玄德 发表于 2018-2-12 12:00:20

wenyangzeng 发表于 2018-2-11 13:27
1、默认的SPI发送数据长度是16位:
SPI_I2S_SendData(SPI_TypeDef* SPIx, uint16_t Data);
你可以一次发送2 ...


多谢帮助!基本搞清了,结论在 9 层。

页: [1] 2
查看完整版本: F373的SPI,数据位数为什么不能设置?