找回密码
 立即注册
查看: 906|回复: 4

各位佬们请教下CAN通讯发送失败卡死的问题

[复制链接]

2

主题

9

回帖

69

积分

注册会员

积分
69
发表于 2024-8-12 15:27:02 | 显示全部楼层 |阅读模式
本帖最后由 T-Rex1000 于 2024-8-12 15:28 编辑


void CAN_Transimit(uint16_t CAN_ID,uint8_t* datas,uint8_t len)
{
    uint16_t CanID;
    uint8 RX_Index=0,i=0;
    uint8_t sr;
    if(CAN_Init_finish)
    {
        sr=CanReadReg(SR);
        
        if(sr&0x01)
        {
            CANAR=MR;
            CANDR&=~0x04;
        }
        else
        {
            CanID = CAN_ID << 5;
            CanWriteReg(TX_BUF0,len); //标准帧, 数据帧, bit3~bit0: 数据长度(DLC)
            CanWriteReg(TX_BUF1,(uint8_t)(CanID>>8));
            CanWriteReg(TX_BUF2,(uint8_t)CanID);
            
            RX_Index = 3;
            
            for(i=0;i<len;i++)        //数据长度为DLC,最多不超过8
            {
                CanWriteReg((uint8_t)(TX_BUF0 + (RX_Index++&3)),datas);   //写入有效数据
            }
            
            while(RX_Index&3)   //判断已读数据长度是否4的整数倍
            {
//写入填充数据,一帧数据占据4的整数倍缓冲区空间,不足补0
                CanWriteReg((uint8_t)(TX_BUF0 + (RX_Index++&3)),0x00);  
            }
            
            CanWriteReg(CMR,0x04); //发起一次帧传输
            B_Can1Send = 1;     //设置CAN1发送忙标志
        }
    }
}




回复

使用道具 举报 送花

2

主题

9

回帖

69

积分

注册会员

积分
69
发表于 2024-8-12 15:30:51 | 显示全部楼层
本帖最后由 T-Rex1000 于 2024-8-12 15:32 编辑

想问下各位佬为什么我每次发送都有清除错误寄存器,但只要出现通讯失败就还是不能恢复通讯,而且会占用其他中断还有主线程的资源导致卡顿
回复 支持 反对

使用道具 举报 送花

2

主题

9

回帖

69

积分

注册会员

积分
69
发表于 2024-8-12 15:31:16 | 显示全部楼层

void CANBUS_Interrupt(void) interrupt 28
{
        uint16_t CAN_ID=0x0000;
        uint8_t isr;
        isr = CanReadReg(ISR);
        if((isr & 0x04) == 0x04)
        {
                CANAR = 0x03;
                CANDR = 0x04; //CLR FLAG
        }
        if((isr & 0x08) == 0x08)
        {
                CANAR = 0x03;
                CANDR = 0x08; //CLR FLAG
                //CAN_ID = CanReadMsg(RX_BUF); //接收 CAN 总线数据
                //CAN_Transimit(CAN_ID+1,RX_BUF,8); //CANID 加 1,原样发送 CAN 总线数据
        }
}
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6841

积分

论坛元老

积分
6841
发表于 2024-8-13 09:27:36 | 显示全部楼层
你的中断里面只处理了CAN收发完成中断标志,没有处理错误中断标志。
如果开启了CAN总线错误中断,产生错误中断后没进行处理的话,就会反复触发中断,从而占用大量系统资源。
参考STC32G实验箱例程包或者屠龙刀例程包里面的CAN总线例子,对所有已使能的中断标志进行处理。
CAN通信调试需要总线上有2个以上节点才能正常进行收发通信,如果没有另外一个节点进行应答的话发送就会产生总线错误,一旦错误次数超过255就会触发BUS-OFF,导致当前节点无法再进行收发。清除 Reset Mode,从BUS-OFF状态退出后才能恢复通信功能。
回复 支持 反对

使用道具 举报 送花

2

主题

9

回帖

69

积分

注册会员

积分
69
发表于 2024-8-26 22:19:39 | 显示全部楼层
乘风*** 发表于 2024-8-13 09:27
你的中断里面只处理了CAN收发完成中断标志,没有处理错误中断标志。
如果开启了CAN总线错误中断,产生错误 ...

好的谢谢,我找时间试试
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 06:38 , Processed in 0.129218 second(s), 71 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表