【雅特力AT32WB415系列蓝牙BLE 5.0 MCU】+CAN通讯
1个CAN接口兼容规范2.0A和2.0B(主动),位速率高达1兆位/秒。它可以接收和发送11位标识符的 标准帧和29位标识符的扩展帧。具有3个发送邮箱,2个具3级深度的接收FIFO,和14个可调节的滤 波器。CAN控制器分配有256个字节的专用SRAM,此专用SRAM不和其他硬件外设共享。
2.1、打开了candemo,CAN 初始化内有baudrate = pclk/(baudrate_div *(1 + bts1_size + bts2_size)) ,波特率计算公式,CAN通讯频率要求不是非常严格,得到大致的范围就可以正常使用。
2.2、communication_mode 程序示例如以下两图,
其功能是循环发送一组数据,但接收到电脑端数据时LED2会点亮或者熄灭。
2.3、filter例程
自动发送出一组数据,包含标准帧和扩展帧。
2.4、loopback_mode例程
以回环的形式循环发送数据,上位机发送数据LED3会点亮后熄灭。
3.1、原有发送代码需要稍微改变一下,个人以最简单的方式做了调整,在之后的数据发送调用此函数即可。
static void can_transmit(unsigned int id,unsigned char *buf)
{
uint8_t transmit_mailbox;
can_tx_message_type tx_message_struct;
tx_message_struct.standard_id = id; // 标准帧ID
tx_message_struct.extended_id = 0; // 扩展帧ID
tx_message_struct.id_type = CAN_ID_STANDARD; // 标准帧或者扩展帧
tx_message_struct.frame_type = CAN_TFT_DATA; // 帧类型 数据帧或者远程帧
tx_message_struct.dlc = 8; // 数据长度
tx_message_struct.data[0] = buf[0];
tx_message_struct.data[1] = buf[1];
tx_message_struct.data[2] = buf[2];
tx_message_struct.data[3] = buf[3];
tx_message_struct.data[4] = buf[4];
tx_message_struct.data[5] = buf[5];
tx_message_struct.data[6] = buf[6];
tx_message_struct.data[7] = buf[7];
transmit_mailbox = can_message_transmit(CAN1, &tx_message_struct); // 数据发送函数
while(can_transmit_status_get(CAN1, (can_tx_mailbox_num_type)transmit_mailbox) != CAN_TX_STATUS_SUCCESSFUL);//获取发送是否完成
}
3.2、初始化代码
/* can base init */
can_default_para_init(&can_base_struct); //
can_base_struct.mode_selection = CAN_MODE_COMMUNICATE; // can模式选择
can_base_struct.ttc_enable = FALSE; // 开启/关闭时间触发通信模式
can_base_struct.aebo_enable = TRUE;// 自动退出离线状态模式使能
can_base_struct.aed_enable = TRUE;// 自动退出睡眠模式使能
can_base_struct.prsf_enable = FALSE;// 发送失败时禁止重传使能
can_base_struct.mdrsel_selection = CAN_DISCARDING_FIRST_RECEIVED; // 接收溢出时报文丢弃规则选择
can_base_struct.mmssr_selection = CAN_SENDING_BY_ID; // 多报文发送顺序规则选择
can_base_init(CAN1, &can_base_struct); //
CAN通讯频率要求不是非常严格,得到大致的范围就可以正常使用。这个可以吗?
引用: lugl4313820 发表于 2022-8-11 21:39 CAN通讯频率要求不是非常严格,得到大致的范围就可以正常使用。这个可以吗?
别差太多就行 比方说250K波特率 实际200-300k波特率也可以用。雅特力这个芯片APB1总线频率75Mhz 按公式计算后也不是1M的整数。