林堪堪 发表于 2022-3-29 19:04

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. 实验效果






良子一统天 发表于 2022-3-31 11:09

你好,请问双can的第二路can,can2需要和can1的配置有什么不一样的地方么,我这边AT32F437的can1可以正常通信,can2就一直发送不了

jsj0716 发表于 2022-4-4 09:54

你好,有没有工程可以借鉴一下。谢谢

林堪堪 发表于 2022-4-8 13:15

jsj0716 发表于 2022-4-4 09:54
你好,有没有工程可以借鉴一下。谢谢

官网bsp有
https://www.arterytek.com/cn/product/AT32F435.jsp (下载地址)

project\at_surf_f437\examples\can(代码路径)

sparrow054 发表于 2022-4-9 15:33

挺精致

soodesyt 发表于 2022-5-16 10:01

是免费申请的吗

robincotton 发表于 2022-5-16 10:49

板子资料提供一下呗

uptown 发表于 2022-5-16 11:54

这个不是别人的板子吗

i1mcu 发表于 2022-5-16 12:46

双路CAN通信能分时切换吗

myiclife 发表于 2022-5-16 13:25

AT_SURF是什么?

everyrobin 发表于 2022-5-16 14:12

学习的难度大吗

pl202 发表于 2022-5-16 15:30

现在的板子真是多嗯

zmlopq 发表于 2022-5-16 22:33

有没有试过USB与CAN连用的?
页: [1]
查看完整版本: AT32双路CAN通信--AT_SURF案例11