CAN 模块有三个报文接口寄存器:IF1、IF2和 IF3。 如何使 DMA 能够将消息传输到 IF2数据寄存器的 IF1和 IF3x 数据寄存器?
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
CAN 模块有三个报文接口寄存器:IF1、IF2和 IF3。 如何使 DMA 能够将消息传输到 IF2数据寄存器的 IF1和 IF3x 数据寄存器?
CAN 模块有三个报文接口寄存器:IF1、IF2和 IF3。
第一。 使用 IF3x 和 DMA 接收消息
IF3寄存 器组可以用接收到的报文对象自动更新、而无需由 CPU 启动从报文 RAM 的传输。 IF3的这个特性的目的是为 DMA 提供一个接口来高效读取数据包。
邮箱可被启用以实现自动 IF3更新。 如果使用消息 box1和 box2、则应设置 DCAN IF3UPD12的位0和位1。
//消息框1,2配置为自动更新
CANREG1->IF3UEy[0]= 0x00000003;
应设置 IF3观察寄存器中的观察标志:
CANREG1->IF3OBS = 0x18; //读取数据 A & B - 8字节
DMA 数据包的源地址为: canREG1->IF3DATx[0]
DMA 数据包的目的地址为:SRAM 中的存储器位置。
2。 使用 IF1x、IF2x 和 DMA 进行消息传输
IF1/IF2不适用于 DMA 操作。 需要在 TRM 中进行一些澄清、以列出将 DMA 与 DCAN 搭配使用的限制。
如果您转到 DCAN IF1DATA 和 IF1DATB 寄存器说明、这些寄存器受写保护、这意味着它们只能在特权模式下写入。 但是、DMA 被设计成始终在用户模式下运行。 因此、DMA 永远不能写入这些 DCAN 寄存器。 当一个写入从 DMA 发生时、DCAN 将只忽略这些写入。
即使在用户模式下这些寄存器是可写的、使用 DMA 将数据传输到 IF1/2寄存器也没有任何优势。 首先、有效载荷仅为8字节。 您本可以相当快地将存储多个(STM)指令写入 IF1DATA/IF1DATB 寄存器、而不是使用 DMA 来设置通道、并等待 DMA 在传输完成时中断 CPU。 其次、DMA 不知道何时允许它写入寄存器。 在写入 IFX 寄存器之前、您需要轮询 BUSY 位以了解 IFX 和消息 RAM 之间的传输是否正在进行。 DMA 没有此类功能。 只有 CPU 可以。