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

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 15:25
七哥 回答时间: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管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版