[活动专区] [N32G430开发板试用]can通讯收发测试

[复制链接]
6041|13
 楼主| 技术工程师 发表于 2024-4-23 11:52 | 显示全部楼层 |阅读模式
本帖最后由 技术工程师 于 2024-4-23 11:52 编辑

#申请原创# @21小跑堂 首先感谢国民技术提供的开发板,  也感谢二姨组织这次开工活动,给了我这次机会能评测N32G430开发板,废话不多说,我们开始评测
前言
  CAN是控制器局域网络(Controller Area Network)的简称,它是由研发和生产汽车电子产品著称的德国BOSCH公司开发的,并最终成为国际标准(ISO11519),是国际上应用最广泛的现场总线之一。
  首先我们阅读手册可以知道,N32G430C8L7拥有一路CAN接口,支持CAN协议2.0A及2.0B,波特率最高支持1Mbit/s,有CAN core管理can和512字节的sram之间通讯。
下面是CAN初始化代码
  1. void BSP_InitCan(void)
  2. {
  3.         CAN_InitType        CAN_InitStructure;
  4.         CAN_FilterInitType  CAN_FilterInitStructure;
  5.         
  6.         RCC_APB1_Peripheral_Clock_Enable(RCC_APB1_PERIPH_CAN);
  7.    
  8.     /* CAN初始化 */
  9.     CAN_NVIC_Configuration();
  10.     CAN_GPIO_Configuration();
  11.    
  12.     CAN_Reset(CAN);
  13.     CAN_Structure_Initializes(&CAN_InitStructure);
  14.     /* CAN cell init */
  15.     CAN_InitStructure.TTCM          = DISABLE;
  16.     CAN_InitStructure.ABOM          = DISABLE;
  17.     CAN_InitStructure.AWKUM         = DISABLE;
  18.     CAN_InitStructure.NART          = DISABLE;
  19.     CAN_InitStructure.RFLM          = DISABLE;
  20.     CAN_InitStructure.TXFP          = ENABLE;
  21.     CAN_InitStructure.OperatingMode = CAN_NORMAL_MODE;
  22.     /* Baud rate calculation = CAN clock/(BaudRatePrescaler*(TBS1+TBS2+1)) */
  23.                 /* CAN模块挂在APB1总线上,最大速率为32Mhz,所以波特率计算方式为32 / ((1+8+7) * 4) */
  24.     CAN_InitStructure.RSJW          = CAN_RSJW_1TQ;
  25.     CAN_InitStructure.TBS1          = CAN_TBS1_8TQ;
  26.     CAN_InitStructure.TBS2          = CAN_TBS2_7TQ;   
  27.     CAN_InitStructure.BaudRatePrescaler = 4;                                                //500kbit/s
  28.    
  29.     /*Initializes the CAN */
  30.     CAN_Initializes(CAN, &CAN_InitStructure);
  31.    
  32.    
  33.     /* CAN filter init */
  34.     CAN_FilterInitStructure.Filter_Num            = 0;
  35.     CAN_FilterInitStructure.Filter_Mode           = CAN_FILTER_IDLISTMODE;
  36.     CAN_FilterInitStructure.Filter_Scale          = CAN_FILTER_32BITSCALE;
  37.     CAN_FilterInitStructure.Filter_HighId         = CAN_STD_ID_LIST_32BIT_H(0x00000400);
  38.     CAN_FilterInitStructure.Filter_LowId          = CAN_STD_ID_LIST_32BIT_L(0x00000400);
  39.     CAN_FilterInitStructure.FilterMask_HighId     = CAN_STD_ID_LIST_32BIT_H(0x00000200);
  40.     CAN_FilterInitStructure.FilterMask_LowId      = CAN_STD_ID_LIST_32BIT_L(0x00000200);
  41.     CAN_FilterInitStructure.Filter_FIFOAssignment = CAN_FIFO0;
  42.     CAN_FilterInitStructure.Filter_Act            = ENABLE;
  43.     CAN_Filter_Initializes(&CAN_FilterInitStructure);
  44.     /* IT Configuration for CAN */  
  45.     CAN_Config_Interrupt_Enable(CAN, CAN_INT_FMP0);
  46. }
初始化这块的难点主要是波特率需要计算can总线波特率计算不正确,很容易导致接受或者发送失败。
通过官方文档的手册可以知道,can模块挂在APB1总线上,而APB1总线最大速率为32Mhz
企业微信截图_17137760485862.png
所以我们can BaudRate = PCLK / ((tq+tbs1+tbs2) * Prescaler)//分频系数。
接下来是数据发送部分
  1. int main(void)
  2. {
  3.         bsp_Init();
  4.         
  5.          /* Transmit assign */
  6.     CAN_TxMessage.StdId   = 0x0400;         
  7.     CAN_TxMessage.ExtId   = 0x00;                                                                 /* 如不使用,则不用配置 */
  8.     CAN_TxMessage.IDE     = CAN_STANDARD_ID;           /* CAN_ID_STD 标准帧 / CAN_ID_EXT 扩展帧 */
  9.     CAN_TxMessage.RTR     = CAN_RTRQ_DATA;           /* CAN_RTR_DATA / CAN_RTR_REMOTE */
  10.     CAN_TxMessage.DLC     = 8;           /* 0 to 8 */
  11.     CAN_TxMessage.Data[0] = 0x00;
  12.     CAN_TxMessage.Data[1] = 0x01;
  13.     CAN_TxMessage.Data[2] = 0x02;
  14.     CAN_TxMessage.Data[3] = 0x03;
  15.     CAN_TxMessage.Data[4] = 0x04;
  16.     CAN_TxMessage.Data[5] = 0x05;
  17.     CAN_TxMessage.Data[6] = 0x06;
  18.     CAN_TxMessage.Data[7] = 0x07;
  19.         while(1)
  20.         {
  21.                 if (sendflag)
  22.                 {
  23.                         sendflag = DISABLE;
  24.                         CAN_Transmit_Message_initializes(CAN,&CAN_TxMessage);
  25.                         
  26.                 }
  27.         }
  28. }
这里用了板上的key1作为发送控制,这样我们按一下按键,即可发送一次数据。
下面是实际测试:
这里我外接了一个TJA1050接收器,使用了CAN分析仪作为终端来接受CAN数据
接线如图所示 cce4ed220855d1f29f8c9aeaf5782f9.jpg

测试效果
企业微信截图_17138440819482.png

附带源码
N32G430.zip (6.79 MB, 下载次数: 56)


评论

@zxbzsm :参考官方例程改的  发表于 2024-8-29 16:11
GPIO_InitStructure.Pin = GPIO_PIN_8; GPIO_InitStructure.GPIO_Mode = GPIO_MODE_AF_PP; GPIO_InitStructure.GPIO_Alternate = GPIO_AF6_CAN; GPIO_Peripheral_Initialize(GPIOB, &GPIO_InitStructure); GPIO_InitStructure.Pin  发表于 2024-8-21 14:24
qintian0303 发表于 2024-4-25 11:36 | 显示全部楼层
外接了一个TJA1050接收器,使用了CAN分析仪作为终端来接受CAN数据,羡慕有专业设备的
LEDyyds 发表于 2024-4-25 13:47 | 显示全部楼层
qintian0303 发表于 2024-4-25 11:36
外接了一个TJA1050接收器,使用了CAN分析仪作为终端来接受CAN数据,羡慕有专业设备的 ...

已经不错了,我连这个都没有
qintian0303 发表于 2024-4-25 14:13 | 显示全部楼层
LEDyyds 发表于 2024-4-25 13:47
已经不错了,我连这个都没有

我也是来羡慕的,我也没有啊,这种一般得是从事相关行业的才会有,专业设备太贵
 楼主| 技术工程师 发表于 2024-4-26 10:50 | 显示全部楼层
qintian0303 发表于 2024-4-25 14:13
我也是来羡慕的,我也没有啊,这种一般得是从事相关行业的才会有,专业设备太贵 ...

还好,我都是翻出来的,找了老半天,也不常用害
Sunriver_Yao 发表于 2024-8-29 13:59 | 显示全部楼层
洒家流口水!
 楼主| 技术工程师 发表于 2024-8-29 16:12 | 显示全部楼层
shenxiaolin 发表于 2024-8-30 14:29 | 显示全部楼层
测试很认真啊
Sunriver_Yao 发表于 2024-10-29 14:36 | 显示全部楼层
洒家流了一地口水。临渊羡鱼,不如退而结网。穷,买了个CANable,24大洋。PCAN View 不能用,上cangaroo,能发一条消息。上天朝TS_Master,能上n条,简直是SCOM32@UART,的CAN版。


地瓜patch 发表于 2024-10-29 18:26 来自手机 | 显示全部楼层
我也用这个can收发器
suncat0504 发表于 2024-10-30 18:09 | 显示全部楼层
有Can分析仪?强!我当初调试Can通讯,是靠示波器查看波形分析的。
申小林一号 发表于 2024-10-30 20:33 | 显示全部楼层
CAN总线传输距离远
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

91

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部