- 打卡等级:初来乍到
- 打卡总天数:5
- 最近打卡:2026-03-24 12:30:51
已绑定手机
注册会员
- 积分
- 52
|
想自适应 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>>
}
|
|