Important changes to forums

We’re making some changes to the Mbed forums. From 10th December 2019 all new discussions will take place on our new forum site. You can continue to reply to existing threads for the next two weeks. After that we will archive this forum so you can return to useful posts in the future.

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与えたら素直に動作しました。 ご参考までに。

You need to log in to post a reply