AT32双路CAN通信--AT_SURF案例11
本帖最后由 林堪堪 于 2022-3-29 19:28 编辑1.1 案例 CAN通信
1.1.1 简介CAN是控制器局域网络(Controller Area Network)的简称,是由德国BOSCH公司开发的,并最终成为国际标准,是国际上应用最广泛的现场总线之一。CAN具有高性能和高可靠性,已经被广泛应用于工业自动化、船舶、汽车、工业设备等方面。AT32F437 CAN主要具有以下特性:―支持CAN协议2.0A和2.0B.―软件触发或者外部触发转换波特率最高可达1M bit/s―支持时间触发通信―中断使能和屏蔽―自动重传功能可配发送―3个发送邮箱―发送优先级可配置―支持发送时间戳接收―2个深度为3的FIFO―28组过滤器组―支持标识符列表模式―支持标识符掩码模式―支持FIFO溢出管理―时间触发通信模式―16位定时器―发送时间戳
AT32 SUFR板载了两颗CAN芯片,型号为SN65HVD230DR,在测试时需要注意正确设置跳线帽,以及将两颗CAN芯片的H和L信号线分别对接在一起。
1.1.2 资源准备 硬件环境:对应产品型号的AT-SURF-F437 Board 软件环境:AT32F435_437_Firmware_Library_V2.x.x\project\at_sufr_f437\examples\can
1.1.3 硬件设计本案例使用的硬件资源有TFTLCD液晶显示屏、两颗SN65HVD230DR CAN芯片,对应的引脚如下:表12. 硬件资源使用
编号 PIN Name外设功能备注
1PB8CAN1 RXCAN1接收
2PB9CAN1 TXCAN1发送
2PB12CAN2 RXCAN2接收
4PB13CAN2 TXCAN2发送
对应的电路原理如下:
1.1.4 软件设计1) CAN通讯测试 初始化TFT LCD 初始化CAN1 和 CAN2 CAN1发送数据给CAN2,CAN2发送数据给CAN12) 代码介绍main函数代码描述
int main(void){uint32_t cnt = 0;
/* 初始化系统时钟*/system_clock_config();
/* 初始化中断优先级分组*/ nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);
/* 初始化延时函数 */delay_init();
/* 初始化LCD */lcd_init(LCD_DISPLAY_VERTICAL);
/* can 1 初始化 */can_init(CAN1);
/* can 2 初始化 */can_init(CAN2);
/* 显示信息*/lcd_string_show(10, 20, 200, 24, 24, (uint8_t*)"CAN Test");
while(1){ /* can 1 数据初始化 */ can_data_init(CAN1);
/* 通过 can 1 发送数据 */ can_transmit_data(CAN1,can1_tx_message);
/* can 2 数据初始化 */ can_data_init(CAN2);
/* 通过 can 2 发送数据 */ can_transmit_data(CAN2, can2_tx_message);
/* can 1 接收到数据 */ if(can1_rx_flag != 0) { /* 清除can 1接收数据标志 */ can1_rx_flag = 0;
/* 显示标题 */ lcd_string_show(10, 60, 200, 24, 24,(uint8_t *)"can 1 received");
/* 显示filterindex */ lcd_string_show(10, 100, 200, 24, 24,(uint8_t *)"filter_index:"); lcd_num_show(170, 100, 200, 24, 24,can1_rx_message.filter_index, 1);
if (can1_rx_message.id_type ==CAN_ID_EXTENDED ) { /* 显示extended id*/ lcd_string_show(10, 130, 200, 24, 24,(uint8_t *)"extended_id:"); lcd_num_show(170, 130, 200, 24, 24,can1_rx_message.extended_id, 1); } else { /* 显示standard id*/ lcd_string_show(10, 130, 200, 24, 24,(uint8_t *)"standard_id:"); lcd_num_show(170, 130, 200, 24, 24,can1_rx_message.standard_id, 1); }
if (can1_rx_message.frame_type ==CAN_TFT_REMOTE ) { /* 无数据 */ lcd_string_show(10, 160, 200, 24, 24,(uint8_t *)"remote frame: no data"); } else { /* 数据比较 */ if(buffer_compare(can2_tx_message.data,can1_rx_message.data, 8) == 0) { /* 数据成功接收 */ lcd_string_show(10, 160, 310, 24, 24,(uint8_t *)"can 1 数据成功接收"); } else { /* 数据接收错误 */ lcd_string_show(10, 160, 310, 24, 24,(uint8_t *)"can 1 数据接收错误"); } } }
/* can 2 接收到数据 */ if(can2_rx_flag != 0) { /* 清除can 2接收数据标志 */ can2_rx_flag = 0;
/* 显示标题 */ lcd_string_show(10, 220, 200, 24, 24,(uint8_t *)"can 2 received");
/* 显示filterindex */ lcd_string_show(10, 260, 200, 24, 24,(uint8_t *)"filter_index:"); lcd_num_show(170, 260, 200, 24, 24,can2_rx_message.filter_index, 1);
if (can2_rx_message.id_type ==CAN_ID_EXTENDED ) { /* 显示extended id*/ lcd_string_show(10, 290, 200, 24, 24,(uint8_t *)"extended_id:"); lcd_num_show(170, 290, 200, 24, 24,can2_rx_message.extended_id, 1); } else { /* 显示standard id*/ lcd_string_show(10, 290, 200, 24, 24,(uint8_t *)"standard_id:"); lcd_num_show(170, 290, 200, 24, 24,can2_rx_message.standard_id, 1); }
if (can2_rx_message.frame_type == CAN_TFT_REMOTE) { /* 无数据 */ lcd_string_show(10, 320, 200, 24, 24,(uint8_t *)"remote frame: no data"); } else { /* 数据比较 */ if(buffer_compare(can1_tx_message.data,can2_rx_message.data, 8) == 0) { /* 数据成功接收 */ lcd_string_show(10, 320, 310, 24, 24,(uint8_t *)"can 2 数据成功接收"); } else { /* 数据接收错误 */ lcd_string_show(10, 320, 310, 24, 24,(uint8_t *)"can 2 数据接收错误"); } } }
cnt++;
/* 显示传输次数 */ lcd_string_show(10, 380, 200, 24, 24,(uint8_t *)"transfer number:"); lcd_num_show(206, 380, 250, 24, 24, cnt,1); delay_ms(1000);}}
void can_init(can_type *can_x)函数代码描述
/*** @brief initialize can.* @param can_x: select the can peripheral.* this parameter can be one of the following values:* CAN1, CAN2.* @retval none*/void can_init(can_type *can_x)
void can_transmit_data(can_type *can_x, can_tx_message_type tx_message_struct)函数代码描述
/*** @brief can transmit data* @param can_x: select the can peripheral.* this parameter can be one of the following values:* CAN1, CAN2.* tx_message_struct: transmitmessage* @retval none*/void can_transmit_data(can_type *can_x,can_tx_message_type tx_message_struct)
1.1.5 下载验证1) CAN1发送数据给CAN2,CAN2发送数据给CAN12) CAN1和CAN2收到数据后,对比收到数据是否正确3) 在LCD屏上显示通讯信息图29. 实验效果
你好,请问双can的第二路can,can2需要和can1的配置有什么不一样的地方么,我这边AT32F437的can1可以正常通信,can2就一直发送不了 你好,有没有工程可以借鉴一下。谢谢 jsj0716 发表于 2022-4-4 09:54
你好,有没有工程可以借鉴一下。谢谢
官网bsp有
https://www.arterytek.com/cn/product/AT32F435.jsp (下载地址)
project\at_surf_f437\examples\can(代码路径)
挺精致 是免费申请的吗 板子资料提供一下呗 这个不是别人的板子吗 双路CAN通信能分时切换吗 AT_SURF是什么? 学习的难度大吗 现在的板子真是多嗯 有没有试过USB与CAN连用的?
页:
[1]