Edit online

数据缓冲器

5 Mar 2024
Read time: 2 minute(s)
数据缓冲寄存器组是缓存发送和接收帧的存储空间,其访问地址范围为 0x40~0x70,读写共用相同的地址空间。
注: 复位状态下不可访问。
1. 数据缓冲寄存器组
寄存器 偏移地址 标准格式内容 扩展格式内容
CAN_BUF0 0x40 TX/RX 帧信息 TX/RX 帧信息
CAN_BUF1 0x44 TX/RX 标识符 1 TX/RX 标识符 1
CAN_BUF2 0x48 TX/RX 标识符 2 TX/RX 标识符 2
CAN_BUF3 0x4C TX/RX 数据 1 TX/RX 标识符 3
CAN_BUF4 0x50 TX/RX 数据 2 TX/RX 标识符 4
CAN_BUF5 0x54 TX/RX 数据 3 TX/RX 数据 1
CAN_BUF6 0x58 TX/RX 数据 4 TX/RX 数据 2
CAN_BUF7 0x5C TX/RX 数据 5 TX/RX 数据 3
CAN_BUF8 0x60 TX/RX 数据 6 TX/RX 数据 4
CAN_BUF9 0x64 TX/RX 数据 7 TX/RX 数据 5
CAN_BUF10 0x68 TX/RX 数据 8 TX/RX 数据 6
CAN_BUF11 0x6C 保留 TX/RX 数据 7
CAN_BUF12 0x70 保留 TX/RX 数据 8
  • 发送缓冲寄存器:CPU 对数据缓冲寄存器组的写操作访问,配置待发送报文,指定报文的帧类型、帧格式、帧标识符和数据。CPU 通过控制寄存器 CAN_MCR 配置发送报文模式:
    • 正常报文发送:TX_REQ 置 1。
    • 自发自收:SELF_REQ 置 1。
    • 单次发送:TX_REQ 和 ABORT_REQ 同时置 1。
  • 接收缓冲寄存器:CPU 对数据缓冲寄存器组的读取操作访问,接收缓冲寄存器映射到缓冲 FIFO 中的第一条报文,获取第一条报文的帧类型、帧格式、帧标识符和数据。

    读取完接收缓冲寄存器中的报文后,CPU 通过控制寄存器 CAN_MCR 中的 RXB_REL 置 1 来释放接收缓冲寄存器。

    若接收 FIFO 中仍有待处理的报文,按照接收报文的先后次序,将最早接收到的报文映射到接收缓冲寄存器中。

  • 缓冲 FIFO: 是一个 64 字节大小的内部缓冲器,以先进先出原则存储接收到的报文。
    1. 接收缓冲寄存器为 FIFO 中可访问窗口,偏移地址 0x40~0x70,将被映射到 FIFO 中的第一条报文。

      一条报文可在 FIFO 中占 3 ~ 13 字节空间,其中字节序与接收缓冲寄存器相同。

    2. 当控制器接收到一条报文时,接收数据计数器 RXC 增加 1,最大值为 64。

      如果 FIFO 中有足够空间,报文内容将被写入到 FIFO 中。

    3. CPU 读取接收缓冲寄存器中的报文后,通过将 RXB_REL 置 1,释放 FIFO 中第一条报文所占的空间,RXC 将减小 1。
    4. 接收缓冲寄存器接着映射 FIFO 中的下一条报文。
  • FIFO 数据溢出:任何情况下,FIFO 中可以存储的报文数量取决于各条报文的长度。当 FIFO 中没有足够空间完整地存储新报文时,控制器会产生数据溢出,通过状态位或数据溢出中断反馈给 CPU。

    FIFO 在内部将溢出报文标记为无效,后续接收到的溢出报文仍然将增加 RXC 到最大值 64。为了读取接收 FIFO 中的所有有效报文并清除所有溢出报文,应重复调用 RXB_REL,直到 RXC 为 0。