OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 320|回复: 2

求解STM32H750 SPI1作为从机回复错误的问题

[复制链接]

2

主题

9

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2019-10-16
在线时间
16 小时
发表于 2024-8-16 15:20:23 | 显示全部楼层 |阅读模式
20金钱
遇到的问题:STM32H750 (从机)能正确收到主机的消息,但是不知道为什么回复给主机的不正确,请大佬们不吝解答,感谢!!!

连接方式:其他MCU(主机)<--SPI1-->  STM32H750 (从机)

出错部分代码:STM32H750通过HAL_SPI_TransmitReceive()的方式接收,buf2接收到的内容正确,buf1应该是[1,100],但是主机收到的是100个0x02(通过逻辑分析仪证实)
                此函数返回HAL_TIMEOUT,通过调试发现__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_TXP)一直为0,可能压根没往发送寄存器里面写
  1. for (size_t i = 0; i < 100; i++)
  2. {
  3.        buf1[i] = i + 1;
  4. }

  5. HAL_SPI_TransmitReceive(&hspi1, buf1, buf2, 100, 1000);
复制代码


  1. while ((initial_TxXferCount > 0UL) || (initial_RxXferCount > 0UL))
  2.     {
  3.       /* Check the TXP flag */
  4.       if ((__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_TXP)) && (initial_TxXferCount > 0UL))
  5.       {
  6.         *((__IO uint8_t *)&hspi->Instance->TXDR) = *((const uint8_t *)hspi->pTxBuffPtr);
  7.         hspi->pTxBuffPtr += sizeof(uint8_t);
  8.         hspi->TxXferCount--;
  9.         initial_TxXferCount = hspi->TxXferCount;
  10.       }

  11.       /* Check the RXP flag */
  12.       if ((__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_RXP)) && (initial_RxXferCount > 0UL))
  13.       {
  14.         *((uint8_t *)hspi->pRxBuffPtr) = *((__IO uint8_t *)&hspi->Instance->RXDR);
  15.         hspi->pRxBuffPtr += sizeof(uint8_t);
  16.         hspi->RxXferCount--;
  17.         initial_RxXferCount = hspi->RxXferCount;
  18.       }

  19.       /* Timeout management */
  20.       if ((((HAL_GetTick() - tickstart) >=  Timeout) && (Timeout != HAL_MAX_DELAY)) || (Timeout == 0U))
  21.       {
  22.         /* Call standard close procedure with error check */
  23.         SPI_CloseTransfer(hspi);

  24.         /* Unlock the process */
  25.         __HAL_UNLOCK(hspi);

  26.         SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_TIMEOUT);
  27.         hspi->State = HAL_SPI_STATE_READY;
  28.         return HAL_TIMEOUT;
  29.       }
  30.     }
复制代码


初始化代码:
  1. void MX_SPI1_Slave_Init(void)
  2. {
  3. hspi1.Instance = SPI1;
  4. hspi1.Init.Mode = SPI_MODE_SLAVE;
  5. hspi1.Init.Direction = SPI_DIRECTION_2LINES;
  6. hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
  7. hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
  8. hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
  9. hspi1.Init.NSS = SPI_NSS_HARD_INPUT;
  10. hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
  11. hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
  12. hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  13. hspi1.Init.CRCPolynomial = 0x0;
  14. hspi1.Init.NSSPMode = SPI_NSS_PULSE_DISABLE;
  15. hspi1.Init.NSSPolarity = SPI_NSS_POLARITY_LOW;
  16. hspi1.Init.FifoThreshold = SPI_FIFO_THRESHOLD_01DATA;
  17. hspi1.Init.TxCRCInitializationPattern = SPI_CRC_INITIALIZATION_ALL_ZERO_PATTERN;
  18. hspi1.Init.RxCRCInitializationPattern = SPI_CRC_INITIALIZATION_ALL_ZERO_PATTERN;
  19. hspi1.Init.MasterSSIdleness = SPI_MASTER_SS_IDLENESS_00CYCLE;
  20. hspi1.Init.MasterInterDataIdleness = SPI_MASTER_INTERDATA_IDLENESS_00CYCLE;
  21. hspi1.Init.MasterReceiverAutoSusp = SPI_MASTER_RX_AUTOSUSP_DISABLE;
  22. hspi1.Init.MasterKeepIOState = SPI_MASTER_KEEP_IO_STATE_DISABLE;
  23. hspi1.Init.IOSwap = SPI_IO_SWAP_DISABLE;
  24. if (HAL_SPI_Init(&hspi1) != HAL_OK)
  25. {
  26. Error_Handler();
  27. }
  28. }
复制代码



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

4

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
291
金钱
291
注册时间
2023-8-22
在线时间
96 小时
发表于 2024-8-18 09:05:32 | 显示全部楼层
回复

使用道具 举报

58

主题

6291

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11405
金钱
11405
注册时间
2014-4-1
在线时间
1282 小时
发表于 2024-8-19 19:58:22 | 显示全部楼层

看波形。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 08:46

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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