请问,设置过滤16个ID,能快速知道当前收到的ID是通过1~16路的哪一路过滤的吗?读哪个寄存器?不用和16个ID ...
我不太理解你的需求,过滤器的作用是接收自己需要的ID报文。
有必要知道当前接收的报文是从哪个过滤器进来的吗?
而且每一路过滤器允许接收什么ID是用户自己设置的。 假设我需要接收16个ID报文,也分别设置好了过滤器,ID是一个接一个的收,我想知道当前我收到的ID是16个ID中的哪一个?如当前收到的是第7个ID的报文,我从哪个寄存器读到ID号7?而不是和16个ID一一比较,得出是ID7 zguox 发表于 2025-10-23 16:27
假设我需要接收16个ID报文,也分别设置好了过滤器,ID是一个接一个的收,我想知道当前我收到的ID是16个ID中 ...
接收到报文时可以读取报文ID,数据长度,数据内容等信息:
READ_CAN_ID(pstcRx.u32ID);
READ_CAN_CTRL(pstcRx.RxCtrl.u16Ctrl);
u8DataSize = au8DLC2Size.RxCtrl.rx_ctrl.FDF].RxCtrl.rx_ctrl.DLC];
if(CANx == CAN1)
{
printf("CAN1 Read%d: ID=0x%08lx, DLC=%d, ",u8RxFrameCnt+1,pstcRx.u32ID,pstcRx.RxCtrl.rx_ctrl.DLC);
}
else
{
printf("CAN2 Read%d: ID=0x%08lx, DLC=%d, ",u8RxFrameCnt+1,pstcRx.u32ID,pstcRx.RxCtrl.rx_ctrl.DLC);
}
如果非要了解这个报文是从哪个过滤器进来的话,就只能根据读取的ID进行判断了。 写ACFADR是指向ACF号写,要是读ACFADR,是指向当前ACF号就完美了 如果开启DMA,16个ID报文,在存储器里是怎么排列的? zguox 发表于 2025-10-23 17:31
如果开启DMA,16个ID报文,在存储器里是怎么排列的?
如果CAN DMA数据宽度设置8位模式,就顺序排列。
如果CAN DMA数据宽度设置32位模式,地址就需要32位对齐。 #define DMA_CAN1_CR (*(unsigned char volatile far *)0x7ef533)
DMA_CAN1R_CR = 0xc1; //bit7 1:使能 CAN1R_DMA, bit6 1:开始 CAN1R_DMA, bit0 1:清除 FIFO
DMA_CAN1_CR = 0x11;
DMA_CAN1_ITVL = 0x0f; //设置传输间隔时间(低8位)
DMA_CAN1_ITVH = 0x00; //设置传输间隔时间(高8位)
DMA_CAN1_CR 这个寄存器好像没有说明? zguox 发表于 2025-10-29 16:49
#define DMA_CAN1_CR (*(unsigned char volatile far *)0x7ef533)
DMA_CAN1_CR 也就是规格书上写的 CAN1_AUX_CR
bit0: DMA RX Enable
bit4: DMA TX Enable STC32G144K246指令集和STC32G12K128指令集一样吗?
页:
1
[2]