CAN
CAN 类层次结构
控制器局域网(CAN)是一种总线标准,允许微控制器和设备相互通信而无需通过主机。
注意: 您可以使用 CAN 接口从 CAN 端口写入数据字。它将返回从另一个 CAN 设备接收的数据。您可以配置 CAN 时钟频率。
CAN 类参考
公共类型 | |
enum | Mode { Reset = 0, Normal, Silent, LocalTest, GlobalTest, SilentTest } |
enum | IrqType { RxIrq = 0, TxIrq, EwIrq, DoIrq, WuIrq, EpIrq, AlIrq, BeIrq, IdIrq, IrqCnt } |
公共成员函数 | |
CAN (PinName rd, PinName td) | |
CAN (PinName rd, PinName td, int hz) | |
int | frequency (int hz) |
int | write (CANMessage msg) |
int | read (CANMessage &msg, int handle=0) |
void | reset () |
void | monitor (bool silent) |
int | mode (Mode mode) |
int | filter (unsigned int id, unsigned int mask, CANFormat format=CANAny, int handle=0) |
unsigned char | rderror () |
unsigned char | tderror () |
void | attach (Callback< void()> func, IrqType type=RxIrq) |
template<typename T > | |
void | attach (T *obj, void(T::*method)(), IrqType type=RxIrq) |
template<typename T > | |
void | attach (T *obj, void(*method)(T *), IrqType type=RxIrq) |
静态公共成员函数 | |
static void | _irq_handler (uint32_t id, CanIrqType type) |
受保护的成员函数 | |
virtual void | lock () |
virtual void | unlock () |
受保护的属性 | |
can_t | _can |
Callback< void()> | _irq [IrqCnt] |
PlatformMutex | _mutex |
CAN Hello World!
此示例从一个 CAN 总线(can1)发送计数器,并在另一个 CAN 总线(can2)上侦听数据包。每个总线控制器应连接到 CAN 总线收发器。这些应该通过 CAN 总线连接在一起。
#include "mbed.h"
Ticker ticker;
DigitalOut led1(LED1);
DigitalOut led2(LED2);
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;
}
wait(0.2);
}
}