TI中文支持网
TI专业的中文技术问题咨询交流网站

C6000 MCBSP作为SPI模式使用时的收发函数

你好!C6000 MCBSP作为SPI模式使用时的收发函数像(查询寄存器的XRDY和RRDY位)下面这样写时,发送的数据就不对。

uint8 IINCHIP_SpiSendData(uint8 byte)

{

       uint8 SPIRXD;

       while(MCBSP_xrdy(hMcbsp0) == 0);  //Wait until XRDY=1, then data is tramsmitted
       MCBSP_write(hMcbsp0,byte);
 
       while(MCBSP_rrdy(hMcbsp0) == 0);  //Wait until data is received
       SPIRXD = MCBSP_read(hMcbsp0);
       return SPIRXD;
 
}

而把接收的那部分代码去掉后,发送的功能就是正常的。如下:

void IINCHIP_SpiSendData(uint8 byte)

{

       while(MCBSP_xrdy(hMcbsp0) == 0);  //Wait until XRDY=1, then data is tramsmitted
       MCBSP_write(hMcbsp0,byte);
 
}

麻烦帮我看一下这是为什么?是接收部分写的不对吗?还是哪里没配置好?谢谢1

Shine:

请问用的是哪款C6000芯片?McBSP是做master还是slave? 数据接收是一直正常的吗?不正常的情况下,发送时的时序是否正确?数据具体是怎么不对?是完全不对还是只是移位了?

user5846346:

回复 Shine:

谢谢回复!

我用的是C6701,虽说比较老,但不得不用,我看了手册,MCBSP的用法和其它C6000系列的DSP是一个手册。这里DSP是Master,要控制的从设备是W5500。

void IINCHIP_SpiSendData(uint8 byte)

{

      while(MCBSP_xrdy(hMcbsp0) == 0);  //Wait until XRDY=1, then data is tramsmitted

      MCBSP_write(hMcbsp0,byte);

}

用上面的函数只发送数据的话,发送的数据和对应的时序是下面这样的,这个结果是正确的(一帧数据包括3个字节)

而在函数中加上接收部分的内容后,时序变成了下面这样,首字节发送了两次,而且多了一帧数据

下面是我的初始化程序,是用官方的一个例程改的,你看看这块有没有什么问题

void MCBSP_INIT(void){ /* Declaration of local variables */ Uint32 wait = 0;

/* initialize the CSL library */ CSL_init();

MCBSP_reset(hMcbsp0);

/* initialize the the McBSP1 */ init_mcbsp0();

/* Enable sample rate ge nerator – GRST=1 */ MCBSP_enableSrgr(hMcbsp0);

for (wait=0; wait<0x100; wait++); /* Wait states after SRG starts */ /*等待两个bit的时钟完成重新初始化*/ MCBSP_enableRcv(hMcbsp0); /* Enable McBSP port 0 as the receiver */ MCBSP_enableXmt(hMcbsp0); /* Enable McBSP port 0 as the transmitter */

MCBSP_enableFsync(hMcbsp0);

for (wait=0; wait<0x100; wait++); /* Wait states after SRG starts */ /*等待两个bit的时钟完成重新初始化*/} /* end main */

/*——————————————————————————–*//* init_mcbsp0() *//*——————————————————————————–*//* MCBSP Config structure *//* Setup the MCBSP_0 as a master */void init_mcbsp0(void){ // 1. Setup the McBSP configuration structure //* SPI mode, CLKSTP = 11b and CLKXP = 0: Clock starts with rising edge with delay. */MCBSP_Config mcbspCfg0 = {

MCBSP_SPCR_RMK( MCBSP_SPCR_FRST_DEFAULT, MCBSP_SPCR_GRST_DEFAULT, MCBSP_SPCR_XINTM_DEFAULT, MCBSP_SPCR_XSYNCERR_DEFAULT, MCBSP_SPCR_XRST_DEFAULT, MCBSP_SPCR_DLB_DEFAULT, MCBSP_SPCR_RJUST_DEFAULT, MCBSP_SPCR_CLKSTP_DELAY, /* CLKSTP=11b with CLKXP=0, clock starts with */ MCBSP_SPCR_RINTM_RRDY, /* rising edge with delay */ MCBSP_SPCR_RSYNCERR_DEFAULT, MCBSP_SPCR_RRST_DEFAULT ), MCBSP_RCR_RMK( MCBSP_RCR_RPHASE_SINGLE, MCBSP_RCR_RFRLEN2_DEFAULT, MCBSP_RCR_RWDLEN2_DEFAULT, MCBSP_RCR_RCOMPAND_DEFAULT, MCBSP_RCR_RFIG_YES, MCBSP_RCR_RDATDLY_1BIT, 0x00000002, // MCBSP_RCR_RFRLEN1_DEFAULT, //每帧最多128个字节 MCBSP_RCR_RWDLEN1_8BIT /* receive element length phase 1 is 32 bits */ ), MCBSP_XCR_RMK( MCBSP_XCR_XPHASE_DEFAULT, MCBSP_XCR_XFRLEN2_DEFAULT, MCBSP_XCR_XWDLEN2_DEFAULT, MCBSP_XCR_XCOMPAND_DEFAULT, MCBSP_XCR_XFIG_YES, /* MCBSP_XCR_XFIG_DEFAULT,忽略*/ MCBSP_XCR_XDATDLY_1BIT, /* 1 bit data delay */ 0x00000002, //MCBSP_XCR_XFRLEN1_DEFAULT, //每帧最多128个字节 MCBSP_XCR_XWDLEN1_8BIT /* transmit element phase 1 is 32 bits */ ), MCBSP_SRGR_RMK( MCBSP_SRGR_GSYNC_FREE, MCBSP_SRGR_CLKSP_RISING, MCBSP_SRGR_CLKSM_INTERNAL, /* SRGR clock mode from internal source */ MCBSP_SRGR_FSGM_DEFAULT, MCBSP_SRGR_FPER_DEFAULT, MCBSP_SRGR_FWID_DEFAULT, MCBSP_SRGR_CLKGDV_OF(0x5F) /* divide clock by factor of 95 */ ),

MCBSP_MCR_DEFAULT, MCBSP_RCER_DEFAULT, MCBSP_XCER_DEFAULT,

MCBSP_PCR_RMK( MCBSP_PCR_XIOEN_SP, MCBSP_PCR_RIOEN_SP, MCBSP_PCR_FSXM_INTERNAL, /* frame sync generation */ MCBSP_PCR_FSRM_EXTERNAL, /* FSR配置为GPIO 输出– 控制W5500的复位引脚*/ MCBSP_PCR_CLKXM_OUTPUT, /* tans. clock mode from internal SRGR */ MCBSP_PCR_CLKRM_INPUT, MCBSP_PCR_CLKSSTAT_0, MCBSP_PCR_DXSTAT_0, MCBSP_PCR_FSXP_ACTIVELOW, /* active low trans. frame sync. polarity */ MCBSP_PCR_FSRP_ACTIVEHIGH, MCBSP_PCR_CLKXP_RISING, /* trans. clk pol. from rising edge of CLKX */ MCBSP_PCR_CLKRP_FALLING )};

// 2. Open the McBSP channel, 硬件使用MCBSP0通道hMcbsp0 = MCBSP_open(MCBSP_DEV0, MCBSP_OPEN_RESET);// 3. Apply the configuration structure to the channelMCBSP_config(hMcbsp0, &mcbspCfg0);}

Shine:

回复 user5846346:

先做个内部自环(loopback)看是否能准确收发。

user5846346:

回复 Shine:

请问有没有内部自环的参考例程?
另外,你看我上面的那些配置、初始化、收发函数有没有问题呢?
谢谢!

Shine:

回复 user5846346:

csl库里有自环例程。
http://www.ti.com/tool/SPRC090

user5846346:

回复 Shine:

谢谢!做了自环测试,是正常的。那我之前到底是哪里的问题呢?

Shine:

回复 user5846346:

那您在自环测试程序上修改程序,看是否还有这个问题。

赞(0)
未经允许不得转载:TI中文支持网 » C6000 MCBSP作为SPI模式使用时的收发函数
分享到: 更多 (0)