问题1:数据移位产生原因?
问题2:ADS8556返回的前几帧数据0x7FFE7FFE代表了什么(数据手册里面没有介绍)?
对TI的ADS8556芯片进行AD采样时,采用DSPC6745的McASP模块以EDMA3方式接受数据。但是接受的数据有移位现象。而当采用CPU中断方式读取McASP中BUFF数据时正确。并且ADS8556芯片传输时在开头总有一段特定的数据。一般为0x7FFE7FFE(CPU中断模式下接受时,第一张图),DMA模式时该段数据为0XE7FFE7FF最低位移到最高位了。ADS8556返回的该段数据表示的是什么呢?第一张图的这段数据是CPU中断模式接受的正常数据,SDA8556有三个串行输出A/B/C三个,图中蓝色标注部分表示的是串行口A被检测的有效数据,数据分为两部分,如(x)=[6],0x5338表示一个数据,0x532c表示两一个数据。

第二张图是McASP模块下以EDMA模式下接受的数据。开头的三帧数据相比于Mcasp模块的CPU模式发生了一位移位。此时后面所有的数据都会发生一位移位。请问为什么会移位啊。(x)=[3],实际数据应该为0xFEFA.和0x503B.

McASP的配置如下:试图更改过接受数据的上升沿或是下降沿的配置。但是一直都有移位发生。求大神指导?
void McASP0_init()
{
/******* step1:复位 *******/
McASP0_GBLCTL = 0;
McASP0_RGBLCTL = 0; //affects only the receive bits of GBLCTL (bits 4-0)
McASP0_XGBLCTL = 0; //affects only the transmit bits of GBLCTL (bits 12-8)
/******* step2:配置其它寄存器 *******/
//配置接收寄存器
McASP0_RMASK = 0xffffffff; // 相应接收数据直接通过返还给CPU或者DMA
McASP0_RFMT = 0x000000f0; // 0-bit接收延时(AXR[n]引脚上接收到的第一个数据,发生在检测到FS的同一个ACLKR周期内)
// MSB、外围配置端口Slot size is 32 bits. Bitstream is LSB first.Pad extra bits with 0.(0填充)
McASP0_AFSRCTL = 0x00000002; // 具体有:(这里应该为位时钟)
// 0-slot TDM、FRWID=0接收帧同步信号的宽度为single bit、内部产生帧同步时钟、上升沿代表着一帧开始
McASP0_ACLKRCTL = 0x000000a0; // 上升沿采样接收数据,突发模式
// 接收位时钟源选择内部接收时钟源,由可编程位时钟分频器控制输出
// 分频比控制位(这里1分频,)、此处采用同步模式
McASP0_AHCLKRCTL = 0x00008000; //内部接收高频时钟源由可编程高频时钟分频器控制产生、AHCLKR = AUXCLK/1 = 24MHz、不反相
McASP0_RTDM = 0x00000001; //在接收TDM 时隙n 时有效。接收串行器在这个时隙将移入数据。和McASP0_AFSRCTL 对应
McASP0_RINTCTL = 0x00000000; //禁止中断…接收数据就绪中断使能
McASP0_RCLKCHK = 0x00FF0008; //接收时钟确认控制寄存器,不用
//配置发送寄存器
McASP0_XMASK = 0xffffffff;
McASP0_XFMT = 0x000000f0; //配置同接收的 McASP0_RFMT
McASP0_AFSXCTL = 0x00000002; // 具体有:0-slot TDM、发送帧同步信号的宽度为single bit、内部产生帧同步时钟、上升沿沿代表着一帧开始
McASP0_ACLKXCTL = 0x000000a0; // 上升沿采样发送数据,突发模式
// 接收位时钟源选择内部发送时钟源,由可编程位时钟分频器控制输出
// 分频比控制位(这里1分频,)、此处采用同步模式
McASP0_AHCLKXCTL = 0x00008000;
McASP0_XTDM = 0x00000001;
McASP0_XINTCTL = 0x00000000; //发送数据就绪中断使能
McASP0_XCLKCHK = 0x00FF0008;
//配置串行转换器寄存器,串行器0,1,23
McASP0_SRCTL0 = 0x00000001; //串行器0配置为发送
McASP0_SRCTL1 = 0x00000002; //串行器1配置为接收
McASP0_SRCTL2 = 0x00000002;
McASP0_SRCTL3 = 0x00000002;//0 as X,1/2/3 as R
//配置全局寄存器
McASP0_PFUNC = 0;
McASP0_PDIR = 0xfe000001;//AXR8(STB引脚),AXR0(SDI引脚)配置为输出
McASP0_DITCTL = 0x00000000; // 不适用DIT模式
McASP0_DLBCTL = 0x00000000;//顺序为偶数的串行器输出端连接到奇数串行器的输入端ORD = 1
McASP0_AMUTE = 0x00000000; // 静音控制寄存器
//对于DIT 模式的操作,要启动寄存器DITCSRA[n]、 DITCSRB[n]、
//DITUDRA[n]和 DITUDRB[n],此程序并不使用DIT模式,故略??
//XGBLCTL用于发送,RGBLCTL用于接收
/******* step3:启动高频时钟AHCLKX或AHCLKR(若采用外接时钟,可以省略) XHCLKRST *******/
McASP0_XGBLCTL |= (CSL_MCASP_GBLCTL_XHCLKRST_ACTIVE << CSL_MCASP_GBLCTL_XHCLKRST_SHIFT);//使内部的高频时钟分频器退出复位状态
while((McASP0_XGBLCTL & (CSL_MCASP_GBLCTL_XHCLKRST_ACTIVE << CSL_MCASP_GBLCTL_XHCLKRST_SHIFT)) !=
(CSL_MCASP_GBLCTL_XHCLKRST_ACTIVE << CSL_MCASP_GBLCTL_XHCLKRST_SHIFT))
{
;
}
McASP0_RGBLCTL |= (CSL_MCASP_GBLCTL_RHCLKRST_ACTIVE << CSL_MCASP_GBLCTL_RHCLKRST_SHIFT);//使内部的高频时钟分频器退出复位状态
while((McASP0_RGBLCTL & (CSL_MCASP_GBLCTL_RHCLKRST_ACTIVE << CSL_MCASP_GBLCTL_RHCLKRST_SHIFT)) !=
(CSL_MCASP_GBLCTL_RHCLKRST_ACTIVE << CSL_MCASP_GBLCTL_RHCLKRST_SHIFT))
{
;
}
/******* step4:启动串行时钟ACLKX或ACLKR(若采用外接时钟,可以省略) XCLKRST *******/
McASP0_XGBLCTL |= (CSL_MCASP_GBLCTL_XCLKRST_ACTIVE << CSL_MCASP_GBLCTL_XCLKRST_SHIFT);
while((McASP0_XGBLCTL & (CSL_MCASP_GBLCTL_XCLKRST_ACTIVE << CSL_MCASP_GBLCTL_XCLKRST_SHIFT)) !=
(CSL_MCASP_GBLCTL_XCLKRST_ACTIVE << CSL_MCASP_GBLCTL_XCLKRST_SHIFT))
{
;
}
McASP0_RGBLCTL |= (CSL_MCASP_GBLCTL_RCLKRST_ACTIVE << CSL_MCASP_GBLCTL_RCLKRST_SHIFT);
while((McASP0_RGBLCTL & (CSL_MCASP_GBLCTL_RCLKRST_ACTIVE << CSL_MCASP_GBLCTL_RCLKRST_SHIFT)) !=
(CSL_MCASP_GBLCTL_RCLKRST_ACTIVE << CSL_MCASP_GBLCTL_RCLKRST_SHIFT))
{
;
}
/******* step5:设置接口与DSP之间的数据传输方式 *******/
//(1)如果采用EDMA或者CPU中断来传递数据,要在此步骤启动EDMA或使能发送/接收中断
//(2)如果由CPU直接进行数据读取,在此步骤不做任何处置
//设置接口与DSP之间的数据传输方式,此时选用CPU
//直接进行数据读取,故不作设置.若采用EDMA或CPU
//中断来传递数据,则要启动EDMA或使能发送/接收中断
//…
EDMA3_EESR |= 0x00800001; // Set Event 1/23 Enable
EDMA3_IESR |= 0x00800000; // Enable interrupt 23
/******* step6:启动串并转换器 *******/
McASP0_XSTAT = 0x0000ffff;
McASP0_RSTAT = 0x0000ffff;//清除接收、发送状态寄存器
McASP0_XGBLCTL |= (CSL_MCASP_GBLCTL_XSRCLR_ACTIVE << CSL_MCASP_GBLCTL_XSRCLR_SHIFT);//使串并转换器退出复位
while((McASP0_XGBLCTL & (CSL_MCASP_GBLCTL_XSRCLR_ACTIVE << CSL_MCASP_GBLCTL_XSRCLR_SHIFT)) !=
(CSL_MCASP_GBLCTL_XSRCLR_ACTIVE << CSL_MCASP_GBLCTL_XSRCLR_SHIFT))
{
;
}
McASP0_RGBLCTL |= (CSL_MCASP_GBLCTL_RSRCLR_ACTIVE << CSL_MCASP_GBLCTL_RSRCLR_SHIFT);//使串并转换器退出复位
while((McASP0_RGBLCTL & (CSL_MCASP_GBLCTL_RSRCLR_ACTIVE << CSL_MCASP_GBLCTL_RSRCLR_SHIFT)) !=
(CSL_MCASP_GBLCTL_RSRCLR_ACTIVE << CSL_MCASP_GBLCTL_RSRCLR_SHIFT))
{
;
}
/******* step7:确保所有的发送缓冲器在工作 *******/
McASP0_XBUF0 = 0;
McASP0_RBUF1 = 0;
McASP0_RBUF2 = 0;
McASP0_RBUF3 = 0;
/******* step8:将状态机退出复位状态 *******/
McASP0_XGBLCTL |= (CSL_MCASP_GBLCTL_XSMRST_ACTIVE << CSL_MCASP_GBLCTL_XSMRST_SHIFT);//使状态机退出复位状态
while((McASP0_XGBLCTL & (CSL_MCASP_GBLCTL_XSMRST_ACTIVE << CSL_MCASP_GBLCTL_XSMRST_SHIFT)) !=
(CSL_MCASP_GBLCTL_XSMRST_ACTIVE << CSL_MCASP_GBLCTL_XSMRST_SHIFT))
{
;
}
McASP0_RGBLCTL |= (CSL_MCASP_GBLCTL_RSMRST_ACTIVE << CSL_MCASP_GBLCTL_RSMRST_SHIFT);//使状态机退出复位状态
while((McASP0_RGBLCTL & (CSL_MCASP_GBLCTL_RSMRST_ACTIVE << CSL_MCASP_GBLCTL_RSMRST_SHIFT)) !=
(CSL_MCASP_GBLCTL_RSMRST_ACTIVE << CSL_MCASP_GBLCTL_RSMRST_SHIFT))
{
;
}
/******* step9:将帧同步发生器退出复位状态 *******/
//即使帧同步信号由外部提供,也要使内部的帧同步发生器退出复位,因为在帧同步
//发生器内包含帧同步错误检测逻辑
McASP0_XGBLCTL |= (CSL_MCASP_GBLCTL_XFRST_ACTIVE << CSL_MCASP_GBLCTL_XFRST_SHIFT);//使帧同步发生器退出复位状态
while((McASP0_XGBLCTL & (CSL_MCASP_GBLCTL_XFRST_ACTIVE << CSL_MCASP_GBLCTL_XFRST_SHIFT)) !=
(CSL_MCASP_GBLCTL_XFRST_ACTIVE << CSL_MCASP_GBLCTL_XFRST_SHIFT))
{
;
}
McASP0_RGBLCTL |= (CSL_MCASP_GBLCTL_RFRST_ACTIVE << CSL_MCASP_GBLCTL_RFRST_SHIFT);//使帧同步发生器退出复位状态
while((McASP0_RGBLCTL & (CSL_MCASP_GBLCTL_RFRST_ACTIVE << CSL_MCASP_GBLCTL_RFRST_SHIFT)) !=
(CSL_MCASP_GBLCTL_RFRST_ACTIVE << CSL_MCASP_GBLCTL_RFRST_SHIFT))
{
;
}
}
Denny%20Yang99373:
先用示波器量一下,确保两种模式下信号时序是一致的。
TI中文支持网


