Rs485 DE信号,有效时间和无效时间

时间:2018-07-26 14:11:37

标签: stm32 assertion stm32f4discovery rs485

我想通过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库的用户手册说的,应该使用它,我应该像在回调函数中一样使用它吗?

谢谢

1 个答案:

答案 0 :(得分:0)

首先,您应该记住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_TxCpltCallback HAL处理程序,则应确保USART1_IRQHandler调用HAL_USART_IRQHandler函数

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