如何进行CAN初始化?
以下是ESP32-TWAI-CAN库的CAN总线初始化函数(begin())
bool begin(TwaiSpeed twaiSpeed = TWAI_SPEED_500KBPS, int8_t txPin = -1, int8_t rxPin = -1,uint16_t txQueue = 0xFFFF, uint16_t rxQueue = 0xFFFF,twai_filter_config_t* fConfig = nullptr,twai_general_config_t* gConfig = nullptr,twai_timing_config_t* tConfig = nullptr);
主要需要知道以下数据:
- CAN的引脚
- 电机驱动板对应的比特率
如何实现发送 CAN 消息?——第一步:明确帧格式
有的电机(大然电机)是标准帧,有的电机(小米电机)是扩展帧,下面分别给出举例:
/*小米电机驱动器通信协议及使用说明 电机通信为 CAN 2.0 通信接口,波特率 1Mbps,采用扩展帧格式,如下所示:数据域 29 位 ID 8Byte 数据区大小 Bit28~bit24 bit23~8 bit7~0 Byte0~Byte7描述 通信类型 数据区 2 目标地址 数据区 1*/
其发送帧的函数如下:
//底层的CAN发送指令,小米电机采用扩展帧,数据帧的格式
static void CAN_Send_Frame(can_frame_t* frame)
{CanFrame obdFrame = { 0 };uint32_t id_val,data_val,mode_val;uint32_t combined_val;obdFrame.extd = 1; //0-标准帧; 1-扩展帧 小米电机采用扩展帧obdFrame.rtr = 0; //0-数据帧; 1-远程帧obdFrame.ss = 0; //0-错误重发; 1-单次发送(仲裁或丢失时消息不会被重发),对接收消息无效obdFrame.self = 0; //0-不接收自己发送的消息,1-接收自己发送的消息,对接收消息无效obdFrame.dlc_non_comp = 0; //0-数据长度不大于8(ISO 11898-1); 1-数据长度大于8(非标); 数据长度为标准长度//拼接IDid_val = frame->id;data_val = frame->data;mode_val = frame->mode;combined_val |= (mode_val << 24);combined_val |= (data_val << 8);combined_val |= id_val;obdFrame.identifier = combined_val; //普通帧直接写id,扩展帧需要计算。11/29位IDobdFrame.data_length_code = 8; //要发送的字节数for (int i = 0; i < 8; i++){obdFrame.data[i] = frame->tx_data[i];}ESP32Can.writeFrame(obdFrame);
}
与之相对,大然电机采用标准帧(帧信息为1字节,帧ID为两个字节):
第二步:发送有实际效用的数据帧——查看电机驱动板《指令对照表》