CC3200 SPI DMA pingpong 不能切换 ping | pong
时间:10-02
整理:3721RD
点击:
初始化 部分代码
MAP_SPIReset(GSPI_BASE);
UDMAInit();
UDMAChannelSelect(UDMA_CH30_GSPI_RX, NULL);
MAP_SPIConfigSetExpClk(GSPI_BASE,MAP_PRCMPeripheralClockGet(PRCM_GSPI),
SPI_IF_BIT_RATE,mode,SPI_SUB_MODE_0,
(SPI_HW_CTRL_CS|
SPI_4PIN_MODE |
SPI_TURBO_OFF |
SPI_CS_ACTIVELOW |
SPI_WL_16));
MAP_SPIIntRegister(GSPI_BASE,interrupt_handler);
MAP_SPIWordCountSet(GSPI_BASE, 3*LINE_SIZE/2);
MAP_SPIFIFOLevelSet(GSPI_BASE, 1, 1);
MAP_SPIFIFOEnable(GSPI_BASE, SPI_RX_FIFO);
UDMASetupTransfer(UDMA_CH30_GSPI_RX,
UDMA_MODE_PINGPONG,
(3*LINE_SIZE*8)/DMA_WIDTH,
UDMA_SIZE_16,
UDMA_ARB_1,
(void *)(GSPI_BASE + MCSPI_O_RX0),
UDMA_CHCTL_SRCINC_NONE,
(void *)a,
UDMA_CHCTL_DSTINC_16);
UDMASetupTransfer(UDMA_CH30_GSPI_RX|UDMA_ALT_SELECT,
UDMA_MODE_PINGPONG,
(3*LINE_SIZE*8)/DMA_WIDTH,
UDMA_SIZE_16,
UDMA_ARB_1,
(void *)(GSPI_BASE + MCSPI_O_RX0),
UDMA_CHCTL_SRCINC_NONE,
(void *)b,
UDMA_CHCTL_DSTINC_16);
功能启动和handle挂载
MAP_SPIDmaEnable(GSPI_BASE,SPI_RX_DMA);
MAP_SPIIntEnable(GSPI_BASE, SPI_INT_RX_FULL);
MAP_SPIEnable(GSPI_BASE);
handle 回调
pControlTable = MAP_uDMAControlBaseGet();
UART_PRINT("InFo %08x %08x %08x\n\r",uDMAErrorStatusGet(),MAP_uDMAIntStatus(), SPIIntStatus(GSPI_BASE,true));
SPIIntClear(GSPI_BASE, SPI_INT_RX_FULL);
pControlTable = MAP_uDMAControlBaseGet();
UART_PRINT("uDMAControlBaseGet() = %08x\n\r", MAP_uDMAControlBaseGet());
UART_PRINT("uDMATable = %08x %08x\n\r", pControlTable[ulPrimaryIndexTx].ulControl,\
pControlTable[ulAltIndexTx].ulControl);
回调中, 我无法正确读取到 MAP_uDMAIntStatus() 参考datasheet
红色部分 我换了 所以的选项好像都不对。
InFo 00000000 40003000 00000008
uDMAControlBaseGet() = 2002ec00
uDMATable = 00000000 00000000
请问,我做pingpong的时候 怎么样才能正确的接收的切换的指令, 谢谢!
关于SPI+DMA的,你可以参考一下https://github.com/yhpan0613/SimpleLink-CC3200/tree/mainstream_br/example/spi_udma_demo。
