我们已将 TMS570LC4357连接到具有传入等时串行通道的 FPGA。
当数据包到达时、FPGA 将激活连接到 CPU 中 GIO 的 DMAREQ 信号。
DMA 控制器将数据包读入内部 SRAM。
数据包大小在操作期间是固定的、但我们希望能够轻松地向数据包中添加字段。
现在、我们有一个128字节的数据包、但正在考虑使用一个144字节的数据包。
现在、只有前48个字节包含非零值
为了简化设计、我们决定在之后将 DMA 源地址与256字节边界对齐
接收每个帧。
FPGA 将具有256字节的数据包存储器、但会在128KB 地址范围内进行影子化。
因此、在128KB 地址范围内、数据包存储器有128KB/256 = 512个别名。
我们初始化 DMA 通道源地址、以指向 FPGA 中128KB 范围的开头。
我们初始化 DMA 通道目标地址以指向已使用0xDEADBEF 初始化的存储器。
帧大小设置为128、块大小设置为3。
dma_dscr.ELDOFFSET = 0;
dma_dscr.ELSOFFSET = 0;
dma_dscr.FRDOFFSET = 0;
dma_dscr.FRSOFFSET = 128;
我们可以看到、第1和第3帧包含数据包数据。 第2个帧全部清除。
我们对 g_dmaCTRL dma_dscr 进行正确设置;
然后、我们被偏移误了。
dma_dscr.ELDOFFSET = 8;
dma_dscr.ELSOFFSET = 8;
dma_dscr.FRDOFFSET = 16;
dma_dscr.FRSOFFSET = 32;
结果与之前的设置相同。
然后、我将 FRAME_SIZE 更改为256+16 = 272 = 0x110。
我运行该程序、直到在三帧后获得块传输完成中断。
结果是我读取0x330字节并将它们存储在内部 RAM 中的0x330字节中。
元素边界上的 DMA 源地址和目标地址没有变化
帧边界处没有变化。
看起来 DMA 地址仅由实际的 DMA 和地址更新
不会使用偏移寄存器进行后处理。
void setup_frame_dma_descriptor (g_dmaCTRL * dma_dscr、frame_t * dst、hw_frame_t * src、uint16_t frame_count、uint16_t frame_size)
{
memset (dma_dscr、0、sizeof (g_dmaCTRL));
dma_dscr->Sadd =(uint32) src; //初始源地址 */
dma_dscr->dADD =(uint32) dst; //初始目标地址 */
dma_dscr->CHCTRL = 0; //要触发的下一个通道+ 1 */
dma_dscr->FRCNT = frame_count; //帧 计数 *
dma_dscr->ELCNT = frame_size >> 3; /* 8字节元素的元素计数*/
dma_dscr->ELDOFFSET = 0; /*元素目标偏移 量*/
dma_dscr->ELSOFFSET = 0; //元素源偏移 */
dma_dscr->FRDOFFSET = 0; /*帧目标偏移 */
dma_dscr->FRSOFFSET = 256-frame_size; /*帧源偏移 */
dma_dscr->PORTASGN = Porta_Read_Porta_write; // DMA 端口 A = EMIF 和 SRAM */
dma_dscr->RDSIZE = ACCESS_64_BIT; /*读取元素大小 */
dma_dscr->WRSIZE = ACCESS_64_BIT; /*写入元素大小 */
dma_dscr->tType = frame_transfer; //触发类型-帧/块 */
dma_dscr->ADDMODERD = ADDR_INC1; //源的寻址模式 */
dma_dscr->ADDMODEWR = ADDR_INC1; //目标地址寻址模式 */
dma_dscr->AUTOINIT = AUTOINIT_OFF; //自动初始化模式 */
}
这是我的最新设置
FRAME_SIZE = 128
setup_frame_dma_descriptor (&dma_dscr、&__frame_RX1[1]、 __FPGA_DMA_RX1[0]、3、frame_size*2);
dma_dscr.ELCNT = 68; //读取256+ 16 = 272
dma_dscr.ELDOFFSET = 8; /*元素目标偏移 量*
dma_dscr.ELSOFFSET = 8;
dma_dscr.RDSIZE = ACCESS_32_BIT;
dma_dscr.WRSIZE = ACCESS_32_BIT;
dma_dscr.FRDOFFSET = 16;
dma_dscr.FRSOFFSET = 32;
dmaSetCtrlPacket (frame_RX1_channel、dma_dscr);
偏移寄存器 EIOFF 和 FIOFF 是否被完全忽略、或者是否有办法使它们正常工作?