找回密码
 立即注册
查看: 57|回复: 3

stc32g8k48 CAN ,一直接收不到数据,大佬帮忙看下是不是哪错了

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2026-03-24 12:30:51
已绑定手机

2

主题

8

回帖

52

积分

注册会员

积分
52
发表于 2026-3-23 22:12:42 | 显示全部楼层 |阅读模式
想自适应 250 或500 波特率,和拓展帧或标准帧。 一直接收不到数据,大佬帮忙看下是不是哪错了,
用CAN工具发送数据  fCAN1ReadyRead 一直没有置位,硬件问题?但是能发送。
void CAN1_InitWithConfig(u8 baud, u8 frame_type)
{
                                CAN1_Enable();
       
                                CAN1_SwitchP0001();
       
              CAN1_SEL();                         //选择CAN1模块
        CAN_EnterResetMode();               //进入复位模式,开始对CAN模块进行初始化
                                               
                          CAN_NormalMode();                   //CAN模块为普通工作模式
        CAN_DoubleFilter();                 //CAN模块使用双过滤设置
                                CAN_SetSJW(0);               //设置重新同步跳跃宽度
              if(baud == BAUD_500K)
                                {
                                  CAN_SetBRP(0);
                                        CAN_SetTSG1(15);             //设置同步采样段1
                                  CAN_SetTSG2(6);             //设置同步采样段2
                                }
                                else  //250k
                                {
                                        CAN_SetBRP(1);
                                        CAN_SetTSG1(15);             //设置同步采样段1
                                  CAN_SetTSG2(6);             //设置同步采样段2
                                }       

                          CAN_SampleOnce();

                          
                CAN_SetACR0(BYTE3(0));       //设置验收代码寄存器
                CAN_SetACR1(BYTE2(0));       //设置验收代码寄存器
                CAN_SetACR2(BYTE1(0));       //设置验收代码寄存器
                CAN_SetACR3(BYTE0(0));       //设置验收代码寄存器
                CAN_SetAMR0(BYTE3(0xff));       //设置验收屏蔽寄存器
                CAN_SetAMR1(BYTE2(0xff));       //设置验收屏蔽寄存器
                CAN_SetAMR2(BYTE1(0xff));       //设置验收屏蔽寄存器
                CAN_SetAMR3(BYTE0(0xff));       //设置验收屏蔽寄存器

                CAN_ClearFlags(0xff);               //清除全部中断标志位
    CAN_EnableArbitrateLostInt();       //使能仲裁丢失中断
    CAN_EnableErrorWarningInt();        //使能错误警告中断
    CAN_EnableErrorPassiveInt();        //使能被动错误中断
    CAN_EnableReceiveInt();             //使能接收中断
    CAN_EnableTransmitInt();            //使能发送中断
    CAN_EnableBusErrorInt();            //使能总线错误中断
    CAN_EnableDataOverrunInt();         //使能接收溢出中断
    CAN1_SetIntPriority(0);             //设置中断为最低优先级
    CAN1_EnableInt();                   //使能CAN1中断
    fCAN1SendBusy = 0;                  //清除CAN数据包发送忙标志
    fCAN1ReadyRead = 0;                 //清除有待读取的CAN数据包标志

    CAN_ExitResetMode();                //退出复位模式,
                               
                CAN1_Tx.DataBuffer[0] = 0x02;
                CAN1_Tx.DataBuffer[1] = 0x01;
                CAN1_Tx.DataBuffer[2] = 0x0c;
                CAN1_Tx.DataBuffer[3] = 0;
                CAN1_Tx.DataBuffer[4] = 0;
                CAN1_Tx.DataBuffer[5] = 0;
                CAN1_Tx.DataBuffer[6] = 0;
                CAN1_Tx.DataBuffer[7] = 0;
                CAN1_Tx.DLC = 0x08;
                CAN1_Tx.RTR = 0;
                if(frame_type == FRAME_TYPE_STD)
                {
                         CAN1_Tx.FF = 0;
                         CAN1_Tx.ID = STD_REQ_ID;
                }       
                else
                {
                         CAN1_Tx.FF = 1;
                         CAN1_Tx.ID = EXT_REQ_ID;
                }               
}       


////////////////////////////////////////
// CAN1初始化函数
// 入口参数: 无
// 函数返回: 1 CAN匹配成功    0 CAN匹配失败
////////////////////////////////////////
u8 CAN1_AutoConfig(void)
{

    u8 n;
          static uint8_t idx = 0;
          CAN_DataDef *pCAN;   //临时变量,用于接收残余FIFOi
    for (idx = 0; idx < 4; idx++) {
        // 1. 初始化 CAN 硬件
        CAN1_InitWithConfig(g_config_list[idx].baud, g_config_list[idx].frame_type);
        delay_ms(10);
                        // 2. 清空接收 FIFO (通过读取直到空)
        do
                                {
                                                CAN_ReadFIFO(pCAN++);           //读取接收缓冲区数据
                                } while (CAN_CheckRBufferStatus()); //判断接收缓冲区里是否还有数据,有的话继续读取

        // 3. 发送诊断请求

        CAN_SendMsg(CAN1,&CAN1_Tx);   //发送一帧数据
                                if(fCAN1ReadyRead)
        {
            fCAN1ReadyRead = 0;

            n = CAN_ReadMsg(CAN1,CAN1_Rx);    //读取接收内容
                                         if(n>0)
                                         {
                                                                  printf("ID=0x%08lX ID2=0x%08lX", CAN1_Rx[0].ID ,g_config_list[idx].resp_id);

                                                 if (CAN1_Rx[0].ID == g_config_list[idx].resp_id) {   //    // 校验响应ID是否符合预期 (简单验证)
       
                                                        return 1;
                                           }
                                               
                                         
           }
        }


                                delay_ms(100);               

        // 失败,继续尝试下一组
    }
    return 0;   // 所有组合失败
                                                                                 
    //<<AICUBE_USER_CAN1_INITIAL_BEGIN>>
    // 在此添加用户初始化代码  
    //<<AICUBE_USER_CAN1_INITIAL_END>>
}

////////////////////////////////////////
// CAN1中断服务程序
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void CAN1_ISR(void) interrupt CAN1_VECTOR
{
    //<<AICUBE_USER_CAN1_ISR_CODE1_BEGIN>>
    // 在此添加中断函数用户代码  
    uint8_t isr;
    uint8_t aux;
    uint8_t ar;

    ar = CANAR;                         //LINAR现场保护
    aux = AUXR2;                        //AUXR2现场保护

    CAN1_SEL();                         //选择CAN1模块
    isr = CAN_ReadIntStatus();          //读取中断标志位
    CAN_ClearFlags(isr);                //写1清除中断标志位

    if (CAN_CheckArbitrateLost(isr))    //判断仲裁丢失中断标志位
    {
    }
    if (CAN_CheckErrorWarning(isr))     //判断错误警告中断标志位
    {
        if (CAN_CheckBusOffStatus())    //判断模块是否位BUS-OFF状态
        {
            CAN_ExitResetMode();        //BUS-OFF时CAN会自动加入复位模式,需要软件设置退出复位模式
        }
    }
    if (CAN_CheckErrorPassive(isr))     //判断被动错误中断标志位
    {
    }
    if (CAN_CheckReceive(isr))          //判断接收中断标志位
    {
        fCAN1ReadyRead = 1;             //设置CAN消息待读取标志
    }
    if (CAN_CheckTransmit(isr))         //判断发送中断标志位
    {
        fCAN1SendBusy = 0;              //清除CAN消息发送忙标志
    }
    if (CAN_CheckBusError(isr))         //判断总线错误中断标志位
    {
    }
    if (CAN_CheckDataOverrun(isr))      //判断接收溢出中断标志位
    {
    }

    AUXR2 = aux;                        //AUXR2现场恢复
    CANAR = ar;                         //CANAR现场恢复
    //<<AICUBE_USER_CAN1_ISR_CODE1_END>>
}


回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:654
  • 最近打卡:2026-04-03 10:02:32
已绑定手机

52

主题

2546

回帖

8932

积分

论坛元老

积分
8932
发表于 2026-3-24 11:55:31 | 显示全部楼层
波特率固定使用250或者500时能不能正常通信?
另外你通过什么方法来实现自适应调整参数?
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2026-03-24 12:30:51
已绑定手机

2

主题

8

回帖

52

积分

注册会员

积分
52
发表于 2026-3-24 12:30:51 来自手机 | 显示全部楼层
我是4个组合循环发送,模拟器收到正确组合验证I’d没问题就退出配置。 卡在循环一直收不到应答,待读标志一直是0。我用can工具测是有收到应答帧的。
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2026-03-24 12:30:51
已绑定手机

2

主题

8

回帖

52

积分

注册会员

积分
52
发表于 2026-3-24 13:30:38 | 显示全部楼层
乘风*** 发表于 2026-3-24 11:55
波特率固定使用250或者500时能不能正常通信?
另外你通过什么方法来实现自适应调整参数? ...

切换到库函数可以收发了, 不过我还不清楚原来的是会问题
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2026-4-4 17:41 , Processed in 0.127803 second(s), 57 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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