TI中文支持网
TI专业的中文技术问题搜集分享网站

C6748 UPP的DMA通道配置问题

您好

我需要用UPP与FPGA进行通信,先进行DEBUG,不对FPGA进行烧写,而采用UPP的B通道发送,A通道接收的模式。可是现在无法进入EOW中断。怀疑是通道配置有误。

目标:64byte数据进行传递:

配置代码如下:

#define upp_line_size        (8)
#define upp_line_count       (4)
#define upp_frame_size       (upp_line_size * upp_line_count)
#define upp_line_offset      (upp_line_size)
//将数据进行对齐
#pragma DATA_ALIGN(upp_buffer_a, 8)
#pragma DATA_ALIGN(upp_buffer_b, 8)
unsigned short upp_buffer_a[upp_frame_size];
unsigned short upp_buffer_b[upp_frame_size];
// A 通道参数 接收
  transposeParA.WindowAddress     = (unsigned int*)upp_buffer_a;
  transposeParA.LineCount         = upp_line_count;
  transposeParA.ByteCount         = upp_line_size;
  transposeParA.LineOffsetAddress =upp_line_offset;
  // B 通道参数 发送
  transposeParB.WindowAddress     = (unsigned int*)upp_buffer_b;
  transposeParB.LineCount         = upp_line_count;
  transposeParB.ByteCount         = upp_line_size;
  transposeParB.LineOffsetAddress = upp_line_offset;
DMA通道配置:
void uPPDMATransfer(unsigned int baseAdd, unsigned char DMAChannel, uPPDMAConfig *config)
{ unsigned int temp_dma;
 unsigned int  windows_add,BCNT, OFFSETLINE;
 windows_add=((unsigned int)(config->WindowAddress))>>3;
 BCNT=(config->ByteCount)>>1;
 OFFSETLINE=(config->LineOffsetAddress)>>3;
 HWREG(SOC_SYSCFG_0_REGS+SYSCFG0_KICK0R)=SYSCFG_KICK0R_UNLOCK;
 HWREG(SOC_SYSCFG_0_REGS+SYSCFG0_KICK1R)=SYSCFG_KICK1R_UNLOCK;
 if(DMAChannel==uPP_DMA_CHI)
 {
  temp_dma=HWREG(baseAdd+UPP_UPID0)&(~UPP_UPID0_ADDRH);
  HWREG(baseAdd+UPP_UPID0)=(windows_add<<UPP_UPID0_ADDRH_SHIFT)|temp_dma;
  temp_dma=HWREG(baseAdd+UPP_UPID0)&(~UPP_UPID0_ADDR);
  HWREG(baseAdd+UPP_UPID0)=(0x0<<UPP_UPID0_ADDR_SHIFT)|temp_dma;
  temp_dma=HWREG(baseAdd+UPP_UPID1)&(~UPP_UPID1_LNCNT);
  HWREG(baseAdd+UPP_UPID1)=(config->LineCount<<UPP_UPID1_LNCNT_SHIFT)|temp_dma;
  temp_dma=HWREG(baseAdd+UPP_UPID1)&(~ UPP_UPID1_BCNTH);
  HWREG(baseAdd+UPP_UPID1)=(BCNT<<UPP_UPID1_BCNTH_SHIFT)|temp_dma;
  temp_dma=HWREG(baseAdd+UPP_UPID1)&(~UPP_UPID1_BCNT);
  HWREG(baseAdd+UPP_UPID1)=(0x0<<UPP_UPID1_BCNT_SHIFT)|temp_dma;
  temp_dma=HWREG(baseAdd+UPP_UPID2)&(~UPP_UPID2_LNOFFSETH);
  HWREG(baseAdd+UPP_UPID2)=(OFFSETLINE<<UPP_UPID2_LNOFFSETH_SHIFT)|temp_dma;
  temp_dma=HWREG(baseAdd+UPP_UPID2)&(~UPP_UPID2_LNOFFSET);
  HWREG(baseAdd+UPP_UPID2)=(0x0<<UPP_UPID2_LNOFFSET_SHIFT)|temp_dma;
 }
 else
 {
  temp_dma=HWREG(baseAdd+UPP_UPQD0)&(~UPP_UPQD0_ADDRH);
  HWREG(baseAdd+UPP_UPQD0)=(windows_add<<UPP_UPQD0_ADDRH_SHIFT)|temp_dma;
  temp_dma=HWREG(baseAdd+UPP_UPQD0)&(~UPP_UPQD0_ADDR);
  HWREG(baseAdd+UPP_UPQD0)=(0x0<<UPP_UPQD0_ADDR_SHIFT)|temp_dma;
  temp_dma=HWREG(baseAdd+UPP_UPQD1)&(~UPP_UPQD1_LNCNT);
  HWREG(baseAdd+UPP_UPQD1)=(config->LineCount<<UPP_UPQD1_LNCNT_SHIFT)|temp_dma;
  temp_dma=HWREG(baseAdd+UPP_UPQD1)&(~UPP_UPQD1_BCNTH);
  HWREG(baseAdd+UPP_UPQD1)=(BCNT<<UPP_UPQD1_BCNTH_SHIFT)|temp_dma;
  temp_dma=HWREG(baseAdd+UPP_UPQD1)&(~UPP_UPQD1_BCNT);
  HWREG(baseAdd+UPP_UPQD1)=(0x0<<UPP_UPQD1_BCNT_SHIFT)|temp_dma;
  temp_dma=HWREG(baseAdd+UPP_UPQD2)&(~UPP_UPQD2_LNOFFSETH);
  HWREG(baseAdd+UPP_UPQD2)=(OFFSETLINE<<UPP_UPQD2_LNOFFSETH_SHIFT)|temp_dma;
  temp_dma=HWREG(baseAdd+UPP_UPQD2)&(~UPP_UPQD2_LNOFFSET);
  HWREG(baseAdd+UPP_UPQD2)=(0x0<<UPP_UPQD2_LNOFFSET_SHIFT)|temp_dma;
 }
 HWREG(SOC_SYSCFG_0_REGS+SYSCFG0_KICK0R)=SYSCFG_KICK0R_UNLOCK+0x1;
 HWREG(SOC_SYSCFG_0_REGS+SYSCFG0_KICK1R)=SYSCFG_KICK1R_UNLOCK+0x1;
}
现在问题是,无法进入中断,同时B通道的line,经观察后,远远超过我设定的4。
想询问一下,DMA的offsetline是怎样填写地址,在设定每个line为8 byte的情况下。是通过将windows_add+upp_line_size写入UPP_UPPQD2_LNOFFSETH里面吗?还是需要做什么处理?
谢谢各位。
Tony Tang:

把你想要实现的传输,以及目前的结果与期望的偏差,用自己的理解方式简化写下来,这一长串的宏定义看起来太费劲了,不清楚你具体要实现什么功能。

赞(0)
未经允许不得转载:TI中文支持网 » C6748 UPP的DMA通道配置问题
分享到: 更多 (0)