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.

MCBSP收发数据程序

Other Parts Discussed in Thread: TMS320VC5416, CCSTUDIO

这是我做的利用MCBSP向AD发送控制命令,然后接受AD传送过来的数据的程序~~~    DSP是TMS320VC5416,AD是AD73360

调试时为什么大部分情况下收不到数据,但有时也会收到数据~~

那位老师帮忙看一下程序~~看看问题出在哪里~~解答一下~~谢谢~~~


/* 发送控制命令时:
输入输出时钟由外部源决定:SCLK
  输出帧同步由外部源决定:与外部源同步*/

/******************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <csl.h>
#include <csl_mcbsp.h>
#include <csl_irq.h>
#include "reg.h"
/*----------------------------------------------------------------------------*/
#define N 6
#define M 6
//#define ST1 0x2000

#define ST1 ((int*)ST1_BASE)
           


 static MCBSP_Config ConfigLoopBack16= {
   MCBSP_SPCR1_RMK(
     MCBSP_SPCR1_DLB_OFF,                    /* DLB    = 0 */
     MCBSP_SPCR1_RJUST_RZF,                 /* RJUST  = 0 */
     MCBSP_SPCR1_CLKSTP_DISABLE,            /* CLKSTP = 0 */
     MCBSP_SPCR1_DXENA_OFF,                  /* DXENA  = 0 */
     MCBSP_SPCR1_ABIS_DEFAULT,              /* ABIS   = 0 */
     MCBSP_SPCR1_RINTM_RRDY,                /* RINTM  = 0 中断信号由帧同步信号产生*/
     MCBSP_SPCR1_RRST_DISABLE               /* RRST   = 0 */
   ),
   MCBSP_SPCR2_RMK(
     MCBSP_SPCR2_FREE_NO,                   /* FREE   = 0 */
     MCBSP_SPCR2_SOFT_NO,                   /* SOFT   = 0 */
     MCBSP_SPCR2_FRST_RESET,                  /* FRST   = 0 */
     MCBSP_SPCR2_GRST_RESET,                 /* GRST   = 0 */
     MCBSP_SPCR2_XINTM_XRDY,                /* XINTM  = 0 */
     MCBSP_SPCR2_XRST_DISABLE               /* XRST   = 0 */
   ),
   MCBSP_RCR1_RMK(
    MCBSP_RCR1_RFRLEN1_OF(0),                                      /* RFRLEN1 = 0 */
    MCBSP_RCR1_RWDLEN1_16BIT                                       /* RWDLEN1 = 2 */
   ),
   MCBSP_RCR2_RMK(   
     MCBSP_RCR2_RPHASE_SINGLE,              /* RPHASE  = 0 */
     MCBSP_RCR2_RFRLEN2_OF(0),              /* RFRLEN2 = 0 */
     MCBSP_RCR2_RWDLEN2_8BIT,              /* RWDLEN2 = 2 */
     MCBSP_RCR2_RCOMPAND_MSB,               /* RCOMPAND = 0 */
     MCBSP_RCR2_RFIG_YES,                   /* RFIG    = 0  */
     MCBSP_RCR2_RDATDLY_1BIT                /* RDATDLY = 0 */
   ), 
   MCBSP_XCR1_RMK(
    MCBSP_XCR1_XFRLEN1_OF(0),              /* XFRLEN1 = 0 */
    MCBSP_XCR1_XWDLEN1_16BIT               /* XWDLEN1 = 2 */
   ),  
   MCBSP_XCR2_RMK(  
     MCBSP_XCR2_XPHASE_SINGLE,              /* XPHASE  = 0 */
     MCBSP_XCR2_XFRLEN2_OF(0),              /* XFRLEN2 = 0 */
     MCBSP_XCR2_XWDLEN2_8BIT,              /* XWDLEN2 = 2 */
     MCBSP_XCR2_XCOMPAND_MSB,               /* XCOMPAND = 0 */
     MCBSP_XCR2_XFIG_YES,                   /* XFIG    = 0 */
     MCBSP_XCR2_XDATDLY_1BIT                /* XDATDLY = 0 */
   ),           
   MCBSP_SRGR1_RMK(
     MCBSP_SRGR1_FWID_OF(0),                /* FWID    = 0 */
     MCBSP_SRGR1_CLKGDV_OF(0)               /* CLKGDV  = 0 CLKG的分频系数*/
   ),  
  MCBSP_SRGR2_RMK( 
     MCBSP_SRGR2_GSYNC_FREE,                /* FREE    = 0 */
     MCBSP_SRGR2_CLKSP_RISING,              /* CLKSP   = 0 */
     MCBSP_SRGR2_CLKSM_CLKS,            /* CLKSM   = 1 采样率生成器的时钟外部源决定 */
     MCBSP_SRGR2_FSGM_FSG,              /* FSGM    = 0 发送帧同步信号由采样率生成器决定*/
     MCBSP_SRGR2_FPER_OF(16)                /* FPER    = 16*/
  ), 

 
  MCBSP_MCR1_DEFAULT,

  MCBSP_MCR2_DEFAULT,
  MCBSP_PCR_RMK(
    MCBSP_PCR_XIOEN_SP,                   /* XIOEN    = 0  */
    MCBSP_PCR_RIOEN_SP,                   /* RIOEN    = 0  */
    MCBSP_PCR_FSXM_INTERNAL,              /* FSXM     = 1  帧同步信号由内部的采样率生成器时钟产生*/
    MCBSP_PCR_FSRM_EXTERNAL,              /* FSRM     = 0  */
    MCBSP_PCR_SCLKME_BCLK,                /* SCLKME   = 1  */    
    MCBSP_PCR_CLKXM_INPUT,               /* CLKXM    = 0  */
    MCBSP_PCR_CLKRM_INPUT,                /* CLKRM    = 0  */
    MCBSP_PCR_FSXP_ACTIVEHIGH,            /* FSXP     = 0  */
    MCBSP_PCR_FSRP_ACTIVEHIGH,            /* FSRP     = 0  */
    MCBSP_PCR_CLKXP_RISING,               /* CLKXP    = 0  */
    MCBSP_PCR_CLKRP_FALLING               /* CLKRP    = 0  */
  ),
  0x0001u,                                /* RCERA */
  0x0000u,                                /* RCERB */
  0x0000u,                                /* RCERC */
  0x0000u,                                /* RCERD */
  0x0000u,                                /* RCERE */
  0x0000u,                                /* RCERF */
  0x0000u,                                /* RCERG */
  0x0000u,                                /* RCERH */
  0x0001u,                                /* XCERA */
  0x0000u,                                /* XCERB */
  0x0000u,                                /* XCERC */
  0x0000u,                                /* XCERD */
  0x0000u,                                /* XCERE */
  0x0000u,                                /* XCERF */
  0x0000u,                                /* XCERG */
  0x0000u                                 /* XCERH */
};    
 
/* Create data buffers for transfer */

Uint16 xmt[N],rcv[N],xc[M];
int delay,k=0;
Uint16 i;

void WatchDog(void);
/*----------------------------------------------------------------------------*/
void main() {
  MCBSP_Handle mhMcbsp;

 //* IFR=0x0031;
 
  //* BXSR=0
  /* Initialize CSL library, this step is required */
  CSL_init();

    xmt[0]=0x8104;//控制AD的SCLK和采样率:SCLK为4M,采样率为8M
 xmt[1]=0x83FA;//AD的通道1、2上电并设置增益
 xmt[2]=0x82E0;//参考电平上电
 xmt[3]=0x8002;//进入混合模式
 xmt[4]=0x7fff;//AD发送数据的标志
 xmt[5]=0x7fff;//需要发送的数据
  for(i=0;i<N;i++) {
  rcv[i]=0;
 }//接收发送各个命令的返回值
 
  mhMcbsp = MCBSP_open(MCBSP_PORT0, MCBSP_OPEN_RESET);//打开MCBSP0串口
  MCBSP_config(mhMcbsp, &ConfigLoopBack16);//配置寄存器

  MCBSP_start(mhMcbsp,
    MCBSP_RCV_START | MCBSP_XMIT_START,
    0x0000
  );//使能发送接收端
 
   while(!MCBSP_xrdy(mhMcbsp));
   MCBSP_write16(mhMcbsp,xmt[0]);
 
  MCBSP_start(mhMcbsp,
    MCBSP_SRGR_START | MCBSP_SRGR_FRAMESYNC,
    0xffff
  );//使能采样率生成器和帧同步信号
    while (!MCBSP_rrdy(mhMcbsp));
     rcv[0] = MCBSP_read16(mhMcbsp);

 
   for (i=0;i<=N-1;i++) {


    while(!MCBSP_xrdy(mhMcbsp));
    MCBSP_write16(mhMcbsp,xmt[i]);


     while (!MCBSP_rrdy(mhMcbsp));

     rcv[i] = MCBSP_read16(mhMcbsp);
                  
    }
   

  while(k<=255){

  WatchDog();

  for(i=0;i<M;i++)
  {
   while (!MCBSP_rrdy(mhMcbsp));
   xc[i] = MCBSP_read16(mhMcbsp);
  }
  if(k==255)
    k=0;
  else
    k++;
// printf("%d")
 }

}

void WatchDog(void) {
   // if(((* ST1) & 0x2000))
 // {
  
    asm( " SSBX XF " );
   
    delay=1000;
    while(delay--);
    asm( " RSBX XF " );
 //  }
 
}