LoginSignup
1
0

More than 5 years have passed since last update.

HAL_Driverでu485通信を実装する

Posted at

HAL_Driverでu485通信を実装する

  • HAL_Driverを使ってu485の通信を実装します
  • u485の通信を実装する場合はUartに加えてピンの制御が必要になります
  • 使用するマイコンの使用に合わせて各ピンの設定をしていることを前提としています

環境

  • stm32f系のマイコン
  • HAL_Driver

u485通信時のピン制御

  • 受信時はdeピン,reピンをLowにする
  • 送信時はdeピン,reピンをHighにする
  • 各ピンをHighにする場合はreピン, deピンの順番でHighにする
    • deピンだけがHighになる状態にしない

実装

  • UARTで使用するTx, Rxのピンに加えてRE, DEのピン設定をOUTPUTに設定します

    • ピンの設定はCubeMX等を使用すると良いです
  • UARTハンドルを含む構造体を宣言しておくと便利です


typedef struct {
  UART_HandleTypeDef* huart;
  uint32_t de_pin;
  uint32_t re_pin;
  GPIO_TypeDef* de_port;
  GPIO_TypeDef* re_port;
} u485_HandleTypeDef;

  • 送信時は送信前に各PINをHighにします

// ピン設定は各環境に合わせてください
#define RE_PIN GPIO_PIN_XX
#define RE_PORT GPIOB
#define DE_PIN GPIO_PIN_XX
#define DE_PORT GPIOB

#define TIMEOUT 100

void u485_transmit(u485_HandleTypeDef* hu485, uint8_t* tx_buffer, uint16_t tx_size) {
  // 送信を有効にする
  HAL_GPIO_WritePin(hu485->re_port, hu485->re_pin, GPIO_PIN_SET);
  HAL_GPIO_WritePin(hu485->de_port, hu485->de_pin, GPIO_PIN_SET);

  // 送信
  HAL_UART_Transmit(hu485->huart, tx_buffer, tx_size, TIMEOUT);

  // 受信待機状態にする
  HAL_GPIO_WritePin(hu485->de_port, hu485->de_pin, GPIO_PIN_RESET);
  HAL_GPIO_WritePin(hu485->re_port, hu485->re_pin, GPIO_PIN_RESET);
}

bool u485_receive(u485_HandleTypeDef* hu485, uint8_t* rx_buffer, uint16_t rx_size) {
  // 受信
  return HAL_UART_Receive(hu485->huart, rx_buffer, rx_size, TIMEOUT) == HAL_OK;
}
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0