- 打卡等级:常住居民I
- 打卡总天数:77
- 最近打卡:2025-04-15 13:59:49
高级会员
- 积分
- 575
|
发表于 2024-3-4 14:47:09
|
显示全部楼层
mark一下,省的下次再次翻找:
https://www.stcaimcu.com/forum.p ... &extra=page%3D3
1秒定时时间到后发送两帧can数据,结果是每次只发送一条什么原因,大神给指导
...
参考最新的屠龙刀例程包,或者STC32G库函数例程包里CAN总线例程,在“CanSendMsg”函数里增加发送完成判断(B_CanxSend ),上一帧数据发送完成后再发送本次数据,避免产生覆盖:
- void CanSendMsg(CAN_DataDef *CAN)
- {
- u32 CanID;
- u8 RX_Index,i;
- if(CANSEL) //判断是否CAN2
- {
- while(B_Can2Send); //等待CAN2上次发送完成
- }
- else
- {
- while(B_Can1Send); //等待CAN1上次发送完成
- }
- if(CAN->FF) //判断是否扩展帧
- {
- CanID = CAN->ID << 3;
- CanWriteReg(TX_BUF0,CAN->DLC|((u8)CAN->RTR<<6)|0x80); //bit7: 标准帧(0)/扩展帧(1), bit6: 数据帧(0)/远程帧(1), bit3~bit0: 数据长度(DLC)
- CanWriteReg(TX_BUF1,(u8)(CanID>>24));
- CanWriteReg(TX_BUF2,(u8)(CanID>>16));
- CanWriteReg(TX_BUF3,(u8)(CanID>>8));
- CanWriteReg(TX_BUF0,(u8)CanID);
- RX_Index = 1;
- for(i=0;((i<CAN->DLC) && (i<8));i++) //数据长度为DLC,最多不超过8
- {
- CanWriteReg((u8)(TX_BUF0 + (RX_Index++&3)),CAN->DataBuffer); //写入有效数据
- }
- while(RX_Index&3) //判断已读数据长度是否4的整数倍
- {
- CanWriteReg((u8)(TX_BUF0 + (RX_Index++&3)),0x00); //写入填充数据,一帧数据占据4的整数倍缓冲区空间,不足补0
- }
- }
- else //发送标准帧
- {
- CanID = (u16)(CAN->ID << 5);
- CanWriteReg(TX_BUF0,CAN->DLC|((u8)CAN->RTR<<6)); //bit7: 标准帧(0)/扩展帧(1), bit6: 数据帧(0)/远程帧(1), bit3~bit0: 数据长度(DLC)
- CanWriteReg(TX_BUF1,(u8)(CanID>>8));
- CanWriteReg(TX_BUF2,(u8)CanID);
- RX_Index = 3;
- for(i=0;((i<CAN->DLC) && (i<8));i++) //数据长度为DLC,最多不超过8
- {
- CanWriteReg((u8)(TX_BUF0 + (RX_Index++&3)),CAN->DataBuffer); //写入有效数据
- }
- while(RX_Index&3) //判断已读数据长度是否4的整数倍
- {
- CanWriteReg((u8)(TX_BUF0 + (RX_Index++&3)),0x00); //写入填充数据,一帧数据占据4的整数倍缓冲区空间,不足补0
- }
- }
- CanWriteReg(CMR ,0x04); //发起一次帧传输
- if(CANSEL) //判断是否CAN2
- {
- B_Can2Send = 1; //设置CAN2发送忙标志
- }
- else
- {
- B_Can1Send = 1; //设置CAN1发送忙标志
- }
- }
在中断函数里清除发送完成标志"B_Can1Send ":
- if((isr & 0x04) == 0x04) //TI
- {
- CANAR = ISR;
- CANDR = 0x04; //CLR FLAG
- B_Can1Send = 0;
- }
|
|
|