[STM32L0] STM32L0, HAL SPI 8bit读数据时钟会多一组,数据不对

[复制链接]
3359|14
 楼主| huarana 发表于 2018-9-21 09:23 | 显示全部楼层 |阅读模式
stm32L011,硬件spi  cubemx生成代码。由于使用的是单线半双工模式,所以采用单独的收发函数。
HAL_SPI_Transmit(&hspi1,&temp,1,1000);
HAL_SPI_Receive(&hspi1,&temp1[0],1,1000);
使用中发现,发送正常。但是接收的时候 ,clock会多出一组8个。
如图,我用读取函数HAL_SPI_Receive(&hspi1,temp1,1,1000);读了1个字节,然而却出来2组clock。
同样的,如果我读2个字节HAL_SPI_Receive(&hspi1,temp1,2,1000); 则clock是3组,永远比读的多了一组。
QQ图片20180921091959.png

spi配置如下:
  1. /* SPI1 init function */
  2. void MX_SPI1_Init(void)
  3. {

  4.   hspi1.Instance = SPI1;
  5.   hspi1.Init.Mode = SPI_MODE_MASTER;
  6.   hspi1.Init.Direction = SPI_DIRECTION_1LINE;
  7.   hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
  8.   hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
  9.   hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
  10.   hspi1.Init.NSS = SPI_NSS_SOFT;
  11.   hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16;
  12.   hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
  13.   hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
  14.   hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  15.   hspi1.Init.CRCPolynomial = 7;
  16.   if (HAL_SPI_Init(&hspi1) != HAL_OK)
  17.   {
  18.     _Error_Handler(__FILE__, __LINE__);
  19.   }

  20. }


1053356130 发表于 2018-9-27 10:29 | 显示全部楼层
找到问题了吗
 楼主| huarana 发表于 2018-9-28 17:41 | 显示全部楼层

没有找到 - -!

这个问题实在是无从下手。

戈卫东 发表于 2018-9-28 20:22 | 显示全部楼层
印象中SPI的FIFO会根据写入字长设置FIFO的内容。。
 楼主| huarana 发表于 2018-9-29 22:54 | 显示全部楼层
戈卫东 发表于 2018-9-28 20:22
印象中SPI的FIFO会根据写入字长设置FIFO的内容。。

stm32L0单片机的spi资料里没找到fifo  ,可能就没有fifo
sky.sun.zz 发表于 2018-9-30 07:22 | 显示全部楼层
HAL_SPI_TransmitReceive(&SpiHandle, (uint8_t*)aTxBuffer, (uint8_t *)aRxBuffer, BUFFERSIZE, 5000);
强制8位操作应该就可以了
 楼主| huarana 发表于 2018-9-30 12:59 | 显示全部楼层
sky.sun.zz 发表于 2018-9-30 07:22
HAL_SPI_TransmitReceive(&SpiHandle, (uint8_t*)aTxBuffer, (uint8_t *)aRxBuffer, BUFFERSIZE, 5000);
强 ...

这个函数本来就是 UINT8的  所以不存在强制不强制。
函数原型就是8位的
  1. HAL_StatusTypeDef HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout)


另外 如果设成16bit发送的话也会多一组。
yiy 发表于 2018-9-30 16:32 | 显示全部楼层
那么最后正常了吗
chenqiang10 发表于 2018-9-30 18:50 | 显示全部楼层
这个是设么原因引起的?
磨砂 发表于 2018-10-1 16:43 | 显示全部楼层
示波器怎么显示的?
 楼主| huarana 发表于 2018-10-1 20:18 来自手机 | 显示全部楼层
yiy 发表于 2018-9-30 16:32
那么最后正常了吗

没正常,我吧hal库里的函数重写了才好,但是还是不知道原因。
fclmyl2 发表于 2018-10-1 21:48 | 显示全部楼层
你是 先发 HAL_SPI_Receive(&hspi1,&temp1[0],1,1000);+HAL_SPI_Receive(&hspi1,&temp1[0],1,1000);是两个时种  还是 只发 HAL_SPI_Receive(&hspi1,&temp1[0],1,1000);就会出现两个时钟
 楼主| huarana 发表于 2018-10-1 22:49 来自手机 | 显示全部楼层
fclmyl2 发表于 2018-10-1 21:48
你是 先发 HAL_SPI_Receive(&hspi1,&temp1[0],1,1000);+HAL_SPI_Receive(&hspi1,&temp1[0],1,1000);是两个 ...

只用一次就是两个时钟,所以才奇怪。用两次就是3个时钟。比想要的多一个
HCDS-DREAM 发表于 2019-9-3 14:57 | 显示全部楼层
兄弟,我用L4也碰到这个问题了,bug吧
蝴蝶泉2018 发表于 2019-10-11 16:07 | 显示全部楼层

下面是原因和解决方式。
一般来说多发时钟脉冲是不影响接收数据的,本身接收函数中有接收数据个数判断。
如果修改函数库要慎重,不推荐这种方式。


SPI READONLY MODE.jpg
您需要登录后才可以回帖 登录 | 注册

本版积分规则

26

主题

1125

帖子

12

粉丝
快速回复 在线客服 返回列表 返回顶部