STM32F303K8 CAN通信

25 Jul 2017

Nucleo Board STM32F303K8を二つ使ってCAN通信を試してみました。

MASTER

#include "mbed.h"
#include "CAN.h" // 一応入れてみましたけど、なくてもコンパイルは通ります。

Serial pc(SERIAL_TX, SERIAL_RX);
CAN can(PA_11, PA_12);      // CAN (PinName rd, PinName td)
DigitalOut myled(LED1);
Ticker ticker;

char counter = 0;

void send() {
    pc.printf("Master send()\n");
    if(can.write(CANMessage(1337, &counter, 1))) {
        pc.printf("Master wloop()\n");
        counter++;
        pc.printf("Message sent: %d\n", counter);
    } 
    myled = !myled;
}

int main()
{
    pc.printf("main()\n");
    // pc.printf("CAN frequency successful: %d\n", can.frequency(100000));
    // pc.printf("CAN mode succesful: %d\n", can.mode(CAN::Normal));
    ticker.attach(&send, 1);
    while(1) {
        pc.printf("Mastetr loop()\n");
        wait(0.2);
    }
}

SLAVE

#include "mbed.h"
#include "CAN.h" // 一応入れてみましたけど、なくてもコンパイルは通ります。

CAN can(PA_11, PA_12);      // CAN (PinName rd, PinName td)
Serial pc(SERIAL_TX, SERIAL_RX);
DigitalOut myled(LED1);

CANMessage msg;

void receive() {
    if(can.read(msg)) {
            pc.printf("Message received: %d\n", msg.data[0]);
    }
}

int main()
{
    pc.printf("main()\n");
    // pc.printf("CAN frequency successful: %d\n", can.frequency(100000));
    // pc.printf("CAN mode succesful: %d\n", can.mode(CAN::Normal));
    can.attach(receive, CAN::RxIrq);
    while(1) {
        pc.printf("Slave loop()\n");
        if(can.read(msg)) {
            pc.printf("Message received: %d\n", msg.data[0]);
        }
        myled = !myled;
        wait(0.2);
    }
}

https://docs.mbed.com/docs/mbed-os-api-reference/en/latest/APIs/interfaces/digital/CAN/ リファレンスをマスターとスレーブとしてわけてプログラムにしてみましたが、オシロでみてもどうやらピンの変化すらないようです。 UARTにてデバッグを行ったところ、はじめにマスターから3回だけ送信することができますが、スレーブには届いていません。(このさいピンに変化はありません。送信フラグcan.write(CANMessage(1337, &counter, 1)ははじめの3回のみ更新できているみたいです。) 回路は MASTER PA_12(CAN1_TD)-MCP2551(RXD) PA_11(CAN_1RD)-MCP2551(TXD) MCP2551(CANH)-MCP2551(CANH) SLAVE PA_12(CAN1_TD)-MCP2551(RXD) PA_11(CAN_1RD)-MCP2551(TXD) MCP2551(CANL)-MCP2551(CANL)

CANH-120ohm-CANL CANH-120ohm-CANL としました。

もしよろしければご教授お願い致します。

27 Jul 2017

オシロでPA_12(D2)を見る限り、一回目のメッセージは送信されているようです。 D2とGND間のショートピンが接続されている状態であれば、外して試してみてください。

https://developer.mbed.org/questions/73781/What-purpose-is-this-jumper-on-F303K8-bo/

05 Aug 2017

MCP2551への供給電源が3.3Vだとドライバが動作しないようです。 自分の場合はVDDに3.3Vを供給していて動作せず、データシートを確認したところ4.5-5.5Vが入力電圧範囲とのことで、5V与えたら素直に動作しました。 ご参考までに。