这是我做的利用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 " );
// }
}