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.

tms320c6748 spi中断+edma3的数据传输问题?

我是参照c6748中spi_edma的例程来改动我现在的代码,前期已经采用了spi的中断来发送过数据,后来我加入edma3想加快传输的速度,但是采用edma3的方式发送数据是真确的但是接收回来的数据有问题,请问该怎么解决呢?

  • 我想这需要具体问题具体分析,比如接收的数据是如何的不对,对端接的是什么设备?是不是它的传输不能及时提供有效数据等。

  • 您好

    那个我现在的现象和这个帖子里面的出现的问题差不多

    http://www.deyisupport.com/question_answer/dsp_arm/c6000_dsp/f/32/p/30494/348954.aspx#348954

    就是会在接收数据的时候SPIBUF的RXOVR置1了

  • Tony Tang

    后来我把代码重新写了一下就是没有spi的中断了,按照官方的spi_edma的例程来写了,以下是我出现问题的地方

    uint8 IINCHIP_SpiSendData(uint8 dat) {
     //   return(SPI_FLASH_SendByte(dat));
     unsigned char *p;
     W5500_tx_len = 1;
     W5500_rx_len = 1;
     //SPIDat1Config(SOC_SPI_0_REGS, SPI_DATA_FORMAT0, 0);

     /***发送与接收的地址***/
     W5500_p_tx = &dat;
     W5500_p_rx = p;
     //CacheWB((unsigned int) W5500_p_tx, 1);
     SpiTxEdmaParamSet(EDMA3_CHA_SPI0_TX, EDMA3_CHA_SPI0_TX, &dat,
       W5500_tx_len);
     cb_Fxn[EDMA3_CHA_SPI0_TX] = &callback_spi;
      SpiRxEdmaParamSet(EDMA3_CHA_SPI0_RX, EDMA3_CHA_SPI0_RX, p,
        W5500_rx_len, FALSE);
      cb_Fxn[EDMA3_CHA_SPI0_RX] = &callback_spi;

        //HWREG(SOC_SPI_0_REGS + SPI_SPIINT0) |= 0x00010000;
     SPIDat1Config(SOC_SPI_0_REGS, (SPI_CSHOLD | SPI_DATA_FORMAT0), 8);
        SPIIntEnable(SOC_SPI_0_REGS, SPI_DMA_REQUEST_ENA_INT);


      while ((0 == flagTx) || (0 == flagRx)) ;
      flagTx = 0;
      flagRx = 0;

     SPIDat1Config(SOC_SPI_0_REGS, SPI_DATA_FORMAT0, 8);

     //W5500_SpiTransfer();
     return (*p);
    }

    就是我现在必须在while ((0 == flagTx) || (0 == flagRx)) ;之前的 SpiRxEdmaParamSet和SpiTxEdmaParamSet设置一下断点才能通过,不设置断点的话就通不过去,是不是通过edma传输发送后不能及时收到以太网口芯片(w5500)发送过来的数据呢?

    如果是这种情况的话该怎么解决呢?

  • Tony Tang

    后来我把代码重新写了一下就是没有spi的中断了,按照官方的spi_edma的例程来写了,以下是我出现问题的地方

    uint8 IINCHIP_SpiSendData(uint8 dat) {
     //   return(SPI_FLASH_SendByte(dat));
     unsigned char *p;
     W5500_tx_len = 1;
     W5500_rx_len = 1;
     //SPIDat1Config(SOC_SPI_0_REGS, SPI_DATA_FORMAT0, 0);

     /***发送与接收的地址***/
     W5500_p_tx = &dat;
     W5500_p_rx = p;
     //CacheWB((unsigned int) W5500_p_tx, 1);
     SpiTxEdmaParamSet(EDMA3_CHA_SPI0_TX, EDMA3_CHA_SPI0_TX, &dat,
       W5500_tx_len);
     cb_Fxn[EDMA3_CHA_SPI0_TX] = &callback_spi;
      SpiRxEdmaParamSet(EDMA3_CHA_SPI0_RX, EDMA3_CHA_SPI0_RX, p,
        W5500_rx_len, FALSE);
      cb_Fxn[EDMA3_CHA_SPI0_RX] = &callback_spi;

        //HWREG(SOC_SPI_0_REGS + SPI_SPIINT0) |= 0x00010000;
     SPIDat1Config(SOC_SPI_0_REGS, (SPI_CSHOLD | SPI_DATA_FORMAT0), 8);
        SPIIntEnable(SOC_SPI_0_REGS, SPI_DMA_REQUEST_ENA_INT);


      while ((0 == flagTx) || (0 == flagRx)) ;
      flagTx = 0;
      flagRx = 0;

     SPIDat1Config(SOC_SPI_0_REGS, SPI_DATA_FORMAT0, 8);

     //W5500_SpiTransfer();
     return (*p);
    }

    就是我现在必须在while ((0 == flagTx) || (0 == flagRx)) ;之前的 SpiRxEdmaParamSet和SpiTxEdmaParamSet设置一下断点才能通过,不设置断点的话就通不过去,是不是通过edma传输发送后不能及时收到以太网口芯片(w5500)发送过来的数据呢?

    如果是这种情况请问该如何解决呢?