[分享] 【雅特力AT32WB415系列蓝牙BLE 5.0 MCU】+CAN通讯

雨夜很凉快   2022-8-11 16:37 楼主

【雅特力AT32WB415系列蓝牙BLE 5.0 MCU】+CAN通讯

  • can通讯硬件
    1. 根据AT32WB415数据手册得知,此芯片拥有1路CAN通讯接口(2.0B主动),内置256字节的专用SRAM。
    2. 控制器区域网络(CAN) 

1个CAN接口兼容规范2.0A和2.0B(主动),位速率高达1兆位/秒。它可以接收和发送11位标识符的 标准帧和29位标识符的扩展帧。具有3个发送邮箱,2个具3级深度的接收FIFO,和14个可调节的滤 波器。CAN控制器分配有256个字节的专用SRAM,此专用SRAM不和其他硬件外设共享。

    1. CAN接口,默认PA11、PA12或者重映射PB8、PB9。因为PA11PA12被USB接口所占用,故而应该选择的是PB8/PB9。
    2. 板载没有CAN PHY芯片,故需要外置。。。。

 

 

image-20220811163703-1.jpeg  

 

  • Can通讯程序示例

2.1、打开了candemo,CAN 初始化内有baudrate = pclk/(baudrate_div *(1 + bts1_size + bts2_size)) ,波特率计算公式,CAN通讯频率要求不是非常严格,得到大致的范围就可以正常使用。

 

 

2.2、communication_mode 程序示例如以下两图,

其功能是循环发送一组数据,但接收到电脑端数据时LED2会点亮或者熄灭。

 

image-20220811163703-2.png  

image-20220811163703-3.png  

2.3、filter例程

自动发送出一组数据,包含标准帧和扩展帧。

image-20220811163703-4.png  

2.4、loopback_mode例程

以回环的形式循环发送数据,上位机发送数据LED3会点亮后熄灭。

image-20220811163703-5.png  

  • 代码

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); //

回复评论 (2)

CAN通讯频率要求不是非常严格,得到大致的范围就可以正常使用。这个可以吗?

点赞  2022-8-11 21:39
引用: lugl4313820 发表于 2022-8-11 21:39 CAN通讯频率要求不是非常严格,得到大致的范围就可以正常使用。这个可以吗?

别差太多就行 比方说250K波特率 实际200-300k波特率也可以用。雅特力这个芯片APB1总线频率75Mhz 按公式计算后也不是1M的整数。

点赞  2022-8-12 12:43
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复