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、