- 打卡等级:以坛为家II
- 打卡总天数:497
- 最近打卡:2025-04-30 20:48:13
已绑定手机
金牌会员
- 积分
- 1196
|
//========================================================================
// 函数: void CanWriteReg(u8 addr, u8 dat)
// 描述: CAN功能寄存器配置函数。
// 参数: CAN功能寄存器地址, CAN功能寄存器数据.
// 返回: none.
// 版本: VER1.0
// 日期: 2020-11-16
// 备注:
//========================================================================
void CanWriteReg(u8 addr, u8 dat)
{
CANAR = addr;
CANDR = dat;
}
//========================================================================
// 函数: void CanReadFifo(CAN_DataDef *CANx)
// 描述: 读取CAN缓冲区数据函数。
// 参数: *CANx: 存放CAN总线读取数据.
// 返回: none.
// 版本: VER2.0
// 日期: 2023-01-31
// 备注:
//========================================================================
void CanReadFifo(CAN_DataDef *CAN)
{
u8 i;
u8 pdat[5];
u8 RX_Index=0;
pdat[0] = CanReadReg((u8)(RX_BUF0 + (RX_Index++&3)));
if(pdat[0] & 0x80) //判断是标准帧还是扩展帧
{
pdat[1] = CanReadReg((u8)(RX_BUF0 + (RX_Index++&3))); //扩展帧ID占4个字节
pdat[2] = CanReadReg((u8)(RX_BUF0 + (RX_Index++&3)));
pdat[3] = CanReadReg((u8)(RX_BUF0 + (RX_Index++&3)));
pdat[4] = CanReadReg((u8)(RX_BUF0 + (RX_Index++&3)));
CAN->ID = (((u32)pdat[1] << 24) + ((u32)pdat[2] << 16) + ((u32)pdat[3] << 8) + pdat[4]) >> 3;
}
else
{
pdat[1] = CanReadReg((u8)(RX_BUF0 + (RX_Index++&3))); //标准帧ID占2个字节
pdat[2] = CanReadReg((u8)(RX_BUF0 + (RX_Index++&3)));
CAN->ID = ((pdat[1] << 8) + pdat[2]) >> 5;
}
CAN->FF = pdat[0] >> 7; //帧格式
CAN->RTR = pdat[0] >> 6; //帧类型
CAN->DLC = pdat[0]; //数据长度
for(i=0;((i<CAN->DLC) && (i<8));i++) //读取数据长度为len,最多不超过8
{
CAN->DataBuffer[i] = CanReadReg((u8)(RX_BUF0 + (RX_Index++&3)));//读取有效数据;这里(RX_Index++&3)决定了0-3四个数,读不到4-7这几个字节??
}
while(RX_Index&3)//判断已读数据长度是否4的整数倍;这里怎么看出来是4整数的??
{
CanReadReg((u8)(RX_BUF0 + (RX_Index++&3))); //读取填充数据,一帧数据占据4的整数倍缓冲区空间,不足补0
}
}
|
|