CAN
CAN
Information
本ページは私家版のため、誤り等あればご指摘ください。
最新の情報は公式のドキュメントをご参照ください。
http://mbed.org/handbook/CAN
CAN (Control Area network)
初期化
CAN name(rd, td);
name: 名前(自由に決めて良い)
rd: RDピン名(p9, p30)
td: TXピン名(p10, p29)
クロックレート
name.frequency(hz);
hz: クロック周波数
受信
val = name.read(msg);
msg: 受信データを入れるCANMessageのアドレス
val: 結果 0=メッセージなし、1=メッセージあり
送信
val = name.write(msg);
msg: 送信するCANMessageのアドレス
val: 0=失敗、1=成功
CANMessage
初期化
CANMessage name(id, data, len, type, format);
id: メッセージID(0~0x7FF or 0x1FFFFFFF)
data: データの配列(char *)
len: dataのバイト数(省略時 8)
type | 備考 |
---|---|
CANData | データフレーム(省略時) |
CANRemote | リモートフレーム |
format | 備考 |
---|---|
CANStandard | 標準フォーマット(省略時) |
CANExtended | 拡張フォーマット |
受信用バッファの初期化
CANMessage name(id, format);
値の参照
それぞれ以下のように参照できる。
name.id
name.data
name.len
name.type
name.format
例
別々のポートで送受信
#include "mbed.h" Ticker ticker; DigitalOut led1(LED1); DigitalOut led2(LED2); CAN can1(p9, p10); CAN can2(p30, p29); char counter = 0; void send() { printf("send()\n"); if(can1.write(CANMessage(1337, &counter, 1))) { printf("wloop()\n"); counter++; printf("Message sent: %d\n", counter); } led1 = !led1; } int main() { printf("main()\n"); ticker.attach(&send, 1); CANMessage msg; while(1) { printf("loop()\n"); if(can2.read(msg)) { printf("Message received: %d\n", msg.data[0]); led2 = !led2; } wait(0.2); } }
1 comment on CAN:
Please log in to post comments.
すみません。教えてください。 回路は公式ドキュメントどおりにしました。 p9(mcp2551RXD)、p10(mcp2551TXD) p30(mcp2551RXD)、p29(mcp2551TXD)
現状:オシロでは出力しているようです。 しかし、受信のACKがないため、リトライを繰り返しエラーとなります。 受信はされていません。
質問: 1、CANMessage msg の初期設定はどこでしているのでしょうか。 2、CANresetは? 3、#include <can.h>は不要なのでしょうか。 4、LPC1768のCANポート以外でも使用可能? 5、CAN can1(p9, p10);送信、受信の順序が逆?
質問は?としても何とか送信受信ができるようにしたいのですが、どのように したらよろしいでしょうか。 もしくはどのポートでも使えるように作ってあるのでしょうか。 2、