[N32G430] 国民技术N32G430 有关CAN外设的使用方法

[复制链接]
2060|9
 楼主| 一路向北lm 发表于 2024-10-18 11:02 | 显示全部楼层 |阅读模式
CAN外设初始化-基本参数
01.禁用时间触发、使用软件的方式来决定自动离线和自动唤醒、禁止报文自动重传;
02.接收FIFO锁定,当前接收报文未读出时,下一个报文将被丢弃;
03.发送优先级由发送强求顺序决定;
04.CAN模式设置为正常模式:CAN_NORMAL_MODE;
05.CAN波特率被设置为1M32M/((1+7+8)*2)= 1M;
  1. CAN_Reset(CAN);
  2.     CAN_Structure_Initializes(&CAN_InitStructure);
  3.     /* CAN cell init */
  4.     CAN_InitStructure.TTCM          = DISABLE;   //禁用时间触发通信模式
  5.     CAN_InitStructure.ABOM          = DISABLE;   //自动离线模式选择软件确定
  6.     CAN_InitStructure.AWKUM         = DISABLE;   //自动唤醒模式选择软件确定
  7.     CAN_InitStructure.NART          = DISABLE;   //禁止报文自动重传
  8.     CAN_InitStructure.RFLM          = DISABLE;   //接收FIFO锁定,当前接收报文未读出时,下一个接收到报文将被丢弃
  9.     CAN_InitStructure.TXFP          = ENABLE;    //发送优先级由发送请求的顺序决定
  10.     CAN_InitStructure.OperatingMode = CAN_NORMAL_MODE;
  11.     /* Baud rate calculation = CAN clock/(BaudRatePrescaler*(TBS1+TBS2+1)) */
  12.     CAN_InitStructure.RSJW          = CAN_RSJW_1TQ;
  13.     CAN_InitStructure.TBS1          = CAN_TBS1_8TQ;
  14.     CAN_InitStructure.TBS2          = CAN_TBS2_7TQ;   
  15.     CAN_InitStructure.BaudRatePrescaler = 2;
  16.     /*Initializes the CAN */
  17.     CAN_Initializes(CAN, &CAN_InitStructure);
涉及相关寄存器如下:

 楼主| 一路向北lm 发表于 2024-10-18 16:28 | 显示全部楼层
CAN外设初始化-滤波器设置
01.使用CAN过滤器组0,标识符屏蔽位模式;
02. CAN过滤器位宽为单个32位模式,使用FIFO0用于CAN接收;

03.使能CAN滤波器和CAN中断FIFO0接收;
  1. /* CAN filter init */
  2.     can_rx.filter.Filter_Num            = 0;                             //过滤器组0
  3.     can_rx.filter.Filter_Mode           = CAN_FILTER_IDMASKMODE;         //标识符屏蔽位模式
  4.     can_rx.filter.Filter_Scale          = /*  */CAN_FILTER_32BITSCALE;   //过滤器位宽为单个32位
  5.     can_rx.filter.Filter_HighId         = CAN_STD_ID_LIST_32BIT_H(0x00000001);
  6.     can_rx.filter.Filter_LowId          = CAN_STD_ID_LIST_32BIT_L(0x00000001);
  7.     can_rx.filter.FilterMask_HighId     = CAN_STD_ID_H_MASK_DONT_CARE;
  8.     can_rx.filter.FilterMask_LowId      = CAN_STD_ID_L_MASK_DONT_CARE;
  9.     can_rx.filter.Filter_FIFOAssignment = CAN_FIFO0;  //FIFO0 用于CAN接收
  10.     can_rx.filter.Filter_Act            = ENABLE;     //使能CAN滤波器
  11.     CAN_Filter_Initializes(&can_rx.filter);
  12.     /* IT Configuration for CAN */  
  13.     CAN_Config_Interrupt_Enable(CAN, CAN_INT_FMP0);
相关寄存器如下:


 楼主| 一路向北lm 发表于 2024-10-18 17:17 | 显示全部楼层
CAN发送与接收直接调用LIB库中的CAN_Transmit_Message_initializesCAN_Message_Receive函数接口即可。
编写接口实现对CAN外设的中断接收应答机制,使用广成科技的USB-CAN即可获取到CAN数据

飘向北方 发表于 2024-10-21 10:08 | 显示全部楼层
USB-CAN 这个工具怎么连接的?这家的CAN稳定性怎么样?有相关资料吗?
郁葱 发表于 2024-10-21 11:14 | 显示全部楼层
在调用CAN 收发这块可以给一个详细的代码示例吗?我这边CAN中断接收一直未调通,请教一下楼主这个问题?
 楼主| 一路向北lm 发表于 2024-10-21 15:21 | 显示全部楼层
飘向北方 发表于 2024-10-21 10:08
USB-CAN 这个工具怎么连接的?这家的CAN稳定性怎么样?有相关资料吗?

广成科技的USB转CAN盒我感觉还可以,黑色这种,工作中拿来做CAN相关测试还是比较稳定的,一些具体使用的说明可以查阅这里的pdf,推荐使用。
 楼主| 一路向北lm 发表于 2024-10-21 15:22 | 显示全部楼层
郁葱 发表于 2024-10-21 11:14
在调用CAN 收发这块可以给一个详细的代码示例吗?我这边CAN中断接收一直未调通,请教一下楼主这个问题? ...

CAN外设初始化配置完毕后,我的中断函数调用如下,使用回调的方式调用lum_cmd_callback函数,在此函数中做应答处理,之后调用CAN发送函数发送数据帧。
  1. void CAN_RX0_IRQHandler(void)
  2. {
  3.     CAN_Message_Receive(CAN,CAN_FIFO0, &can_rx.rx_header);  
  4.     lum_cmd_callback(can_rx);
  5. }

  6. // CAN中断回调处理函数
  7. void lum_cmd_callback(CANRxMessage msg)
  8. {
  9.            tCANID        temp_id;
  10.                temp_id.data.id = msg.rx_header.StdId;

  11.         // //lum add ...
  12.         …
  13.         can_unpack_reply(temp_id.data.cmd_id);
  14. }

  15. //最后发送函数的调用
  16. can_tx.tx_header.StdId = temp_id.data.id;
  17. CAN_Transmit_Message_initializes(CAN,&can_tx.tx_header);


 楼主| 一路向北lm 发表于 2024-10-21 15:28 | 显示全部楼层
郁葱 发表于 2024-10-21 11:14
在调用CAN 收发这块可以给一个详细的代码示例吗?我这边CAN中断接收一直未调通,请教一下楼主这个问题? ...

CAN外设初始化配置完毕后,我的中断函数调用如下,使用回调的方式调用lum_cmd_callback函数,在此函数中做应答处理,之后调用CAN发送函数发送数据帧。
  1. void CAN_RX0_IRQHandler(void)
  2. {
  3.     CAN_Message_Receive(CAN,CAN_FIFO0, &can_rx.rx_header);  
  4.     lum_cmd_callback(can_rx);
  5. }

  6. // CAN中断回调处理函数
  7. void lum_cmd_callback(CANRxMessage msg)
  8. {
  9.            tCANID        temp_id;
  10.                temp_id.data.id = msg.rx_header.StdId;

  11.         // //lum add ...
  12.         …
  13.         can_unpack_reply(temp_id.data.cmd_id);
  14. }

  15. //最后发送函数的调用
  16. can_tx.tx_header.StdId = temp_id.data.id;
  17. CAN_Transmit_Message_initializes(CAN,&can_tx.tx_header);


yangxiaor520 发表于 2024-10-22 07:42 来自手机 | 显示全部楼层
国民的MCU还没有升级为CANFD吗?
 楼主| 一路向北lm 发表于 2024-10-24 15:09 | 显示全部楼层
yangxiaor520 发表于 2024-10-22 07:42
国民的MCU还没有升级为CANFD吗?

国民有些系列的MCU带有CAN FD的,这款n32g430只是CAN2.0
您需要登录后才可以回帖 登录 | 注册

本版积分规则

293

主题

3837

帖子

81

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