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.

C64X 配成一个SPI1主机,一个从机SP0,自发自收。



BCBSP1配置成SP1主机;

MCBSP0配置成SP0从机; 

           CLKX1—CLKX0

          FSX1---FSX0

          DX1—DR0

         DR1—DX0 

           SP1的接收口DR1连接示波器测试输入数据,  发现DSP首次复位运行,SP0输出数据正确。但之后SP0发送数据不正确(仍然发送上次调试数据),第二发送数据才是正确(发送本次调试的数据)? SP1之后也会发生RFULL错误!?

            [  备注:SP0的接收口DX1连接示波器测试输入数据, 调试都是正确的  ]

while(1)
{
     //SPI0从机发程序准备
     if( ( MCBSP0_SPCR & MCBSP_SPCR_XRDY ) != 0)
    {
        MCBSP0_DXR_8BIT = B0txBEYT;
    }
    //SPI1主机发程序
    if( ( MCBSP1_SPCR & MCBSP_SPCR_XRDY ) != 0)
    {
       MCBSP1_DXR_8BIT = B1txBEYT;
    }

_waitusec( 20000 ); //等待发送数据

   //SPI0从机收程序收
   if( ( MCBSP0_SPCR & MCBSP_SPCR_RRDY ) != 0)
   {
       B0rxBEYT = MCBSP0_DRR_8BIT;
   }

   //SPI1主机收程序收
   if( ( MCBSP1_SPCR & MCBSP_SPCR_RRDY ) != 0)//读后该地址自动清除RRDY
   {
      B1rxBEYT = MCBSP1_DRR_8BIT;
  }    

     _waitusec( 20 ); 

}

============================================

今天早上有测试一遍:结果是:

         第一次调试:首次复位工作,第一次彼此收发数据正确;

        第二次调试:第二次收发数据,从机SP0执行MCBSP0_DXR_8BIT = B0txBEYT; 后,并没有将DXR中的数据拷贝到XSR中,因为XEMPTY一直为0;直到主机SP1产生时钟发送完数据后从机SP0才执行DXR中的数据拷贝到XSR中;所以就出错了,第二调试后都不能将数据发送出来??

       



  • 请问用的是哪款DSP器件?是两块DSP之间的mcbsp0和mcbsp1通信吗?

  • C6424,是的。

          我是把mcbsp0配置成SPI0从机,  mcbsp1配置成SPI1主机;mcbsp0和mcbsp1都是一个DSP上的资源。

  • C6424 DSP(用的是TI 官方demo板:EVM6424);这个板子上有mcbsp0和mcbsp1资源。

              我是把mcbsp0配置成从机为SPI0, mcbsp1配置成主机为SPI1。

    -----------------------------------------------------------------------------------------------------

           今天调试,我只配置SPI1主机(且不连接从机SPI0)。

            防止RFULL错误:主机SPI1连续发送数据,每次发生一次数据,都判断是否有收到数据(RRDY),有就读出出来,在发下一个数据。但是发送第3个数据,任然产生RFULL错误?不晓得什么原因?

    代码如下:

    while(MCBSP1_SPCR&MCBSP_SPCR_XEMPTY);
    MCBSP1_DXR_8BIT = *ptrm;
    _waitusec( 20 ); //等待发送数据/仿真才有电平数据输出

    if( MCBSP1_SPCR & MCBSP_SPCR_RRDY )
    { rm = MCBSP1_DRR_8BIT; }

    while(MCBSP1_SPCR&MCBSP_SPCR_XEMPTY);
    MCBSP1_DXR_8BIT = *ptrm;
    _waitusec( 20 );

    if( MCBSP1_SPCR & MCBSP_SPCR_RRDY )
    { rm = MCBSP1_DRR_8BIT; }

    while(MCBSP1_SPCR&MCBSP_SPCR_XEMPTY);
    MCBSP1_DXR_8BIT = *ptrm;
    _waitusec( 20 ); //数据发送完成后,发现RFULL错误!!!!!

    if( MCBSP1_SPCR & MCBSP_SPCR_RRDY )
    { rm = MCBSP1_DRR_8BIT; }
    while(MCBSP1_SPCR&MCBSP_SPCR_XEMPTY);
    MCBSP1_DXR_8BIT = *ptrm;
    _waitusec( 20 );

    if( MCBSP1_SPCR & MCBSP_SPCR_RRDY )
    { rm = MCBSP1_DRR_8BIT; }





  • 问题已经解决,延迟时间,或判断标志等待。