https://e2e.ti.com/support/processors-group/processors/f/processors-forum/824566/tms320c6748-edma3
器件型号:TMS320C6748最后、我们将尝试 QDMA。 不起作用:(
我的计划如下:
使用 QDMA 通道0从16位 GPIO 端口读取16次、并将读数保存在一组16位字中。
在 POR 之后、我按如下方式对其进行设置:
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.
https://e2e.ti.com/support/processors-group/processors/f/processors-forum/824566/tms320c6748-edma3
器件型号:TMS320C6748最后、我们将尝试 QDMA。 不起作用:(
我的计划如下:
使用 QDMA 通道0从16位 GPIO 端口读取16次、并将读数保存在一组16位字中。
在 POR 之后、我按如下方式对其进行设置:
您好!
我想您从固定地址(GPIO 端口)读取数据、然后将数据移动到具有增量目标地址的缓冲区中。 在最简单的情况下、只需读取一次 GPIO 16位、因此 ACNT=2、BCNT=1、这是否适合您? 也就是说、您是否会看到 IPR 位设置? 您的 QDMA 触发字是什么? 如果没有发生任何情况、您是否看到 EDMA 传输的任何错误? 例如在 ERRSTAT 寄存器中?
在读取的16次中、我认为您需要在 opt 字段中使用 SAM=0、DAM=1。
此致、Eric
很高兴有人最后回复!! 谢谢!!
出于学习目的、我简化了代码、使其成为8字节数组的 memcpy。 当我运行它时,它会导致错误。 ERRSTAT 和 ERRDET。 可能会发生什么情况?
ERRSTAT 0x00000001错误状态[内存映射]
_RESV_1 保留
MMRAERR 0 -无 MMR 地址错误事件
TRERR 0 -无 TR 错误事件
_RESV_4 *保留
BUSERR 1 -错误总线错误事件
ERREN 0x00000000错误使能[存储器映射]
ERRCLR 0x00000000错误清除寄存器[存储器映射]
ERRDET 0x00010001错误详细信息[存储器映射]
_RESV_1******** 保留
TCCHEN 0传输完成链使能
TCINTEN 1传输完成中断使能
_RESV_4**保留
TCC 000000传输完成代码
_RESV_6****保留
STAT 0001 - READ_ADDRESS 转换状态
ERRCMD 0x00000000错误命令[存储器映射]
以下是新的代码片段:
bool QDMA_DONE(){
uint32 x = RFDMA_READY;
bool TB =(x!= 0)? true:false;
退还(TB);
}
//====================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
空 InitQDMA(){
//清除中断状态
HWREG (ICR)= 0x00000001;
int i;
对于(i=0;i<8;i++){
dstdata[i]= 0;
}
//初始化参数集0
HWREG (QCHMAP0)= 0x0000000c;
HWREG (QEESR)= 0x00000001;
DATA_PARAM.src =(uint32) srcdata;
DATA_PARAM.acnt = 1;
DATA_PARAM.bcnt = 8;
DATA_PARAM.srcbidx = 1;
data_param.dstbidx = 1;
DATA_PARAM.bcntrld = 1;
DATA_PARAM.srccidx = 0;
DATA_PARAM.dstcidx = 0;
DATA_PARAM.ccnt = 1;
DATA_PARAM.OPT = 0x0010000c;//TCINTEN = 1、静态= 1、SYNCDIM=1
data_param.link = no_link;
//触发字;必须是函数中的最后一条赋值语句
//设置中断使能
//启用 QDMA 通道0
HWREG (IESR)= 0x00000001;
DATA_PARAM.DST =(uint32) dstdata;
/* int i;
对于(i=0;i<16;i++){
RF_readings[i]= 0;
}
//清除中断状态
HWREG (ICR)= 0x00000001;
//启用 QDMA 通道0
HWREG (QEESR)= 0x00000001;
//初始化参数集0
DATA_PARAM.src = RF_IN;
DATA_PARAM.acnt = 2;
DATA_PARAM.bcnt = 16;
DATA_PARAM.srcbidx = 0;
data_param.dstbidx = 2;
DATA_PARAM.bcntrld = 0;
DATA_PARAM.srccidx = 0;
DATA_PARAM.dstcidx = 0;
DATA_PARAM.ccnt = 1;
DATA_PARAM.DST =(uint32)&Rf_readings;
data_param.link = no_link;
//触发字;必须是函数中的最后一条赋值语句
//设置中断使能
HWREG (IESR)= 0x00000001;
DATA_PARAM.OPT = 0x00100008;//TCINTEN = 1、STATIC = 1
*
}
取得了一些进展。 参数中源和目标的地址调整使其工作。 我从其他 e2e 文章中发现、L2 RAM 的寻址方式与 EDMA3不同。
进入 GPIO 到 L2 RAM 中的16个样本存储... 如果我只尝试一个采样-也就是说、将一个16位 GPIO 读取传输到一个16位存储器位置、它就会起作用。 但是、一到16方案不起作用。 基本而言、我正在等待 IPR 中的中断位永久置位。 参数是
DATA_PARAM.acnt = 2;
DATA_PARAM.bcnt = 16;
DATA_PARAM.srcbidx = 0;
data_param.dstbidx = 2;
DATA_PARAM.bcntrld = 0;
DATA_PARAM.srccidx = 0;
DATA_PARAM.dstcidx = 0;
DATA_PARAM.ccnt = 1;
您好!
很高兴你取得了进步--把一个16位 GPIO 读数转移到一个16位内存位置,它工作正常。 对于"但一到16方案不起作用。"、即您读取 FIFO 16次、每次都将读取保存到不同的位置。 如果 data_param.dstbidx = 4有用、您可以尝试。 此外、在 OPT 字段中、位设置为 :中间传输完成中断使能和 传输完成中断使能、 以及传输同步维度。 尝试查看是否仅使用 A-SYNC 并同时启用中间中断和传输完成中断、您可以达到多远。 您是否在缓冲区中看到了 GPIO 数据? 以及接收到多少个缓冲器数据?
此外、我不确定您需要连续读取16个 QDMA 的原因。 DMA 读取速度如此之快、GPIO 可能未填充新数据。 因此、您可能将16个相同的 GPIO 数据放入16个不同的目的缓冲区中。 为什么不是每次只将一个16位 GPIO 读取到存储器中、那么应用需要知道下一个 GPIO 数据何时进入并安排另一个 QDMA 读取。
此致、Eric