Posted at

HAL_Driverでu485通信を実装する

More than 1 year has passed since last update.


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;
}