STM32L431之SPI时钟翻倍问题

[复制链接]
baicai 发表于 2018-8-14 10:07:49 | 显示全部楼层 |阅读模式
本帖最后由 baicai 于 2018-8-14 10:11 编辑

简单地将SPI配置成8位数据长度模式

   
[C] 纯文本查看 复制代码
   /* configure SPI1 */ 
 SPI1->CR2 = 0x1704;
 SPI1->CR1 = 0x15C;


读写方式
[C] 纯文本查看 复制代码
 GPIOA->BSRR |= 1 << 20; //set NSS low
 for(i = 0;i < command_size;i++) {
   while (0 == (SPI1->SR & SPI_SR_TXE));
   SPI1->DR = out_buf & 0xFF;
   while (0 == (SPI1->SR & SPI_SR_RXNE));
   in_buf = SPI1->DR & 0xFF; 
 }
 GPIOA->BSRR |= 1 << 4; //set NSS high


发现读写的时候时钟翻倍,写入3B有48个clock。而且在NSS拉高之后依然有时钟。

如果数据位配置成4b的话,写入4B依然也有24个时钟,时钟个数翻了一倍。

原因:SPI有个data packing,如果配置的数据长度小等于8b(即一个字节及以下)并且按照16b模式读写SPIx->DR时自动进行data packing。(详见RM36.4.9 Data packing)解决方法

按照8位的方式进行读写SPIx->DR,即

[C] 纯文本查看 复制代码
 GPIOA->BSRR |= 1 << 20; //set NSS low
 for(i = 0;i < command_size;i++) {
   while (0 == (SPI1->SR & SPI_SR_TXE));
   (unsigned char *)&(SPI1->DR) = out_buf & 0xFF;
   while (0 == (SPI1->SR & SPI_SR_RXNE));
   in_buf = SPI1->DR & 0xFF; 
 }
 GPIOA->BSRR |= 1 << 4; //set NSS high


通过反汇编我们可以看到两者的差异:


在最后一句时使用STR及STRB的区别。
通过这样子修改之后的时序图如下:







上一篇:STM32L431之SPI时钟过高导致无法通信
下一篇:Linux 常用服务器Dell raid操作。

本版积分规则

QQ|Archiver|手机版|小黑屋|RD之家 - 研发工程师的伊甸园 ( 京ICP备18037383号 )
360导航 360安全浏览器 蚂蚁搜索 速搜全球 酷帝网站目录 搜狗导航 114啦网址导航

GMT+8, 2018-9-22 09:19

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表