8ビットも32ビットもおんなじ なんて言ってる矢先に
罠にかかりまくりです😭
CANからのデータの読み込みをやってたのですが。。。
受信したらC1FIFOUA1で示されるアドレス0x00000c50のメモリから読み出すということなので、該当収納先を見てみると
たしかにデータメモリ上にデータが入っているのが見えますけど、
なぜかうまく変数に読み出しできません😧
まぁ、ポインタとかいまいちよくわかっていないので、
その辺を勉強しなおしながら頑張ったのですが????
できません。
この自動翻訳風な日本語をなんとかかんとか解釈しても、??
どうやら、
そのままのアドレスでは該当メモリへはアクセスできないようで、
PA_TO_KVA1()とかいう関数で、物理アドレス?に変換してやらないとイケナイようです。
まぁ、これはこのPICマイコンのメモリの仕様の話かな。
追記*************
0x00000c50が物理アドレスで、
0xa0000c50が仮想アドレス?みたいです。
プログラムから見る時は仮想アドレスを使うみたい??
マルチタスク用にアドレスの設定が8ビットのとは違っているみたい。
アタマが時代遅れになってます😅
*************
無事に変数に代入できるようになったのですが、
なんだかデータの並びがムチャクチャです。
これまた、ポインタとか、変数の型(データ長)だとか、
いろいろややこしくて???だったのですが、
これはどうやら32ビットの罠でした。
今までは8ビットマイコンだったので最小単位的な1バイトで考えればよかったのですが、32ビットマイコンでは4バイトを一度に扱えます。
なので、
変数に0x11223344と代入したときは、
メモリ上には 0x44 0x33 0x22 0x11と逆順に並んでいるのですね。
CAN IDデータの00000641のところASCIIでは"A......."です。
4番目のバイト0x41が、メモリ上では先頭バイト"A”となっています。
そんななので、32ビットいっぺんに読み出すとCANメッセージのデータバイト順が3210、7654になっちゃうんですね、納得。
つづいて、
CAN ID 0x640から0x647までの8メッセージを受信するために
フィルタを0x640に設定し、
マスクを0b11111111000として、下位3ビットをフリーにします。
いままでの8ビットマイコンでは、
たしかスタンダードID(11ビット)と拡張ID(29ビット)では設定が分かれていたような気がして、拡張IDを意識しなくてもよかったはず。
でも、今度のは32ビットのせいなのか、標準IDが拡張IDの一部のような位置付け?
拡張IDの方が基準みたいな感じになってる。
なので
スタンダードsIDのマスク=0x7F8の後ろに
拡張eID18ビット分のマスク=0x3FFFFをつないで、
29ビットの数字
0b111 1111 1000 11 1111 1111 1111 1111
= 0b1 1111 1110 0011 1111 1111 1111 1111 (区切りを整理)
= 0x1FE3FFFF (16進数に変換)
をハーモニーの設定欄に書き込んで、
オッケーです。
sIDのところに必要なマスクの数字が入りました♪
追記ーーーーーーーーーーーーーーーーーーー
もしかしたらeIDの18bit分のところは0にしておいた方がいいかもしれません。
拡張🆔混在ってのは試してないのでわかりませんが。
ーーーーーーーーーーーーーーーーーーーーー
sID 640〜647のメッセージだけが読み取れています。
これで、やっと思ったようにMoTeCのCAN custom data set 1の
32項目の16ビットデータを読み込むことができました。
とりあえず、リアルタイムミクスチャフューエルマップコレクションに
必要となるデータをLCDに表示させてみました。
まだ アタマがこんがらがってるので、
とりあえずはここまで。
Posted at 2020/12/23 14:12:15 | |
トラックバック(0) |
PIC ESP32 マイコン | 日記