CAN
CAN class hierarchy
Controller-Area Network (CAN) is a bus standard that allows microcontrollers and devices to communicate with each other without going through a host computer.
Note: You can use the CAN interface to write data words out of a CAN port. It will return the data received from another CAN device. You can configure the CAN clock frequency.
CAN class reference
| Public Member Functions | |
| CAN (PinName rd, PinName td) | |
| Creates a CAN interface connected to specific pins. More... | |
| CAN (PinName rd, PinName td, int hz) | |
| Initialize CAN interface and set the frequency. More... | |
| CAN (const can_pinmap_t &pinmap) | |
| Initialize CAN interface. More... | |
| CAN (const can_pinmap_t &pinmap, int hz) | |
| Initialize CAN interface and set the frequency. More... | |
| int | frequency (int hz) |
| Set the frequency of the CAN interface. More... | |
| int | write (CANMessage msg) |
| Write a CANMessage to the bus. More... | |
| int | read (CANMessage &msg, int handle=0) |
| Read a CANMessage from the bus. More... | |
| void | reset () |
| Reset CAN interface. More... | |
| void | monitor (bool silent) |
| Puts or removes the CAN interface into silent monitoring mode. More... | |
| int | mode (Mode mode) |
| Change CAN operation to the specified mode. More... | |
| int | filter (unsigned int id, unsigned int mask, CANFormat format=CANAny, int handle=0) |
| Filter out incoming messages. More... | |
| unsigned char | rderror () |
| Detects read errors - Used to detect read overflow errors. More... | |
| unsigned char | tderror () |
| Detects write errors - Used to detect write overflow errors. More... | |
| void | attach (Callback< void()> func, IrqType type=IrqType::RxIrq) |
| Attach a function to call whenever a CAN frame received interrupt is generated. More... | |
CAN hello, world
This example sends a counter from one CAN bus (can1) and listens for a packet on the other CAN bus (can2). Each bus controller should be connected to a CAN bus transceiver. These should be connected together at a CAN bus.
/*
* Copyright (c) 2017-2020 Arm Limited and affiliates.
* SPDX-License-Identifier: Apache-2.0
*/
#if !DEVICE_CAN
#error [NOT_SUPPORTED] CAN not supported for this target
#endif
#include "mbed.h"
Ticker ticker;
DigitalOut led1(LED1);
DigitalOut led2(LED2);
/** The constructor takes in RX, and TX pin respectively.
* These pins, for this example, are defined in mbed_app.json
*/
CAN can1(MBED_CONF_APP_CAN1_RD, MBED_CONF_APP_CAN1_TD);
CAN can2(MBED_CONF_APP_CAN2_RD, MBED_CONF_APP_CAN2_TD);
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;
}
ThisThread::sleep_for(200);
}
}