大家好、感谢大家始终回答我的问题。
今天、我想再次询问我上次询问的 DMA 硬件触发器。 在我的代码中、我还启用了 IF1 CMD 的 DMA 活动、并启用了 CAN CTL 的 DE1以应用硬件触发器、但 DMA 不起作用。
我不确定如何利用 HW 触发器将传输数据复制到 TX 缓冲区。
感谢你能抽出时间。 以下是我的代码。
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.
大家好、感谢大家始终回答我的问题。
今天、我想再次询问我上次询问的 DMA 硬件触发器。 在我的代码中、我还启用了 IF1 CMD 的 DMA 活动、并启用了 CAN CTL 的 DE1以应用硬件触发器、但 DMA 不起作用。
我不确定如何利用 HW 触发器将传输数据复制到 TX 缓冲区。
感谢你能抽出时间。 以下是我的代码。
您好!
在 IF1寄存器和消息 RAM 之间的传输完成后、DMA 被请求。 DMA 请求在第一次读取或写入其中一个 IF1/IF2寄存器之前一直保持有效。 当 DMA 激活为1时、写入报文编号(位[7:0])是一个异常。
由于 DMA 活动位的自动复位特性、必须为每个后续 DMA 周期单独设置该位。
在写入函数 UINT32 canTransmit_DMA ()中的 IF1NO 部分之前、您能否尝试设置"DMA Active"位:
canREG1->IF1NO =(uint8) canMESSAGE_BOX1;//CAN 통신으로 TX 数据 송신
返回0;
}
e2e.ti.com/.../20220923_5F00_DMA_5F00_HW_5F00_CAN.zip
我将使用我再次编写的硬件触发器向您发送 CAN 通信代码。
您好!
我意识到 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 可以。