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

采集的AD数据发生移位是什么原因?

问题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:

先用示波器量一下,确保两种模式下信号时序是一致的。

赞(0)
未经允许不得转载:TI中文支持网 » 采集的AD数据发生移位是什么原因?
分享到: 更多 (0)