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);
    }
}

詳細 戻る (back)


1 comment on CAN:

10 Sep 2016

すみません。教えてください。 回路は公式ドキュメントどおりにしました。 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、

Please log in to post comments.