打印
[DSP]

DSP C6748 与 Cortex-A5 SPI 通信

[复制链接]
4096|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Cortex-A5 作为主机 DSP作为从机 , 现在的情况就两个 1是DSP收到的数 只有前几个是正确的 从第五个数第六个数往后就乱了 不知道是什么问题 2是 收发数太多程序就会卡死 卡在接收判断的时候while( (HWREG(SOC_SPI_1_REGS + SPI_SPIBUF) & 0x80000000 ) ); 但是数少的时候就可以 。 感谢各位大佬

使用特权

评论回复

相关帖子

沙发
泽1997126|  楼主 | 2022-3-22 21:08 | 只看该作者
/****************************************************************************/
/*                                                                          */
/*              主函数                                                      */
/*                                                                          */
/****************************************************************************/
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", 6,rx_data[6]);
                     UARTprintf("SPI_A9[%d] = %d\r\n", 6,rx_data[1]);
                     UARTprintf("SPI_A9[%d] = %d\r\n", 6,rx_data[2]);
            }


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

}

/****************************************************************************/
/*                                                                          */
/*                SPI 初始化                                                                     */
/*                                                                          */
/****************************************************************************/
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]
}

/****************************************************************************/
/*                                                                          */
/*              SPI 传输                                                    */
/*                                                                          */
/****************************************************************************/
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;
                 }



                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();
    }
}
/****************************************************************************/
/*                                                                          */
/*                 SPI 传输2                                                                   */
/*                                                                          */
/****************************************************************************/
void SPI1_Communicate(uint8_t * sp2TxBuffer, uint8_t * sp2RxBuffer, int NumByteToRead)
{

        NumByteToRead++;

        SPIDat1Config(SOC_SPI_1_REGS, SPI_DATA_FORMAT0, 0x1);
        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++;
//              }
            }

}

使用特权

评论回复
板凳
泽1997126|  楼主 | 2022-3-23 11:11 | 只看该作者
现在感觉是接收缓冲区的问题 或者两个板子时钟的问题 发送数太多就会导致程序卡死 几千个数没事 但是一万个数程序就卡死了
从技术手册看 缓冲区RXBUF TXBUF好像并为划分 有大佬知道这个缓冲区是多大吗

使用特权

评论回复
地板
泽1997126|  楼主 | 2022-3-25 09:40 | 只看该作者
顶一下 目前发现 两个DSP开发板互相通信没问题 不会出现数多卡死和乱位情况 但是和A5就是不行 想问问大家差别在哪呢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

29

帖子

0

粉丝