首页 > 解决方案 > Rs485 DE信号,置位时间和置位时间

问题描述

我想通过 rs485 发送和接收数据。我有一个 stm32 发现,我通过 rs485 连接到设备。因此,对于发送和接收,我必须激活和停用 DE,方向控制线,

我不明白断言时间的事情,它说我应该根据过采样时间选择一个断言时间和解除断言时间,我有过采样16。

相反,我所做的不是将 mcu 上的 Pin 用于 rs485 功能,而是使用一个应该(根据我 :))工作的随机输出引脚,但它确实如此,是我这样做了:

  while (1)
   {


HAL_GPIO_WritePin(GPIOB,SHDN_Linear_Pin,GPIO_PIN_SET);

HAL_UART_Transmit_IT(&huart1, (uint8_t *)bufftx ,strlen(bufftx));
HAL_UART_Receive_IT(&huart1, buffrx, 10);
HAL_Delay(1000);
 /* USER CODE END WHILE */

 /* USER CODE BEGIN 3 */

 }

当我执行 SET 时,WritePin 函数起作用,它发送数据,之后它应该转到下面的函数并重置 PIN 以便我可以接收,但它不会重置。也许我必须使用延迟,我会测试一下。

/* USER CODE BEGIN 4 */
 void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
  {
  /* Prevent unused argument(s) compilation warning */
  UNUSED(huart);

  HAL_GPIO_WritePin(GPIOB,SHDN_Linear_Pin,GPIO_PIN_RESET);

 /* NOTE : This function Should not be modified, when the callback is needed,
        the HAL_UART_TxCpltCallback could be implemented in the user file
   */ 
  }
  /* USER CODE END 4 */

但这是一种好方法吗,有人可以解释一下我应该如何使用断言时间吗?在发送数据之前,我所做的是否足够快以使 DE 线变低?

  HAL_StatusTypeDef HAL_RS485Ex_Init
      (UART_HandleTypeDef * huart, uint32_t Polarity, uint32_t
      AssertionTime, uint32_t DeassertionTime 

这就是 hal 库的用户手册所说的应该使用的内容,我应该像在回调函数中那样使用它吗?

谢谢

标签: stm32assertionstm32f4discoveryrs485

解决方案


首先要记住RS485是半双工接口,不能同时发送和接收数据。您正在使用畅通无阻的功能(由 IT 传输),因此此代码不正确:

while (1)
{
    HAL_GPIO_WritePin(GPIOB,SHDN_Linear_Pin,GPIO_PIN_SET);

    HAL_UART_Transmit_IT(&huart1, (uint8_t *)bufftx ,strlen(bufftx));
    HAL_UART_Receive_IT(&huart1, buffrx, 10);
    HAL_Delay(1000);
}

您应该在接收之前检查 TX 状态或使用阻塞功能,例如HAL_UART_Transmit

while (1)
{
    HAL_GPIO_WritePin(GPIOB,SHDN_Linear_Pin,GPIO_PIN_SET);

    g_is_tx_complete = false;
    HAL_UART_Transmit_IT(&huart1, (uint8_t *)bufftx ,strlen(bufftx));

    while(!g_is_tx_complete)
    {

    }

    HAL_UART_Receive_IT(&huart1, buffrx, 10);
    HAL_Delay(1000);
}

其次,我不明白你没有收到 TX Complete 中断。我没有看到所有代码,但您应该通过 NVIC 启用中断并控制寄存器,如下所示:

/* Enable RXNE interrupt */
USART_ITConfig(USART1, USART_IT_RXNE | USART_IT_TXC, ENABLE);
/* Enable USART1 global interrupt */
NVIC_EnableIRQ(USART1_IRQn);

如果您使用HAL_UART_TxCpltCallbackHAL 处理程序,则应确保USART1_IRQHandler调用该HAL_USART_IRQHandler函数

void USART1_IRQHandler(void)
{
    HAL_USART_IRQHandler(&huart1);
}

推荐阅读