无聊到发博客的菜鸟 2024-08-16 15:27 采纳率: 0%
浏览 7

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

遇到的问题: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,可能压根没往发送寄存器里面写

for (size_t i = 0; i < 100; i++)
{
       buf1[i] = i + 1;
}

HAL_SPI_TransmitReceive(&hspi1, buf1, buf2, 100, 1000);
while ((initial_TxXferCount > 0UL) || (initial_RxXferCount > 0UL))
    {
      /* Check the TXP flag */
      if ((__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_TXP)) && (initial_TxXferCount > 0UL))
      {
        *((__IO uint8_t *)&hspi->Instance->TXDR) = *((const uint8_t *)hspi->pTxBuffPtr);
        hspi->pTxBuffPtr += sizeof(uint8_t);
        hspi->TxXferCount--;
        initial_TxXferCount = hspi->TxXferCount;
      }

      /* Check the RXP flag */
      if ((__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_RXP)) && (initial_RxXferCount > 0UL))
      {
        *((uint8_t *)hspi->pRxBuffPtr) = *((__IO uint8_t *)&hspi->Instance->RXDR);
        hspi->pRxBuffPtr += sizeof(uint8_t);
        hspi->RxXferCount--;
        initial_RxXferCount = hspi->RxXferCount;
      }

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

        /* Unlock the process */
        __HAL_UNLOCK(hspi);

        SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_TIMEOUT);
        hspi->State = HAL_SPI_STATE_READY;
        return HAL_TIMEOUT;
      }
    }

初始化代码:

void MX_SPI1_Slave_Init(void)
{
hspi1.Instance = SPI1;
hspi1.Init.Mode = SPI_MODE_SLAVE;
hspi1.Init.Direction = SPI_DIRECTION_2LINES;
hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
hspi1.Init.NSS = SPI_NSS_HARD_INPUT;
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi1.Init.CRCPolynomial = 0x0;
hspi1.Init.NSSPMode = SPI_NSS_PULSE_DISABLE;
hspi1.Init.NSSPolarity = SPI_NSS_POLARITY_LOW;
hspi1.Init.FifoThreshold = SPI_FIFO_THRESHOLD_01DATA;
hspi1.Init.TxCRCInitializationPattern = SPI_CRC_INITIALIZATION_ALL_ZERO_PATTERN;
hspi1.Init.RxCRCInitializationPattern = SPI_CRC_INITIALIZATION_ALL_ZERO_PATTERN;
hspi1.Init.MasterSSIdleness = SPI_MASTER_SS_IDLENESS_00CYCLE;
hspi1.Init.MasterInterDataIdleness = SPI_MASTER_INTERDATA_IDLENESS_00CYCLE;
hspi1.Init.MasterReceiverAutoSusp = SPI_MASTER_RX_AUTOSUSP_DISABLE;
hspi1.Init.MasterKeepIOState = SPI_MASTER_KEEP_IO_STATE_DISABLE;
hspi1.Init.IOSwap = SPI_IO_SWAP_DISABLE;
if (HAL_SPI_Init(&hspi1) != HAL_OK)
{
Error_Handler();
}
}

  • 写回答

3条回答 默认 最新

  • 一直免费一直爽 2024-08-16 15:28
    关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    从你的描述和代码来看,可能的原因是SPI的发送缓冲区没有被正确填充。在你的代码中,你使用了HAL_SPI_TransmitReceive()函数,但是在发送数据之前,你需要确保发送缓冲区已经被正确填充。

    你可以尝试以下方法来解决这个问题:

    1. 在调用HAL_SPI_TransmitReceive()之前,确保发送缓冲区已经被正确填充。例如:
    for (size_t i = 0; i < 100; i++)
    {
        hspi1.pTxBuffPtr[i] = i + 1;
    }
    
    1. 确保在调用HAL_SPI_TransmitReceive()时,传递正确的参数。例如:
    HAL_SPI_TransmitReceive(&hspi1, hspi1.pTxBuffPtr, buf2, 100, 1000);
    
    1. 检查SPI的初始化设置是否正确。特别是NSS(片选信号)的配置,确保它与你的硬件连接相匹配。在你的代码中,NSS被设置为SPI_NSS_HARD_INPUT,这意味着NSS信号是由外部设备控制的。请确保主机正确地控制了NSS信号。

    2. 如果问题仍然存在,建议使用调试器或逻辑分析仪来检查SPI线上的实际信号。这将帮助你确定问题是否出在硬件连接上,还是软件配置上。

    评论

报告相同问题?

问题事件

  • 修改了问题 8月16日
  • 修改了问题 8月16日
  • 创建了问题 8月16日

悬赏问题

  • ¥66 关于川崎机器人调速问题
  • ¥15 winFrom界面无法打开
  • ¥15 crossover21 ARM64版本安装软件问题
  • ¥15 mymetaobjecthandler没有进入
  • ¥15 mmo能不能做客户端怪物
  • ¥15 osm下载到arcgis出错
  • ¥15 Dell g15 每次打开eiq portal后3分钟内自动退出
  • ¥200 使用python编写程序,采用socket方式获取网页实时刷新的数据,能定时print()出来就行。
  • ¥15 matlab如何根据图片中的公式绘制e和v的曲线图
  • ¥15 我想用Python(Django)+Vue搭建一个用户登录界面,但是在运行npm run serve时报错了如何解决?