stm32 HAL库spi接收的同时为什么有数据发送出去的解答

STM32 电子创客营 4883次浏览 已收录 0个评论 扫描二维码

    有时候不得不吐槽一下st封装的hal库,有时候用起来很方便,有时候却给人造成麻烦,找半天找不出来问题,还要深入去看他封装的库。就如标题所述,在调试spi 中断方式接收数据的时候却发现MOSI线上同样有数据发出去。并且发出去的数据也就是我之前接收到的数据。可事实是我并没有去操作让spi发送数据。

    查了半天终于发现根本问题还是hal库上面去,封装这个函数的人不知道怎么想的,会这样设计。先看下我原来调用中断接收的这个函数:

HAL_StatusTypeDef HAL_SPI_Receive_IT(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size)
{
  HAL_StatusTypeDef errorcode = HAL_OK;

  if((hspi->Init.Direction == SPI_DIRECTION_2LINES) && (hspi->Init.Mode == SPI_MODE_MASTER))
  {
     hspi->State = HAL_SPI_STATE_BUSY_RX;
     /* Call transmit-receive function to send Dummy data on Tx line and generate clock on CLK line */
     return HAL_SPI_TransmitReceive_IT(hspi, pData, pData, Size);
  }

     这个列举了一部分,可以看到HAL_SPI_Receive最终还是调用了HAL_SPI_TransmitReceive 这个函数。重点看下他的参数,把发送和接收的缓冲区都指向了pData 。这样我pData里面遗留的上次接收到的数据这次肯定是要被发送出去了。找到原因肯定要解决。我目的是在接收的时候让MOSI一直保持低电平,也就是相当于mosi上的数据一直是0x00就ok了。

    要实现这个目的同时不修改hal库的封装调用HAL_SPI_Receive_IT这个函数肯定是不行了。那我干脆直接调用HAL_SPI_TransmitReceive 就行了,我手动指定发送缓冲区,让他发送0就行了。如下所示:hspi1.State = HAL_SPI_STATE_BUSY_RX;这句话是不能丢的

hspi1.State = HAL_SPI_STATE_BUSY_RX;
HAL_SPI_TransmitReceive_IT(&hspi1,adas3022Data.wbuf,(adas3022Data.rbuf+adas3022Data.numberCounter*2),1);


转载请注明转自电子创客营:stm32 HAL库spi接收的同时为什么有数据发送出去的解答! 了解我们点击这里

微信扫一扫关注我们的公众号:eemaker

stm32 HAL库spi接收的同时为什么有数据发送出去的解答


喜欢 (5)or分享 (0)
电子创客营
关于作者:

您必须 登录 才能发表评论!