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

McBSP读取ADS8556

请问,我现在想用McBSP来读取ADS8556转化后的数据,应该怎么配置McBSP?

ADS8556以串行的方式发送数据给McBSP,8556应该配置为软件模式还是硬件模式?

McBSP的CLKXA,FSXA,MDXA和MDRA分别连接8556的SCLK,FS,SDI和SDO_A,但是读到的数据全部为0.

下面是我对McBSP的配置:

void mcbsp_init_dlb()
{     McbspaRegs.SPCR2.all=0x0000;  // Reset FS generator, sample rate generator & transmitter
    McbspaRegs.SPCR1.all=0x1000;  // 时钟停止模式

    //  McbspaRegs.SPCR1.bit.DLB = 1;       // Enable DLB mode. Comment out for non-DLB mode.

   McbspaRegs.MFFINT.all=0x0;   // Disable all interrupts

    McbspaRegs.RCR2.all=0x0001;   // Single-phase frame, 1 word/frame, No companding (Receive)
    McbspaRegs.RCR1.all=0x0;
    McbspaRegs.XCR2.all=0x0001;   // Single-phase frame, 1 word/frame, No companding (Transmit)
    McbspaRegs.XCR1.all=0x0;

    McbspaRegs.SRGR2.bit.CLKSM = 1;  // CLKSM=1 (If SCLKME=0, i/p clock to SRG is LSPCLK)
    McbspaRegs.SRGR2.bit.FPER = 15;  // FPER = 16 CLKG periods

    McbspaRegs.SRGR1.bit.FWID = 0;      // Frame Width = 1 CLKG period
    McbspaRegs.SRGR1.bit.CLKGDV = 15; // CLKG frequency = LSPCLK/(CLKGDV+1)

    McbspaRegs.PCR.bit.FSXM = 1;  // FSX generated internally, FSR derived from an external source
    McbspaRegs.PCR.bit.FSRM = 1;
    McbspaRegs.PCR.bit.CLKXM = 1;  // CLKX generated internally, CLKR derived from an external source
    McbspaRegs.PCR.bit.CLKRM = 1;
    McbspaRegs.PCR.bit.FSXP = 1;
    McbspaRegs.PCR.bit.CLKXP = 0;
    McbspaRegs.PCR.bit.CLKRP = 1;

    //*************** Initialize McBSP Data Length
      InitMcbspa16bit();

    //************* Enable Sample rate generator
    McbspaRegs.SPCR2.bit.GRST=1; // Enable the sample rate generator
    delay_loop();                // Wait at least 2 SRG clock cycles
    McbspaRegs.SPCR2.bit.XRST=1; // Release TX from Reset
    McbspaRegs.SPCR1.bit.RRST=1; // Release RX from Reset
    McbspaRegs.SPCR2.bit.FRST=1; // Frame Sync Generator reset
}

用示波器观察8556的BUSY/INT管脚,输出波形正确,说明8556一直在转化数据。而CLKXA为低,FSXA为高,应该是McBSP没有在传输数据吧。

请问应该如何操作,才能收到AD的数据?

Jones Chen:

给你一段我写的读取AD的代码工参考

 

interrupt void mcbspRxFifoIsr(void){   int i=0;   int16  Mcbsp_rdata[6]; // Mcbsp 接收数据数组   int32 *piPower;   int16 *piSingle;

   if(McbspaRegs.MFFRX.bit.RXFFOVF_FLAG==1)  //检测是否Mcbsp接收FIFO溢出   {           //若溢出,发光二极管D8亮  GpioDataRegs.GPBDAT.bit.GPIOB1 = ~GpioDataRegs.GPBDAT.bit.GPIOB1;//发光二极管D8亮  McbspaRegs.MFFRX.bit.RXFFOVF_CLEAR=1;   // Clear Overflow flag  mcbsp_reset();

     McbspaRegs.MFFRX.bit.RXFFINT_CLEAR=1;   // Clear Interrupt flag     PieCtrlRegs.PIEACK.all|=0x20;           // Issue PIE ack  return;   }    for(i=0;i<6;i++) {    Mcbsp_rdata[i]=McbspaRegs.DRR1.all; }

 //Write power piPower = (int32 *) STUDY_POWER_BUF_BASE; piPower[ glPower_Point_Position] += Mcbsp_rdata[CURRENT_A]*Mcbsp_rdata[VOLTAGE_A]; piPower[ glPower_Point_Position] += Mcbsp_rdata[CURRENT_B]*Mcbsp_rdata[VOLTAGE_B]; piPower[ glPower_Point_Position] += Mcbsp_rdata[CURRENT_C]*Mcbsp_rdata[VOLTAGE_C];

 //Save Single piSingle = (int16 *) STUDY_SINGLE_BUF_BASE; piSingle[ glPower_Point_Position] = Mcbsp_rdata[ STUDY_SELECT_SINGLE];

 glPower_Point_Position++; glPower_Point_Number++;

   McbspaRegs.MFFRX.bit.RXFFINT_CLEAR=1;   // Clear Interrupt flag   PieCtrlRegs.PIEACK.all|=0x20;           // Issue PIE ack}//end interrupt */

/*********************************MCBSP初始化******************************************//************************函数功能描述************************//*********每6个字产生一次Mcbsp接收中断,每个字为16位*********//******发送(接收)帧同步,发送(接收)时钟同步均由外部提供******/ void mcbsp_init(){

/*************** MCBSP 复位*********************/   McbspaRegs.SPCR2.bit.FRST=0; // 帧同步产生器复位   McbspaRegs.SPCR2.bit.GRST=0; // 采样速率生成器复位   McbspaRegs.SPCR2.bit.XRST=0; // 发送器复位   McbspaRegs.SPCR1.bit.RRST=0; // 接收器复位

/***************McBSP 寄存器 初始化************/   McbspaRegs.SPCR2.all=0x0100; // 串口控制寄存器2 //(9)FREE=0  自由运行模式是禁止的 //(8)SOFT=1  SOFT模式是使能的 //(7)FRST=0   //(6)GRST=0  采样速率生成器是复位的 //(5.4)XINTM=00 (X)INT由(X)RDY驱动 //(3)XSYNCERR=0 没有发送同步错误 //(2)XEMPTY=0 发送移位寄存器(XSR)为空 只读 //(1)XREDY=0 发送器没有准备好  只读 //(0)XRST=0  发送器是复位的   McbspaRegs.SPCR1.all=0x0000; // 串口控制寄存器1   //(15)DLB=0   数字回路自测试模式 禁用   //(1413)RJUST=00  DRR采用右对齐模式,用0填充MSB   //(1211)CLKSTP=00 禁止时钟停止模式,工作在非SPI模式   //(10~8)保留   //(7)DXENA=0   DX使能器关闭   //(6)ABIS=0   禁止A-bis模式   //(5.4)RINTM=0  (R)INT由(R)RDY驱动   //(3)RSYNCERR=0   没有接收同步错误   //(2)RFULL=0   接收移位寄存器(RSR) 不是满的 只读   //(1)RRDY=0   接收器没有准备好    只读   //(0)RRST=0   接收器是复位的 

   McbspaRegs.RCR2.all=0x0001;//接收控制寄存器2   //(15)RPHASE=0   接收相位    单项   //(4~3)RCOMPAND  接收压缩解压模式 不进行压缩解压 从MSB开始发送数据   //??(2)RFIG=0    接收帧忽略  第一个重新发送后的接受帧同步脉冲   //(1.0)RDATDLY=1 接收数据延迟     1位数据延迟      McbspaRegs.RCR1.all=0x0040;//接收控制寄存器1   //(14~8)RFRLEN1=0接收帧长1=0000000 每帧一个字   //(7~5)RWDLEN1=0接收字长1=010   每字16位

   McbspaRegs.XCR2.all=0x0001;//发送控制寄存器2   McbspaRegs.XCR1.all=0x0040;//发送控制寄存器1

   McbspaRegs.MCR2.all=0x0000;//多通道控制寄存器2   McbspaRegs.MCR1.all=0x0000;//多通道控制寄存器1/***************帧同步设置*************************/   McbspaRegs.SRGR2.all=0x8000;//采样速率生成器2    //(15)GSYNC=1 采样速率生成器时钟同步    //(13)CLKSM=0    外部CLKR引脚时钟           //(12)FSGM=0  只有当内部提供帧同步信号时有效   //(11~0)FPER=0   由于外部帧提供帧同步信号 FPER的设置对帧周期没有影响                          McbspaRegs.SRGR1.all=0x0000;//采样速率生成器1    //(15~8)FWID=0 帧宽度          //(7~0)CLKGDV=0 采样速率生成器时钟分频系数     McbspaRegs.PCR.all=0x0080;//引脚控制寄存器   ok   //(11)FSXM=0(发送帧同步) 外部提供发送帧同步       //(10)FSRM=0(接收帧同步) 外部提供接收帧同步   //(9)CLKXM=0(发送时钟)   外部引脚CLK(R/X)提供   //(8)CLKRM=0(接收时钟) 外部引脚CLK(R/X)提供   //(7)SCLKME=1   外部CLKR引脚时钟/************MCBSP FIFO 寄存器配置****************/    McbspaRegs.MFFTX.all= 0x4000;//FIFO 发送寄存器 ok   //MFFENA=1 MCBSP FIFO增强功能 使能    //发送FIFO处于复位状态   //TX FIFO中断 禁止

   McbspaRegs.MFFRX.all= 0x0026; //FIFO 接收寄存器 ok   //6个字产生一次接收中断 每个字16位   //基于RXFFIVL匹配的RX FIFO的中断使能   //当RXFFST>=RXFFIL=6个字时产生Mcbsp接收中断   //接收FIFO处于 复位状态

   McbspaRegs.MFFCT.all= 0x0000;//FIFO 控制寄存器 ok    //只有在SPI模式下才使用该寄存器,在Mcbsp模式下 这些位不起作用

   McbspaRegs.MFFINT.all=0x0000;//FIFO 中断寄存器 ok   //只有在非FIFO和A-bis FIFO模式下 才使用该寄存器

   McbspaRegs.MFFST.all=0x000;//FIFO 状态寄存器   ok   //FSR标志:检测到接收帧同步脉冲=1   //FSX标志:检测到发送帧同步脉冲=1

/************** Enable FIFO**********************/   McbspaRegs.MFFTX.bit.TXFIFO_RESET=1;//发送FIFO 脱离 复位状态 ok   McbspaRegs.MFFRX.bit.RXFIFO_RESET=1;//接收FIFO 脱离 复位状态 ok   /************* Enable Sample rate generator******/   McbspaRegs.SPCR2.bit.GRST=1;//   delay_loop(1000000);    DELAY_US(1000);

}         

void mcbsp_reset(void){   McbspaRegs.MFFRX.bit.RXFIFO_RESET = 0;

/************ Enable TX/RX unit******************/   McbspaRegs.SPCR2.bit.XRST=0;   McbspaRegs.SPCR1.bit.RRST=0;   /************* Frame Sync generator reset********/   McbspaRegs.SPCR2.bit.FRST=0;  

 tPower_Raw_Buf.iCount = 0; tPower_Raw_Buf.iRead = 0; tPower_Raw_Buf.iWrite = 0;

   McbspaRegs.MFFRX.bit.RXFIFO_RESET = 1;

   McbspaRegs.MFFRX.bit.RXFFINT_CLEAR = 1;   McbspaRegs.MFFRX.bit.RXFFOVF_CLEAR = 1;

/************ Enable TX/RX unit******************/   McbspaRegs.SPCR2.bit.XRST=1;   McbspaRegs.SPCR1.bit.RRST=1;   /************* Frame Sync generator reset********/   McbspaRegs.SPCR2.bit.FRST=1; }

请问,我现在想用McBSP来读取ADS8556转化后的数据,应该怎么配置McBSP?

ADS8556以串行的方式发送数据给McBSP,8556应该配置为软件模式还是硬件模式?

McBSP的CLKXA,FSXA,MDXA和MDRA分别连接8556的SCLK,FS,SDI和SDO_A,但是读到的数据全部为0.

下面是我对McBSP的配置:

void mcbsp_init_dlb()
{     McbspaRegs.SPCR2.all=0x0000;  // Reset FS generator, sample rate generator & transmitter
    McbspaRegs.SPCR1.all=0x1000;  // 时钟停止模式

    //  McbspaRegs.SPCR1.bit.DLB = 1;       // Enable DLB mode. Comment out for non-DLB mode.

   McbspaRegs.MFFINT.all=0x0;   // Disable all interrupts

    McbspaRegs.RCR2.all=0x0001;   // Single-phase frame, 1 word/frame, No companding (Receive)
    McbspaRegs.RCR1.all=0x0;
    McbspaRegs.XCR2.all=0x0001;   // Single-phase frame, 1 word/frame, No companding (Transmit)
    McbspaRegs.XCR1.all=0x0;

    McbspaRegs.SRGR2.bit.CLKSM = 1;  // CLKSM=1 (If SCLKME=0, i/p clock to SRG is LSPCLK)
    McbspaRegs.SRGR2.bit.FPER = 15;  // FPER = 16 CLKG periods

    McbspaRegs.SRGR1.bit.FWID = 0;      // Frame Width = 1 CLKG period
    McbspaRegs.SRGR1.bit.CLKGDV = 15; // CLKG frequency = LSPCLK/(CLKGDV+1)

    McbspaRegs.PCR.bit.FSXM = 1;  // FSX generated internally, FSR derived from an external source
    McbspaRegs.PCR.bit.FSRM = 1;
    McbspaRegs.PCR.bit.CLKXM = 1;  // CLKX generated internally, CLKR derived from an external source
    McbspaRegs.PCR.bit.CLKRM = 1;
    McbspaRegs.PCR.bit.FSXP = 1;
    McbspaRegs.PCR.bit.CLKXP = 0;
    McbspaRegs.PCR.bit.CLKRP = 1;

    //*************** Initialize McBSP Data Length
      InitMcbspa16bit();

    //************* Enable Sample rate generator
    McbspaRegs.SPCR2.bit.GRST=1; // Enable the sample rate generator
    delay_loop();                // Wait at least 2 SRG clock cycles
    McbspaRegs.SPCR2.bit.XRST=1; // Release TX from Reset
    McbspaRegs.SPCR1.bit.RRST=1; // Release RX from Reset
    McbspaRegs.SPCR2.bit.FRST=1; // Frame Sync Generator reset
}

用示波器观察8556的BUSY/INT管脚,输出波形正确,说明8556一直在转化数据。而CLKXA为低,FSXA为高,应该是McBSP没有在传输数据吧。

请问应该如何操作,才能收到AD的数据?

BIN YAO1:

回复 Jones Chen:

我现在把McBSP配置为SPI主机模式,以DMA的方式接收AD,但是遇到一个问题。

AD每次转换完成后发送一个下降沿信号,C28346在每个下降沿启动DMA发送,一次发送6个数据,而每发送完成一个数据后都要接收AD。现在的情况是:每次接收的6个数据是一样的,即DMA不是在每次发送的间隔接收,而是发送完成6个数据后接收6次。

能够通过DMA的配置,实现我需要的功能吗?

赞(0)
未经允许不得转载:TI中文支持网 » McBSP读取ADS8556
分享到: 更多 (0)