我是参照c6748中spi_edma的例程来改动我现在的代码,前期已经采用了spi的中断来发送过数据,后来我加入edma3想加快传输的速度,但是采用edma3的方式发送数据是真确的但是接收回来的数据有问题,请问该怎么解决呢?
Tony Tang:
我想这需要具体问题具体分析,比如接收的数据是如何的不对,对端接的是什么设备?是不是它的传输不能及时提供有效数据等。
user3726176:
回复 Tony Tang:
您好
那个我现在的现象和这个帖子里面的出现的问题差不多
http://www.deyisupport.com/question_answer/dsp_arm/c6000_dsp/f/32/p/30494/348954.aspx#348954
就是会在接收数据的时候SPIBUF的RXOVR置1了
user3726176:
回复 Tony Tang:
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)发送过来的数据呢?
如果是这种情况的话该怎么解决呢?
user3726176:
回复 Tony Tang:
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)发送过来的数据呢?
如果是这种情况请问该如何解决呢?