しろうさぎのblog

元ロボカッパー(ジュニアBオープン)でレスコンに参加していました。次はロボカップSSLに参加予定です。気が向いたときにいろいろ書いていきます。

STM32G4でのCLASSICモードでCAN通信をする

どうも,お久しぶりです.しろうさぎです.

今回はG4でのCLASSICモードでCAN通信をする方法について解説します.

といっても備忘録的な感じで記述するので雑になると思いますがご容赦ください.

G4ではFDCANにすべてなっているのでAPIとか構造体が結構今までのF4などのCANと違っています.
その違いを示す感じで行きたいと思います.
参考:STM32CubeHALでCAN通信をする(F4やF3での今までのCANの使い方)

ネット上でのFDCANの資料もないんですが,G4でCLASSICモードでCANを使う記事も全く見当たらないので誰かの助けになっていたら幸いです.


それでは,Cubeでの設定は今までと変わらないので割愛します.
構造体や受信データを入れる配列等を宣言します.
FDCAN_TxHeaderTypeDef  TxHeader;
FDCAN_RxHeaderTypeDef  RxHeader;
FDCAN_FilterTypeDef  sFilterConfig;

uint8_t               TxData[8];
uint8_t               RxData[8];
uint32_t              TxMailbox;
ハンドラーとか大体CANがFDCANって名前になっています.

次にCANフィルタの記述
ここで,IDMASKにして0x000なので全IDを受信する設定になります.

FDCAN_FilterTypeDef  sFilterConfig;
sFilterConfig.IdType = FDCAN_STANDARD_ID;
sFilterConfig.FilterIndex = 0;
 sFilterConfig.FilterType = FDCAN_FILTER_MASK;
sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO0; 
sFilterConfig.FilterID1 = 0x000;
sFilterConfig.FilterID2 = 0x000;

if (HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig) != HAL_OK){
Error_Handler();
}
if (HAL_FDCAN_Start(&hfdcan1) != HAL_OK){ Error_Handler();}
そして,送信関数
送信データは8byteに設定しています.
TxHeader.Identifier =id;
TxHeader.IdType = FDCAN_STANDARD_ID;
TxHeader.TxFrameType = FDCAN_DATA_FRAME;
TxHeader.DataLength = FDCAN_DLC_BYTES_8;
TxHeader.ErrorStateIndicator = FDCAN_ESI_ACTIVE;
TxHeader.BitRateSwitch = FDCAN_BRS_OFF;
TxHeader.FDFormat = FDCAN_CLASSIC_CAN;
TxHeader.TxEventFifoControl = FDCAN_NO_TX_EVENTS;
TxHeader.MessageMarker = 0;

if (HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &TxHeader, senddata) != HAL_OK)
{
Error_Handler();
}
while(HAL_FDCAN_GetTxFifoFreeLevel(&hfdcan1) != 3) {}

そして,While(1)の前にCANの受信を開始するAPI
  HAL_FDCAN_Start(&hfdcan1);
  if (HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0) != HAL_OK)
  {
    Error_Handler();
  }

最後に,受信コールバック
G4ではCANが2つや3つなど複数接続できるため,インスタンスでどのCANバスがコールバックを呼んだのか判別しています.そして,上記のCANフィルタですべてのIDを読みだすことになっているので,Swich-Case文で割り振っています.
void HAL_FDCAN_RxFifo0Callback(FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifo0ITs){

if (hfdcan->Instance == hfdcan1.Instance) {
  if((RxFifo0ITs & FDCAN_IT_RX_FIFO0_NEW_MESSAGE) != RESET){
 if (HAL_FDCAN_GetRxMessage(hfdcan, FDCAN_RX_FIFO0, &RxHeader, RxData) != HAL_OK){Error_Handler();}

switch (RxHeader.Identifier){
case 0x000: 
//ID:0x000の時の受信動作
break;
case 0x001: 
//ID:0x001の時の受信動作
break;
}
}
}
}
こんな感じです.


最後に,CANのボーレートから各種パラメーターを計算してくれるサイトを張っておきます,
http://www.bittiming.can-wiki.info/

それでは今回はこの辺で.

SSL研究会2019に行ってきました。

どうもお久しぶりです。しろうさぎです。

題目のとおりSSL研究会2019として愛知県立大学に行ってteam ibisメンバーとして参加してきました。

私はSSLでは通信関係のロボット側と外部PC側のソフト・ハードとロボットのマザーボードの制御を書いてました。

当日はオムニホイールをせっせと組み立てたり、足りない部品を買いに近くのホームセンターまで車を飛ばしたりと大変でしたが、何とか1台それっぽいものが完成してコートで動かすことができました。

H0IWaEj7
動作中

zdGOcVxW
チームマスコットとともに



SSLVisionからロボットの座標をAIが受けてそれをもとに考えて指令をWifi経由で送ってそれをロボット内の通信機が受け取って、マザーに送ってマザーがMDやキッカーのマイコンにCAN経由で指令を出して、それに従ってロボットが動くという、記述してみると途方もないことをやっているのですが何とかうごいてとてもうれしかったです。

ジャパンオープンに向けて今回出た問題点等をフィードバックしながらロボットの台数も増やしてもう少しサッカーらしい様子を見せれたらなと思っています。

最後に会場を貸してくださった愛知県立大の方や運営の方々ありがとうございました。

それでは今日はこの辺で。

大工大技術交流会に行ってきました

どうもしろうさぎです。

大工大技術交流会に行ってきました。そこでちょっとSTM32関連の発表をしたのでその時のスライドを置いておきます。

大工大の人にスライドシェアに上げてもらいました。

https://www.slideshare.net/ssuserae4a65/stm32-173695453

明らかに画像が抜けてるところは察してください・・・・www

スライドの後ろのほうにCANFDの話しと、CORDICの話を載せておきました。
CORDICについてはいまいち理解をしていないので記事に関してはあとになると思います。

それでは。これで。




アクセスカウンター
  • 今日:
  • 昨日:
  • 累計:

記事検索
ギャラリー
  • SSL研究会2019に行ってきました。
  • SSL研究会2019に行ってきました。
  • STM32G4でCAN-FDのループバックテストをする
  • STM32G4でCAN-FDのループバックテストをする
  • STM32G4でCAN-FDのループバックテストをする
  • STM32CubeHALでCAN通信をする
QRコード
QRコード