打印
[STM32L0]

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

[复制链接]
2937|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组,永远比读的多了一组。


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

  hspi1.Instance = SPI1;
  hspi1.Init.Mode = SPI_MODE_MASTER;
  hspi1.Init.Direction = SPI_DIRECTION_1LINE;
  hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
  hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
  hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
  hspi1.Init.NSS = SPI_NSS_SOFT;
  hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16;
  hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
  hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
  hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  hspi1.Init.CRCPolynomial = 7;
  if (HAL_SPI_Init(&hspi1) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

}


沙发
1053356130| | 2018-9-27 10:29 | 只看该作者
找到问题了吗

使用特权

评论回复
板凳
huarana|  楼主 | 2018-9-28 17:41 | 只看该作者

没有找到 - -!

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

使用特权

评论回复
地板
戈卫东| | 2018-9-28 20:22 | 只看该作者
印象中SPI的FIFO会根据写入字长设置FIFO的内容。。

使用特权

评论回复
5
huarana|  楼主 | 2018-9-29 22:54 | 只看该作者
戈卫东 发表于 2018-9-28 20:22
印象中SPI的FIFO会根据写入字长设置FIFO的内容。。

stm32L0单片机的spi资料里没找到fifo  ,可能就没有fifo

使用特权

评论回复
6
sky.sun.zz| | 2018-9-30 07:22 | 只看该作者
HAL_SPI_TransmitReceive(&SpiHandle, (uint8_t*)aTxBuffer, (uint8_t *)aRxBuffer, BUFFERSIZE, 5000);
强制8位操作应该就可以了

使用特权

评论回复
7
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位的
HAL_StatusTypeDef HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout)


另外 如果设成16bit发送的话也会多一组。

使用特权

评论回复
8
yiy| | 2018-9-30 16:32 | 只看该作者
那么最后正常了吗

使用特权

评论回复
9
chenqiang10| | 2018-9-30 18:50 | 只看该作者
这个是设么原因引起的?

使用特权

评论回复
10
磨砂| | 2018-10-1 16:43 | 只看该作者
示波器怎么显示的?

使用特权

评论回复
11
huarana|  楼主 | 2018-10-1 20:18 | 只看该作者
yiy 发表于 2018-9-30 16:32
那么最后正常了吗

没正常,我吧hal库里的函数重写了才好,但是还是不知道原因。

使用特权

评论回复
12
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);就会出现两个时钟

使用特权

评论回复
13
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个时钟。比想要的多一个

使用特权

评论回复
14
HCDS-DREAM| | 2019-9-3 14:57 | 只看该作者
兄弟,我用L4也碰到这个问题了,bug吧

使用特权

评论回复
15
蝴蝶泉2018| | 2019-10-11 16:07 | 只看该作者

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


SPI READONLY MODE.jpg (216.58 KB )

SPI READONLY MODE.jpg

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

26

主题

1123

帖子

12

粉丝