打印
[N32G430]

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

[复制链接]
472|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;
CAN_Reset(CAN);
    CAN_Structure_Initializes(&CAN_InitStructure);
    /* CAN cell init */
    CAN_InitStructure.TTCM          = DISABLE;   //禁用时间触发通信模式
    CAN_InitStructure.ABOM          = DISABLE;   //自动离线模式选择软件确定
    CAN_InitStructure.AWKUM         = DISABLE;   //自动唤醒模式选择软件确定
    CAN_InitStructure.NART          = DISABLE;   //禁止报文自动重传
    CAN_InitStructure.RFLM          = DISABLE;   //接收FIFO锁定,当前接收报文未读出时,下一个接收到报文将被丢弃
    CAN_InitStructure.TXFP          = ENABLE;    //发送优先级由发送请求的顺序决定
    CAN_InitStructure.OperatingMode = CAN_NORMAL_MODE;
    /* Baud rate calculation = CAN clock/(BaudRatePrescaler*(TBS1+TBS2+1)) */
    CAN_InitStructure.RSJW          = CAN_RSJW_1TQ;
    CAN_InitStructure.TBS1          = CAN_TBS1_8TQ;
    CAN_InitStructure.TBS2          = CAN_TBS2_7TQ;   
    CAN_InitStructure.BaudRatePrescaler = 2;
    /*Initializes the CAN */
    CAN_Initializes(CAN, &CAN_InitStructure);
涉及相关寄存器如下:

使用特权

评论回复
沙发
一路向北lm|  楼主 | 2024-10-18 16:28 | 只看该作者
CAN外设初始化-滤波器设置
01.使用CAN过滤器组0,标识符屏蔽位模式;
02. CAN过滤器位宽为单个32位模式,使用FIFO0用于CAN接收;

03.使能CAN滤波器和CAN中断FIFO0接收;
/* CAN filter init */
    can_rx.filter.Filter_Num            = 0;                             //过滤器组0
    can_rx.filter.Filter_Mode           = CAN_FILTER_IDMASKMODE;         //标识符屏蔽位模式
    can_rx.filter.Filter_Scale          = /*  */CAN_FILTER_32BITSCALE;   //过滤器位宽为单个32位
    can_rx.filter.Filter_HighId         = CAN_STD_ID_LIST_32BIT_H(0x00000001);
    can_rx.filter.Filter_LowId          = CAN_STD_ID_LIST_32BIT_L(0x00000001);
    can_rx.filter.FilterMask_HighId     = CAN_STD_ID_H_MASK_DONT_CARE;
    can_rx.filter.FilterMask_LowId      = CAN_STD_ID_L_MASK_DONT_CARE;
    can_rx.filter.Filter_FIFOAssignment = CAN_FIFO0;  //FIFO0 用于CAN接收
    can_rx.filter.Filter_Act            = ENABLE;     //使能CAN滤波器
    CAN_Filter_Initializes(&can_rx.filter);
    /* IT Configuration for CAN */  
    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稳定性怎么样?有相关资料吗?

使用特权

评论回复
5
郁葱| | 2024-10-21 11:14 | 只看该作者
在调用CAN 收发这块可以给一个详细的代码示例吗?我这边CAN中断接收一直未调通,请教一下楼主这个问题?

使用特权

评论回复
6
一路向北lm|  楼主 | 2024-10-21 15:21 | 只看该作者
飘向北方 发表于 2024-10-21 10:08
USB-CAN 这个工具怎么连接的?这家的CAN稳定性怎么样?有相关资料吗?

广成科技的USB转CAN盒我感觉还可以,黑色这种,工作中拿来做CAN相关测试还是比较稳定的,一些具体使用的说明可以查阅这里的pdf,推荐使用。

使用特权

评论回复
7
一路向北lm|  楼主 | 2024-10-21 15:22 | 只看该作者
郁葱 发表于 2024-10-21 11:14
在调用CAN 收发这块可以给一个详细的代码示例吗?我这边CAN中断接收一直未调通,请教一下楼主这个问题? ...

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

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

        // //lum add ...
        …
        can_unpack_reply(temp_id.data.cmd_id);
}

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


使用特权

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

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

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

        // //lum add ...
        …
        can_unpack_reply(temp_id.data.cmd_id);
}

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


使用特权

评论回复
9
yangxiaor520| | 2024-10-22 07:42 | 只看该作者
国民的MCU还没有升级为CANFD吗?

使用特权

评论回复
10
一路向北lm|  楼主 | 2024-10-24 15:09 | 只看该作者
yangxiaor520 发表于 2024-10-22 07:42
国民的MCU还没有升级为CANFD吗?

国民有些系列的MCU带有CAN FD的,这款n32g430只是CAN2.0

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

277

主题

3805

帖子

76

粉丝