SN65HVD230 CAN インターフェースと STM32 の統合実装マニュアル

1. 概要:SN65HVD230 CAN トランシーバモジュールの役割

自動車エレクトロニクスや産業制御、ロボット工学などの組み込み分野では、CAN(Controller Area Network)バスは標準的なデータ伝送経路として広く採用されています。本記事では、TI(Texas Instruments)製の SN65HVD230 チップを採用した CAN 物理層トランシーバモジュールの実装手順を解説します。このモジュールは、マイコン(MCU)内の CAN コントローラが出力するロジックレベル信号を、物理的な双対線路上で長距離伝送可能な差動信号へ変換する重要な役割を果たします。

従来、CAN 物理層の回路設計にはインピーダンス整合や共模抑制、ESD(静電気放電)対策など高度な知識が必要でした。しかし、今回の対象である SN65HVD230 ベースのモジュールはこれらの要素をあらかじめ解決しており、開発者は上層のプロトコル実装に注力することを可能にしています。特に STM32 系列や ESP32 といった 3.3V ロジックを持つプロセッサとの親和性が高く、シンプルかつ信頼性の高い接続を実現できます。

2. SN65HVD230 チップの技術的仕様解析

2.1 機能と動作原理

SN65HVD230 は 3.3V システム向けに設計された CAN 物理レイヤデバイスです。主に以下の二つの機能を担います:

  • 信号変換: MCU 側の TX(送信)ピンからの単端信号を、ISO 11898 規格に準拠した CAN_H および CAN_L の差動信号に変換して送出します。逆に、ライン上の差動信号を RX(受信)ピンのロジックレベル信号に戻す役割も持ちます。
  • 電気的保護: 内部的な保護回路により、電磁干渉(EMI)耐性及び±16kV 程度の ESD 耐性を備え、過酷な環境下でも安定した通信を維持します。

電源電圧は 3.3V で固定されており、現代の低消費電力マイクロコントローラと直接接続可能です。

2.2 ピン配置と周辺回路の要点

一般的なモジュールには 8Pin の DIP ソケットまたは SOIC パッケージが搭載されており、主要な端子は以下の通りです:

  • VCC / GND: 3.3V 電源入力。注意: 絶縁仕様ではない商用グレードの場合、定格超過となる 5V 供給は長期信頼性を損なうため避けてください。
  • TXD: MCU の CAN_TX に接続。ハイ状態時にバスを「隐性」(Recessive)にします。
  • RXD: MCU の CAN_RX に接続。バスが「顕性」(Dominant)のときのみ出力が Low になります。
  • CANH / CANL: CAN バス用の差動出力端子。
  • Rs: スルーレート制御抵抗接続ピン。
    • 接地した場合:高速モードとなり、最大 1Mbps の通信が可能ですが、高調波ノイズが増加します。
    • VCC 側に抵抗接続の場合:スルーレート制御モードとなります。抵抗値(例:10kΩ〜100kΩ)を変更することで立ち上がり時間を変化させ、EMI を低減できます。低速通信(125kbps 以下)や EMC 対策が必要な際に有効です。
  • Vref: VCC/2 の基準電圧出力。通常の用途では開放可能です。

モジュール基板上には、電源安定化のためのコンデンサや、TVS ダイオードによるサージ保護回路が実装されている場合があります。また、終端抵抗としての 120Ω抵抗のハンダ付けパッドが用意されていることが一般的です。

3. ハードウェア接続と設定

3.1 マイコンとの配線確認

基本的な接続は VCC、GND、TX、RX の 4 線です。以下の点に特に留意してください:

  1. アース共有: MC とトランシーバ間は必ず共通のアース电位を確保してください。異なる電源系を使用する場合は、適切なデカップリングを行います。
  2. レベルシフト: 5V システム(例:Arduino Uno)と 3.3V モジュールを混在させる場合、直接的な接続は禁止です。必ず両方向対応のレベル変換 IC(例:TXB0104)を経由させてください。
  3. GPIO マッピング: STM32F103 などでは PA11(CAN_RX) および PA12(CAN_TX) が通常割り当てられています。CubeMX 等を使用して Alternate Function に設定する必要があります。

3.2 終端抵抗と通信速度設定

CAN バスは反射波を防ぐため、ネットワークの物理的な両末端に 120Ωの終端抵抗が必要です。モジュール上のジャンパショート等でこれを切り替えられますが、バス途中のノードでは無効にするのが原則です。

Rs ピンの設定選択:

  • 高速構成: 500kbps 以上での通信や短距離運用時に推奨。単純な接続で動作します。
  • EMI 抑制構成: 長時間の配線や電子機器密集環境下では、Rs ピンを VCC へ数千オームから数十千オームで接続し、波形の傾斜を緩やかにすることでノイズを低減します。

4. STM32 HAL ライブラリを使用したソフトウェア実装

4.1 コントローラの初期化構成

ハードウェア準備の後、STM32 の bxCAN 機能を設定します。以下のコードは HAL ライブラリを用いた初期化プロセスの一部を示しています。

// CAN インスタンスハンドル定義
CAN_HandleTypeDef can_hndl;

// 本体設定
can_hndl.Instance = CAN1; // CAN1 モジュールを使用
can_hndl.Init.Mode = CAN_MODE_NORMAL; // 通常動作モード
can_hndl.Init.AutoBusOff = ENABLE; // エラー時自動バスオフ復帰
can_hndl.Init.AutoWakeUp = ENABLE; // バス活動検知によるウェイクアップ
can_hndl.Init.AutoRetransmission = ENABLE; // 自動再送信有効
can_hndl.Init.ReceiveFifoLocked = DISABLE; // FIFO ロック無効
can_hndl.Init.TransmitFifoPriority = DISABLE; // メッセージ優先度無効

// タイミングパラメータ設定(例:APB1 クロック 36MHz, 500kbps 目標)
// ポートクロック分周器とサンプリングポイントの調整が必要
can_hndl.Init.Prescaler = 4;      // クロック分周係数
can_hndl.Init.TimeSeg1 = CAN_BS1_14TQ; // ビットセグメント 1(サンプル点前)
can_hndl.Init.TimeSeg2 = CAN_BS2_2TQ;  // ビットセグメント 2(サンプル点后)
can_hndl.Init.SyncJumpWidth = CAN_SJW_1TQ; // 同期ジャンプ幅

if (HAL_CAN_Init(&can_hndl) != HAL_OK) {
    // 初期化エラー処理
}

ビットタイミングの計算は慎重に行ってください。実際の baudrate は(システム周波数 / (分周器 × (BS1 + BS2 + 1)))で算出されます。誤差が発生しないよう、オシロスコープ等で確認することをお勧めします。

4.2 フィルタリング設定

受信側では不要なメッセージの破棄をハードウェアレベルで行うため、フィルタバンクの設定が必要です。

CAN_FilterTypeDef filter_cfg;
filter_cfg.FilterBank = 0;
filter_cfg.FilterMode = CAN_FILTERMODE_IDMASK;
filter_cfg.FilterScale = CAN_FILTERSCALE_32BIT;
filter_cfg.FilterIdHigh = 0x0000; // 全 ID 許容用
filter_cfg.FilterIdLow = 0x0000;
filter_cfg.FilterMaskIdHigh = 0x0000;
filter_cfg.FilterMaskIdLow = 0x0000;
filter_cfg.FilterFIFOAssignment = CAN_RX_FIFO0;
filter_cfg.FilterActivation = ENABLE;

HAL_CAN_ConfigFilter(&can_hndl, &filter_cfg);
HAL_CAN_Start(&can_hndl); // 動作開始
HAL_CAN_ActivateNotification(&can_hndl, CAN_IT_RX_FIFO0_MSG_PENDING); // 受信割込み有効

4.3 データ送受信の処理フロー

送信処理:

uint8_t send_payload[8] = {0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF, 0x00, 0x11};
CAN_TxHeaderTypeDef tx_hdr;
uint32_t tx_mailbox_idx;

tx_hdr.StdId = 0x555;         // 標準フレーム ID
tx_hdr.IDE = CAN_ID_STD;      // 標準フレームタイプ
tx_hdr.RTR = CAN_RTR_DATA;    // データフレーム
tx_hdr.DLC = 8;               // データ長 8 バイト

// メッセージキューへの追加
HAL_CAN_AddTxMessage(&can_hndl, &tx_hdr, send_payload, &tx_mailbox_idx);

受信割込みハンドラ:

void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan) {
    CAN_RxHeaderTypeDef rx_hdr;
    uint8_t rcv_data[8];
    
    if (HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, &rx_hdr, rcv_data) == HAL_OK) {
        // 有効なメッセージ取得完了
        // ここに上位アプリケーションへの転記処理を実装
    }
}

5. トラブルシューティングと検証手法

5.1 通信不良時のチェックリスト

正常に動作しない場合、以下の順序で点検を行ってください。

  • バス電圧の確認: 隠性状態時は CAN_H と CAN_L がともに約 2.5V 付近になるべきです。常に高電圧であれば終端抵抗不足または配線断線を疑ってください。
  • 終端抵抗値: バス全体の抵抗値をマルチメータで測定します。末端に 120Ω抵抗が 2 箇所あれば、並列合成抵抗として 60Ω程度が表示されます。値が大きい場合は抵抗が接続されていない可能性があります。
  • 配線極性: CAN_H と CAN_L の入れ違いは発生しやすいエラーです。コネクタピン定義を確認してください。
  • 波形状態: オシロスコープを使用し、CAN_H/L の差動電圧(約 2V)と、立ち上がりのオーバーシュートを確認します。振動が激しい場合は配線長や接地の問題が生じている可能性があります。

5.2 ソフトウェア設定のエラー特定

  • 波特率ミスマッチ: 送信側と受信側でビットタイミングパラメータが完全に一致しているか確認してください。1bps でもズレがあると通信できません。「ループバックモード」を用いれば、外部配線なしで MCU 自身の送受信用途を検証できます。
  • フィルタによる遮断: 受信フィルタのマスク設定が厳しすぎるため、ID 不一致により全て破棄されているケースがあります。テスト時はマスク値を 0 に設定して全受信を試みてください。
  • エラーカウンター: HAL_CAN_GetError() 関数にてアラートを監視し、「Bus-Off」や「Error-Passive」状態になっていないか確認します。

6. 応用拡大と選定の指針

6.1 使用シーンと限界

SN65HVD230 はコストパフォーマンスに優れたオプションですが、すべての用途に適しているわけではありません。

  • 適している事例: 車載診断(OBD-II)、簡易な産業制御ネットワーク、教育用プロトタイピング、センサーデータの集約。
  • 注意点: 最高通信速度は 1Mbps です。より高速なデータ転送(CAN FD)が必要な場合は TCAN1042 などの新型デバイスを検討すべきです。
  • 絶縁要件: ノイズ源とノイズを受ける機器間に大電位差がある場合、非絶縁型の SN65HVD230 は危険です。ADM3053 や ISO1050 を使用した絶縁型モジュールへの移行を検討してください。

6.2 購入と自作の判断

市販の汎用モジュールは TVS ダイヤやコモンモードチョークコイル等の保護機能が備わっているため、初期検証には最適です。PCB を独自設計する場合は、高周波特性を考慮した配線レイアウト(地平面の確保、差分ペアの等長配線)が求められます。大量生産ではなく実機検証段階においては、既製モジュールの使用が最も効率的です。

タグ: CANバス STM32 SN65HVD230 HALライブラリ 組み込み開発,電気自動車,産業用オートメーション

8月25日 20:40 投稿