我是参照c6748中spi_edma的例程来改动我现在的代码,前期已经采用了spi的中断来发送过数据,后来我加入edma3想加快传输的速度,但是采用edma3的方式发送数据是真确的但是接收回来的数据有问题,请问该怎么解决呢?
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.
我是参照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)发送过来的数据呢?
如果是这种情况请问该如何解决呢?