嵌入式开发者社区

标题: C6748 SPI1与 Cortex-A5 通信问题 [打印本页]

作者: 泽1997126    时间: 2022-3-22 20:18
标题: C6748 SPI1与 Cortex-A5 通信问题
Cortex-A5 作为主机 DSP作为从机 , 现在的情况就两个 1是DSP收到的数 只有前几个是正确的 从第五个数第六个数往后就乱了 不知道是什么问题 2是 收发数太多程序就会卡死 卡在接收判断的时候while( (HWREG(SOC_SPI_1_REGS + SPI_SPIBUF) & 0x80000000 ) ); 但是数少的时候就可以 。 感谢各位大佬
作者: 泽1997126    时间: 2022-3-22 20:22
/****************************************************************************/
/*                                                                          */
/*              主函数                                                      */
/*                                                                          */
/****************************************************************************/
int main(void)
{
        // 外设使能配置
        PSCInit();


    // 管脚复用配置
    GPIOBankPinMuxSet();

    // GPIO 管脚初始化
    GPIOBankPinInit();

    //参数初始化
    paramater_init();


    // 初始化串口终端 使用串口2
    UARTStdioInit();
    UARTPuts("SPI1_A9 Test by Zzc......\r\n", -1);

    // 定时器 / 计数器初始化
    TimerInit();
    // DSP 中断初始化
    InterruptInit();

    // 定时器 / 计数器中断初始化
    TimerInterruptInit();
    // SPI 中断初始化
    //SPIInterruptInit();


    // SPI 初始化
    SPIInit();




    while(1)
    {

            //Delay(1000);
            if(testj==1000)
            {
                     
                     //与A9SPI传输

                    ToA9_SPI_Transfer();

                     GPIOPinWrite(SOC_GPIO_0_REGS, 6, Flag);   // D6  亮 GPIO0[5]
                     Flag=!Flag;
                     GPIOPinWrite(SOC_GPIO_0_REGS, 6, Flag);


            }


            //UARTprintf("SPI_A9[%d] = %d\r\n", 10,rx_data[10]);//GPIOPinWrite(SOC_GPIO_0_REGS, 6, GPIO_PIN_LOW);
    }

}

void ToA9_SPI_Transfer(void)
{
        //p_tx = &tx_data[0];
        //p_tx = (uint8_t*)tx_data;
        //p_rx = (uint8_t*)rx_data;
        //p_rx = &rx_data[0];
        testi++;
    testj=0;

  if(testi == A9_DSP.averge)
    {
         TimerDisable(SOC_TMR_2_REGS, TMR_TIMER12);
         TimerIntDisable(SOC_TMR_2_REGS, TMR_INT_TMR12_NON_CAPT_MODE);
    if(ModeFlag() == 0)
    {
      for(k=0;k<10;k++)
      {
              tx_data[k]=k;//校验
      }

      for(k=10;k<4013;k++)
          {
              tx_data[k]=3;
              //tx_data[k]=data_buff[k];
          }
      for(k = 4013; k < 4023; k++)
                 {
              tx_data[k]=0;
                 }
       
                Delay(1000);

                SPI1_Communicate((uint8_t*)tx_data, rx_data, 4023);
               
     
    GPIOPinWrite(SOC_GPIO_0_REGS, 9, GPIO_PIN_LOW); //GPIO0[8]向A9发送低电平
    GPIOPinWrite(SOC_GPIO_0_REGS, 3, GPIO_PIN_LOW);
   
   
            }
   // memset(tx_data, 0, size1 * sizeof(uint32_t)); //清空tx_data
   // memset(Data_TX_Buff, 0, SIZE3 * sizeof(uint32_t));
   // memset(rx_data, 0, size2 * sizeof(uint8_t)); //清空rx_data
            testi=0;
   // 定时器 / 计数器初始化
     TimerInit();
     TimerInterruptInit();
    }
}
void SPI1_Communicate(uint8_t * sp2TxBuffer, uint8_t * sp2RxBuffer, int NumByteToRead)
{
       
        NumByteToRead++;
        while (--NumByteToRead)
        {
           while( HWREG(SOC_SPI_1_REGS + SPI_SPIBUF) & (0x20000000));

                    SPITransmitData1(SOC_SPI_1_REGS, *sp2TxBuffer);
                    sp2TxBuffer++;

                            //UARTprintf("%d\r\n",1);
                   
              if(NumByteToRead == 4023)
            {

            GPIOPinWrite(SOC_GPIO_0_REGS, 9, GPIO_PIN_HIGH); //GPIO0[8]向A9发送高电平
            GPIOPinWrite(SOC_GPIO_0_REGS, 3, GPIO_PIN_HIGH);
            //UARTprintf("%d\r\n",2);
            }
              else
              {
           //UARTprintf("%d\r\n",3);

                  while( (HWREG(SOC_SPI_1_REGS + SPI_SPIBUF) & 0x80000000 ) );
                    //UARTprintf("%d\r\n",5);
              *sp2RxBuffer = SPIDataReceive(SOC_SPI_1_REGS);
               sp2RxBuffer++;

                                                        // UARTprintf("%d\r\n",4);

            }
            if(NumByteToRead == 1)
    {
           while( (HWREG(SOC_SPI_1_REGS + SPI_SPIBUF) & 0x80000000 ) );


            *sp2RxBuffer = SPIDataReceive(SOC_SPI_1_REGS);
            sp2RxBuffer++;

    }
            }

}
void SPIInit(void)
{
        unsigned char cs  = 0x01;
        unsigned char dcs = 0x01;
        unsigned int  val = SIMO_SOMI_CLK_CS;

        SPIReset(SOC_SPI_1_REGS);//复位

        SPIOutOfReset(SOC_SPI_1_REGS);//取消复位

        SPIModeConfigure(SOC_SPI_1_REGS, SPI_SLAVE_MODE);// 主/从模式选择

        SPIClkConfigure(SOC_SPI_1_REGS, 228000000, 10000000, SPI_DATA_FORMAT0); //配置时钟

        SPIPinControl(SOC_SPI_1_REGS, 0, 0, &val);// 使能 SIMO SOMI CLK 引脚

        SPIDefaultCSSet(SOC_SPI_1_REGS, dcs);//设置CS3空闲时为高电平

        // 配置 SPI 数据格式
        SPIDataFormatConfig(SPI_DATA_FORMAT0);

        // 配置 SPI 数据格式及片选信号
        SPIDat1Config(SOC_SPI_1_REGS, (SPI_CSHOLD | SPI_DATA_FORMAT0), cs);

    // 映射中断到 INT1
    //SPIIntLevelSet(SOC_SPI_1_REGS, SPI_RECV_INTLVL | SPI_TRANSMIT_INTLVL);

    // 使能 SPI
        SPIEnable(SOC_SPI_1_REGS);

    // 配置管脚为输出状态
    //GPIODirModeSet(SOC_GPIO_0_REGS, 111, GPIO_DIR_OUTPUT);  // GPIO6[14]
}
作者: 泽1997126    时间: 2022-3-23 11:12
有大佬知道 缓冲区TXBUF 和RXBUF是多大吗 没有找到相关的说明
作者: 创龙科技support    时间: 2022-3-24 16:52
您好,这边按照官方的回复,可在TMS320C6748 Fixed- and Floating-Point DSP datasheet (Rev. G).pdf查看到为16bit的buffer,不支持修改[attach]6986[/attach]




欢迎光临 嵌入式开发者社区 (https://51dsp.net/) Powered by Discuz! X3.4