hiro yamamoto works

マイコンハード、ソフトを作ったりしています。
お家や現場のお困りごと解決に!
内容利用は自己責任でお願いします。

CANバスモジュールを使ってデータ送受信する(送信側復習)

2023-10-28 17:37:28 | CAN通信

しばらく放置していたら、自分の書いたスケッチがわからなくなったので、
ブログ投稿しながら復習することにしました。
送信側 SAMD XIAOとMCP2515 受信側 Arduino MKRZERO(SAMD)とMCP2515の組み合わせです。
私が使うための最低限の情報だけなので、もっと掘り下げたい方は詳しいサイトを探して下さい。
※テストしてわかったこと※
 理由はわからないが、1byteの中で7bitしか使えない事がわかった


Amazonで購入したCANバスモジュール
CANコントローラ(MCP2515)とトランシーバ(TJA1050)のICが載っています。

MCP2515 CANコントローラについて
マイクロコントローラとの接続インターフェース:SPI(10MHz)
1秒間に送受信可能なデータ量(Mb/s):1Mb/s
(Mbyte/秒(メガバイト/秒)1byteは8bit 1Mb/sは8Mbpsに相当
 Mbpsとは、1秒間でのデータの転送速度 bit/秒)

CAN通信について(かんたんに)
データの中に”ID(識別子)を付加して送信する”
データ受信側は、IDにより「どのようなデータなのか?」判断できる。
IDは通信調停の優先順位決定にも使われる。
標準フォーマット:11ビット長でIDを構成、IDの範囲0x0~0x7FF 2048種類の識別可能
(拡張フォーマット:ID(ベースID)と拡張IDの18ビット長で構成)
1回に送信できるデータ量が最大8byte
ひとつのIDで8byte送れる。(と思っていたが実際は1byte(8bit)の中で7bitしか使えなかった)
8byteのデータを送れるということは、つまり64bitのデータを送れるということになる。
(前述の通り7bitなので7x8=56bitと思われる)

6個のデータを送りたい
データごとにIDをつける。
1個のデータは32bit(0〜4294967295)4byteぐらいの数値を送れるようにしておく。
32bit(4byte)のデータを、8bit(1byte)7bit毎に分割して毎に分割して、
送信データへ入れていく


mcp.beginPacket(packetid);//packetidは任意のID
  for (int i = 0; i <= 7; i++) { // data1の配列を順に切り替えていくため
  //Value1は分割する前のデータ(bit単位で取り扱う)
  //8とiを積を求めてその分のbit右シフトをする
  //iが増加する毎に、bit単位のValue1を1byteづつ取り出せるようにする
  //0xFFとbit単位のAND演算をして1byte取り出す
  //配列に入れる
  //data1[i] = (byte)(Value1 >> (i * 8)) & 0xFF;//1byteの8bit使用
    data[i] = (byte)(Value1 >> (i * 7)) & 0x7F;//1byteの7bitを使用
mcp.write(data1[i]);//データを組み立てていく感じ?
  }//for文の閉じ括弧
mcp.endPaket();//準備したデータを送る感じ?


今日はここまで

補足
前述のスケッチはloop関数中の記述抜粋です。
beginPacketのIDを変えて複数記述すれば、複数のデータを送ることが出来ます。(たぶん)
6個のデータは正常に送ることが出来ました。
実は正しく送れないデータ範囲がありました。スケッチ修正箇所あります。
1byte(8bit)の7bitしか使えなかったのはSAMDマイコンとRP2040でしたので注意して下さい。



最新の画像もっと見る

コメントを投稿