zguox 发表于 2025-10-23 14:30:41

ACFADR,只读?

乘风飞扬 发表于 2025-10-23 16:15:17

zguox 发表于 2025-10-23 14:23
请问,设置过滤16个ID,能快速知道当前收到的ID是通过1~16路的哪一路过滤的吗?读哪个寄存器?不用和16个ID ...
我不太理解你的需求,过滤器的作用是接收自己需要的ID报文。
有必要知道当前接收的报文是从哪个过滤器进来的吗?
而且每一路过滤器允许接收什么ID是用户自己设置的。

zguox 发表于 2025-10-23 16:27:50

假设我需要接收16个ID报文,也分别设置好了过滤器,ID是一个接一个的收,我想知道当前我收到的ID是16个ID中的哪一个?如当前收到的是第7个ID的报文,我从哪个寄存器读到ID号7?而不是和16个ID一一比较,得出是ID7

乘风飞扬 发表于 2025-10-23 17:18:05

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进行判断了。

zguox 发表于 2025-10-23 17:23:34

写ACFADR是指向ACF号写,要是读ACFADR,是指向当前ACF号就完美了

zguox 发表于 2025-10-23 17:31:08

如果开启DMA,16个ID报文,在存储器里是怎么排列的?

乘风飞扬 发表于 2025-10-23 18:17:56

zguox 发表于 2025-10-23 17:31
如果开启DMA,16个ID报文,在存储器里是怎么排列的?

如果CAN DMA数据宽度设置8位模式,就顺序排列。
如果CAN DMA数据宽度设置32位模式,地址就需要32位对齐。

zguox 发表于 2025-10-29 16:49:08

#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 这个寄存器好像没有说明?

乘风飞扬 发表于 2025-10-29 17:19:40

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

zguox 发表于 2025-10-29 17:27:06

STC32G144K246指令集和STC32G12K128指令集一样吗?
页: 1 [2]
查看完整版本: CAN-FD,2组, 有 DMA支持;STC32G144K246 的 2组 独立 CAN-FD 功能测试通过