你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

F373的SPI,数据位数为什么不能设置?

[复制链接]
玄德 提问时间:2018-2-11 11:46 /

自己做的 F373 板子,SPI 出现奇怪现象:
位数设置为 ≤8bit 时,每往 DR 写入一次数据,SCK 会发出两倍的脉冲。SPI1 和 SPI3 都这样。
设置为 >8bit 时,波形正常。(但可惜没法利用。)

如图,黄色波形为 SCK,蓝色为 MOSI (DR = 0xCA)。
NSSP = 0 时:
3.jpg


NSSP = 1 时:
2.jpg


程序配置如下:
1.png


硬件、软件都已经最小化,试过STMcube产生的配置程序,也试过多个官方例程,情况相同,
而且 SPI1 和 SPI3 情况完全一样。

很简单的事,折腾两天,近乎绝望。
目前只能认为芯片有问题。但愿是自己遇到特例了,而不是芯片本身的 bug 。

收藏 评论13 发布时间:2018-2-11 11:46

举报

13个回答
玄德 回答时间:2018-2-12 11:57:42
本帖最后由 玄德 于 2018-2-12 11:59 编辑


基本搞清了:
要直接操作向量地址,而且要加 uint8 修饰,
才能正确操作 8bit 宽度。直接读写 SPI1 -> DR 是不行的,那是操作 16 位。



  1. while (1)
  2.           {
  3.         *(__IO uint8_t *) ( (uint32_t) SPI1 + 0x0C ) = 0xCA;                        //发送。不能这样写:SPI1 -> DR = 0xCA;
  4.         while        ( !( SPI1 -> SR & ( 1 << 0 ) ) );        //等待 RXNE 标志。
  5.         j = *(__IO uint8_t *) ( (uint32_t) SPI1 + 0x0C );                        //接收,同时清除 RXNE 标志。同样不能这样写:j = SPI1 -> DR;
  6.         for        ( i=0; i<0x1000; i++ );
  7.           }
复制代码


玄德 回答时间:2018-2-12 09:58:18
本帖最后由 玄德 于 2018-2-12 11:05 编辑

@toofree

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

先传 IAR :   testIAR.part01.rar (8 MB, 下载次数: 2)
七哥 回答时间:2018-2-11 12:39:38
把你的STMcubeMX生成的配置文件和应用工程都传上来看看。

评分

参与人数 1蝴蝶豆 +1 收起 理由
zero99 + 1

查看全部评分

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);

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

玄德 回答时间: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 标志,结果波形错误。

虽然还不明白怎么回事,毕竟有进展了。我再继续摸索。



七哥 回答时间: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 。

端口配置:
1.png

SPI配置:
2.png

生成工程以后,配置一下芯片型号、无优化、JLINK、SWD,
然后在原始 main 文件里、while (1)循环下,添加自己的应用语句。如下图:
3.png

=================下面是实验结果=========

使用第一种方式,用官方发送函数循环发送 0xCA,可以得到正确、漂亮的波形:
3.jpg

使用第二种方式,常规的寄存器操作,写 DR、等待、清标志,波形位数就不对了: 5.jpg

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

玄德 回答时间: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 层。

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


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

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2 结帖奖励

查看全部评分

七哥 回答时间:2018-2-12 14:52:43
玄德 发表于 2018-2-12 12:00
多谢帮助!基本搞清了,结论在 9 层。


看一下函数 HAL_SPI_Transmit() 的原型,里面有8位模式发送,见下图粉色框出来的部分。相信在用户指导手册中也应该说明。
这个是批量传输,当计数器内大于1的时候,按16位发送;当等于1的时候,按8位发送;等于0的时候不进来,直接结束了。
2018-02-12_14-40-18.jpg
玄德 回答时间:2018-2-12 15:49:01
本帖最后由 玄德 于 2018-2-12 16:02 编辑
toofree 发表于 2018-2-12 14:52
看一下函数 HAL_SPI_Transmit() 的原型,里面有8位模式发送,见下图粉色框出来的部分。相信在用户指导手 ...

我就是仿照这个做的。这个F3居然与其他系列不一样。




所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版