建议使用最新的STC32G实验箱例程包,屠龙刀例程包里面的CAN总线收发例子试试
例子可将缓冲区里面的报文一帧帧的读取出来
- //========================================================================
- // 函数: 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))); //读取有效数据
- }
- while(RX_Index&3) //判断已读数据长度是否4的整数倍
- {
- CanReadReg((u8)(RX_BUF0 + (RX_Index++&3))); //读取填充数据,一帧数据占据4的整数倍缓冲区空间,不足补0
- }
- }
-
- //========================================================================
- // 函数: u8 CanReadMsg(void)
- // 描述: CAN接收数据函数。
- // 参数: *CANx: 存放CAN总线读取数据.
- // 返回: 帧个数.
- // 版本: VER2.0
- // 日期: 2023-01-31
- // 备注:
- //========================================================================
- u8 CanReadMsg(CAN_DataDef *CAN)
- {
- u8 i;
- u8 n=0;
-
- do{
- CanReadFifo(&CAN[n++]); //读取接收缓冲区数据
- i = CanReadReg(SR);
- }while(i&0x80); //判断接收缓冲区里是否还有数据,有的话继续读取
-
- return n; //返回帧个数
- }
复制代码
|