STM32G4 FD-CAN in Normal Mode

はじめに

車載ネットワークの主流バスとしてCAN(Controller Area Network)とFD-CAN(FDCAN/CANFD/CAN-FD/CAN with Flexible Data rate)、IEEE11898で規格化されているCANの通信速度は最大で1Mbpsであり,同じくCAN FDでは最大5Mbps(ただし,IEEEの規格上では最大2Mbps)となっている。とはいえ、8MbpsはFD-CANの通信速度としても可能だという。今後CANはFD-CANに置き換えられると予想される。STM32ファミリーには、STM32G0、STM32G4、STM32H7、STM32L5、STM32MP1シリーズはFD-CANコントローラ内蔵で、別途FD-CANトランシーバだけを用意すると良い。今回はSTM32G474とMicrochip製FD-CANトランシーバのMCP2562FDを使ってFD-CANの送受信を確かめていこう。

テスト環境

・IDE環境 STM32CubeIDE 1.12.0 @UBUNTU 22.04(iMACの画面は大きく、スクリーンショットの字は小さく写るため予めご容赦ください)
・マイコン/評価ボード STM32G474(FD-CAN1&FD-CAN2) / NUCLEO-G474RE(MB1367C) x 1pcs
・FD-CANトランシーバ MCP2562FD x 2pcs
・差動線FD-CAN_H、FD-CAN_Lを跨ぐ抵抗器  120R x 2pcs
・デカップリング用コンデンサ  0.1uF x 4pcs
・差動波形観察 オシロスコープ

確認内容

・FD-CAN1、FD-CAN2と往復ピンポン送受信確立
・差動信号の波形、データスループット=2Mbps

配線関連

FD-CAN周辺の回路図は以下のとおり掲載しておく。

stm32g474-mcp2562fd-fdcan-schematic
stm32g474-mcp2562fd-fdcan-schematic

実の配線済みテストセットの写真を以下のとおり掲載しておく。

stm32g4-fdcan-test-connection
stm32g4-fdcan-test-connection

マイコン設定

STM32CubeIDEのioc/Pinout & Configuration/Sys Mode and Configuration、Pinout View、ioc/Clock Configrationを以下のとおり掲載しておく。

stm32g4-fdcan-ioc
stm32g4-fdcan-ioc

stm32g4-fdcan-clock
stm32g4-fdcan-clock

FD-CAN設定

FD-CAN関連パラメータの値は、唯一ではなくスループットとサンプリングポイントの兼ね合いを見ながら、STM32CubeIDEが受け入れるまで調整していく。実に使用したパラメータは、以下のとおり掲載しておく。パラメータの計算また調整は、KVASER(オンライン計算サイト)を利用すると便利になる。ただし、Frequency=FD-CANクロック周波数、上図から抽出して、Tolerance=FD-CANクロック周波数公差、本文ではHSIによる値でSTM32G474のデータシートから抽出して、Node Delay= FD-CANトランシーバ遅延(厳密ではない)、本文ではMCP2562FDのデータシートから予め抽出しておく。

stm32g474-fdcan-parameters
stm32g474-fdcan-parameters

決まったパラメータの値は、以下のとおり入力しておく。Nominal Field、Data Fieldに関わるパラメータは別々、FD-CAN2とFD-CAN1のパラメータは同じなので、コピペして良い。

stm32g4-fdcan-parameter
stm32g4-fdcan-parameter

stm32g4-fdcan-fdcan1-interrupt
stm32g4-fdcan-fdcan1-interrupt

リポジトリ

STM32プロジェクトはリポジトリとして、github.com/soarbear/stm32g4-fdcanに公開済み。

送受信データ

FD-CAN2においてFD-CAN1から送信した32バイトデータを受信して、それらのデータに1を足して、FD-CAN1に返す。FD-CAN1においてFD-CAN2から送信した32バイトデータを受信して、それらのデータに1を足して、FD-CAN1に返す。このようにやり取りを繰り返す。受信したデータは以下のとおり掲載しておく。NUCLEOにST-LINKデバッガはオンボードなので、別途ST-LINKデバッガ、シリアルケーブル使わなくても、SWV ITM ConsoleつまりSTM32CubeIDEコンソールにデータを表示させることにした。それに伴ってSWV/SWOの設定は必要になる。SWV/SWOの設定については、本サイトの関連記事「SWO/SWV with STM32CubeIDE」をご参考にしてください。

stm32g4-fdcan-normalMode-rxData
stm32g4-fdcan-normalMode-rxData

差動波形

FD-CAN_H、FD-CAN_Lの差動波形は以下のとおり掲載しておく。

stm32g474-fdcan-wave
stm32g474-fdcan-wave

データビットタイムは0.5usと確認できたので、データフィールドのスループットは2Mbpsと推定される。また、残件事項として他のパラメータAuto Retransmission、Transmit Pauseはとりあえず、Disableにしておいたので、他の機会で動作確認することにする。

参考資料

・「車載ネットワーク入門」、インターフェース2021年12月号
・「NUCLEO-G4 User Manual」、ST Electronics
・「MCP2561/2FD フレキシブル データレート対応高速 CAN トランシーバ」、MICROCHIP
・「Datasheet – STM32G474xB STM32G474xC STM32G474xE」、ST Electronics

あとがき

FD-CAN規格のパラメータは多く、開発に当たって決して短時間で決められるものではない、設計要件に合わせて実験を重ねて確認していく必要がある。

0

ロボット・ドローン部品お探しなら
ROBOT翔・電子部品ストア

rosserialをSTM32F4に対応させてみる

はじめに

rosserialは、ROSノードらをシリアルで繋ぐ役割を果たすROSパッケージとしてよく知られている。但し、ArduinoノードとしてSTM32F4は公式に対応されておらず、今回はROS melodicベースのArduinoノード(STM32F411CEU6搭載の開発ボード、通称Balck pill)にrosserialを立ち上げてみた。ソースコードはGithubに公開済み。ROS melodicにおいて動作確認済み。

ソースコード

https://github.com/soarbear/stm32f4_rosseialリポジトリーとして公開済み。

環境

ターゲットボード(MCU) Black pill(STM32F411CEU6実装)
コンパイル環境 Arduino V1.8.13
テスト環境 Ubuntu 18.04 / ROS melodic

参考文献

rosserial melodic-devel branch@Github

0

ロボット・ドローン部品お探しなら
ROBOT翔・電子部品ストア

外部32.768KHzクリスタルからSAMD21クロック設定まで

はじめに

外部32.768KHz水晶発振子からSAMD21クロックを48MHzに設定する手順、ソースをメモにしておく。

設定手順

1. DFLL48Mリファレンスとして使用されるXOSC32Kクロック(オンボード外部32.768Hzクリスタル)を有効にする。
2. XOSC32Kを汎用クロックジェネレーター1として使用する。
3. 汎用クロックジェネレータ1を汎用クロックマルチプレクサ0(DFLL48Mリファレンス)のソースとして使用する。
4. DFLL48Mクロックを有効にする。
5. 汎用クロックジェネレータ0をDFLL48Mに切り替える。
6. CPUのクロックは48MHzで動作する。

ソースコード

下記参考資料から抜粋したソースは以下のとおり。

/* Set 1 Flash Wait State for 48MHz, cf tables 20.9 and 35.27 in SAMD21 Datasheet */
NVMCTRL->CTRLB.bit.RWS = NVMCTRL_CTRLB_RWS_HALF_Val ;

/* Turn on the digital interface clock */
PM->APBAMASK.reg |= PM_APBAMASK_GCLK ;

/* Enable XOSC32K clock (External on-board 32.768Hz oscillator) */
SYSCTRL->XOSC32K.reg = SYSCTRL_XOSC32K_STARTUP( 0x6u ) | /* cf table 15.10 of product datasheet in chapter 15.8.6 */
                       SYSCTRL_XOSC32K_XTALEN | SYSCTRL_XOSC32K_EN32K ;
SYSCTRL->XOSC32K.bit.ENABLE = 1 ; /* separate call, as described in chapter 15.6.3 */
while ( (SYSCTRL->PCLKSR.reg & SYSCTRL_PCLKSR_XOSC32KRDY) == 0 )
{
  /* Wait for oscillator stabilization */
}

/* Software reset the module to ensure it is re-initialized correctly */
GCLK->CTRL.reg = GCLK_CTRL_SWRST ;
while ( (GCLK->CTRL.reg & GCLK_CTRL_SWRST) && (GCLK->STATUS.reg & GCLK_STATUS_SYNCBUSY) )
{
  /* Wait for reset to complete */
}

/* Put XOSC32K as source of Generic Clock Generator 1 */
GCLK->GENDIV.reg = GCLK_GENDIV_ID( GENERIC_CLOCK_GENERATOR_XOSC32K ) ; // Generic Clock Generator 1
while ( GCLK->STATUS.reg & GCLK_STATUS_SYNCBUSY )
{
  /* Wait for synchronization */
}

/* Write Generic Clock Generator 1 configuration */
GCLK->GENCTRL.reg = GCLK_GENCTRL_ID( GENERIC_CLOCK_GENERATOR_OSC32K ) | // Generic Clock Generator 1
                    GCLK_GENCTRL_SRC_XOSC32K | // Selected source is External 32KHz Oscillator
//                  GCLK_GENCTRL_OE | // Output clock to a pin for tests
                    GCLK_GENCTRL_GENEN ;
while ( GCLK->STATUS.reg & GCLK_STATUS_SYNCBUSY )
{
  /* Wait for synchronization */
}

/* Put Generic Clock Generator 1 as source for Generic Clock Multiplexer 0 (DFLL48M reference) */
GCLK->CLKCTRL.reg = GCLK_CLKCTRL_ID( GENERIC_CLOCK_MULTIPLEXER_DFLL48M ) | // Generic Clock Multiplexer 0
                  GCLK_CLKCTRL_GEN_GCLK1 | // Generic Clock Generator 1 is source
                  GCLK_CLKCTRL_CLKEN ;
while ( GCLK->STATUS.reg & GCLK_STATUS_SYNCBUSY )
{
  /* Wait for synchronization */
}

/* Enable DFLL48M clock */  
SYSCTRL->DFLLCTRL.reg = SYSCTRL_DFLLCTRL_ENABLE;
while ( (SYSCTRL->PCLKSR.reg & SYSCTRL_PCLKSR_DFLLRDY) == 0 )
{
  /* Wait for synchronization */
}
SYSCTRL->DFLLMUL.reg = SYSCTRL_DFLLMUL_CSTEP( 31 ) | // Coarse step is 31, half of the max value
                       SYSCTRL_DFLLMUL_FSTEP( 511 ) | // Fine step is 511, half of the max value
                       SYSCTRL_DFLLMUL_MUL( (VARIANT_MCK + VARIANT_MAINOSC/2) / VARIANT_MAINOSC ) ; // External 32KHz is the reference
while ( (SYSCTRL->PCLKSR.reg & SYSCTRL_PCLKSR_DFLLRDY) == 0 )
{
  /* Wait for synchronization */
}

/* Write full configuration to DFLL control register */
SYSCTRL->DFLLCTRL.reg |= SYSCTRL_DFLLCTRL_MODE | /* Enable the closed loop mode */
                         SYSCTRL_DFLLCTRL_WAITLOCK |
                         SYSCTRL_DFLLCTRL_QLDIS ; /* Disable Quick lock */
while ( (SYSCTRL->PCLKSR.reg & SYSCTRL_PCLKSR_DFLLRDY) == 0 )
{
  /* Wait for synchronization */
}

/* Enable the DFLL */
SYSCTRL->DFLLCTRL.reg |= SYSCTRL_DFLLCTRL_ENABLE ;
while ( (SYSCTRL->PCLKSR.reg & SYSCTRL_PCLKSR_DFLLLCKC) == 0 ||
        (SYSCTRL->PCLKSR.reg & SYSCTRL_PCLKSR_DFLLLCKF) == 0 )
{
  /* Wait for locks flags */
}
while ( (SYSCTRL->PCLKSR.reg & SYSCTRL_PCLKSR_DFLLRDY) == 0 )
{
  /* Wait for synchronization */
}

/* Switch Generic Clock Generator 0 to DFLL48M. CPU will run at 48MHz. */
GCLK->GENDIV.reg = GCLK_GENDIV_ID( GENERIC_CLOCK_GENERATOR_MAIN ) ; // Generic Clock Generator 0
while ( GCLK->STATUS.reg & GCLK_STATUS_SYNCBUSY )
{
  /* Wait for synchronization */
}

/* Write Generic Clock Generator 0 configuration */
GCLK->GENCTRL.reg = GCLK_GENCTRL_ID( GENERIC_CLOCK_GENERATOR_MAIN ) | // Generic Clock Generator 0
                    GCLK_GENCTRL_SRC_DFLL48M | // Selected source is DFLL 48MHz
//                  GCLK_GENCTRL_OE | // Output clock to a pin for tests
                    GCLK_GENCTRL_IDC | // Set 50/50 duty cycle
                    GCLK_GENCTRL_GENEN ;
while ( GCLK->STATUS.reg & GCLK_STATUS_SYNCBUSY )
{
  /* Wait for synchronization */
}

参考資料

ArduinoCore-samd | Github

0

ロボット・ドローン部品お探しなら
ROBOT翔・電子部品ストア

PCBをJLCPCBに発注してみた

はじめに

今回は、PCB生産を評判の良いJLC(嘉立創、深せん市)に任せてみたので、お問い合せからPCBが届くまでの経過をメモにしておく。

お問い合せ

英文のサイトに、対応もサイトから英文でLive chat可能、土日含めて何回もリクエストを出してほぼ待たさずにすぐに返事が来る。リクエストへ回答の質も良く、PCBに詳しい、プロの印象を受けた。のちほど自分が注文のオプション設定にミスを犯して向こうエンジニアの経験で自主回避して細心の注意を払っていることが分かった。

発注

1回発注するとあとはスムーズにいくはず、質問があるとすぐ聞けるので大きな支障がなかった。ホームページは使いやすいほうと。今回12cm寸法のPCB 5枚にサイズ16cmのステンシルを1枚依頼した。GerbビュアーがついてUploadのあとで便利に確認できる。ところで、何故かクーポンの使えるところがいないではないかと聞いたら、すぐ「ご迷惑をかけた」と謝った。

生産

16日(金)夕方の発注からステンシルは16日(金)22時頃の開始~18日(日)14時頃、PCBは21日(水)6時頃の完成、約5.3日間かかった。予定の3日間を超えた。以下履歴画面と見ると、生産のプロセス、スケジュール、いま現在のステータスが明確になっている。また、今回は不透明レジストを聞いたら、対応できないと即答してくれた。ごく普通に依頼した。

決済

送料込み4,400円ほど。支払いにJPay、クレジット、Paypalが使える。JPayについては説明を見ると銀行の振込みみたいなので申し込みが必要。追記:カード決済の場合、3~4パーセント加算、恐らくカード決済手数料だろうか、この点においては優しくない。

配送

送料の高い順からDHL、SFexpress、ダイレクトメールが選べる。1kgなら2000円未満。今回の配送はDHLを選んで、深せん~香港~届くまで、約5日間かかった。梱包はしっかりしている。

検収

目視検査および回路の動作を確認済み。シルクはセラミックのようにきれいに見えて繊細の表現までできている。

所感

依頼したあとで企業情報を調べてみると大きな工場を持つ企業であることと分かった。電子部品のほとんどは東南アジア生産なので、コストのみならず物流の利便性からみても深せんのほうは都合が良いかもしれない。きちんと生産、技術、社会貢献に注力する企業ならば支持すべきだと思う。同社の部品サイトLCSCは、まだDIGIKEY、MOUSERほど部品が揃っていないのでこれからと期待する。

jlcpcb-order
jlcpcb-order
1+

ロボット・ドローン部品お探しなら
ROBOT翔・電子部品ストア

SAMDへファームウェアを書き込む

はじめに

Micrpchip SAMDシリーズMCUへUSB(Windows CMDプロンプトまたは、Ubuntu ターミナル)/J-Link(Micochip Studio)経由でサードパティツールbossacを利用して、ファームウェアの書き込みの例を以下に記す。※USBポート番号とBIN/HEXファイルのパスに実際に使用中のものを入れ替える。

bossacインストール

Arduino IDE ツール→ボード→ボードマネージャ→ボード検索(ボード名を検索ボックスに入れる)→インストールの順で、bossacをインストールしておく。

Ubuntuターミナルから

sudo ~/snap/arduino/50/.arduino15/packages/arduino/tools/bossac/1.7.0-arduino3/bossac -i -d --port=ttyACM0 -U true -i -e -w -v path_to_sample.bin -R 

関連して、USBポートに関わるコマンドは以下のとおり。

lsb -l /dev/ttyACM0
sudo chmod 777 /dev/ttyACM0
sudo adduser $USER dialout

Windows CMDプロンプトから

C:\Users\user\AppData\Local\Arduino15\packages\arduino\tools\bossac\1.7.0-arduino3/bossac.exe -i -d --port=COM5 -U true -i -e -w -v path_to_sample.bin -R 

Microchip Studioから

Microchip Studio立ち上げ → J-Link接続 → Device Programing → Fuses → Memoriesの順に書き込んでいく。

amtel_studio_bin_fuses
amtel_studio_bin_fuses

amtel_studio_bin_upload
amtel_studio_bin_upload

参考情報

Use verbose output in the Arduino IDE
bossac@github/shumatech

1+

ロボット・ドローン部品お探しなら
ROBOT翔・電子部品ストア