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

7 个回复

  • 状元 208457 points
    请问用的是哪款C6000芯片?McBSP是做master还是slave? 数据接收是一直正常的吗?不正常的情况下,发送时的时序是否正确?数据具体是怎么不对?是完全不对还是只是移位了?
  • 回复 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 channel
    MCBSP_config(hMcbsp0, &mcbspCfg0);
    }

  • 状元 208457 points

    回复 user5846346:

    先做个内部自环(loopback)看是否能准确收发。
  • 回复 Shine:

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

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

    回复 user5846346:

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