你好:
我现在在做一个wifi转spi的程序。sdk版本是1.0。
程序流程:启动一个socket线程建立tcp server,使能spi作为从模式,与另外一个模块通讯(spi主模式)。我的程序流程是,在tcpserver端接收到数据后,将数据转存到一个ram空间(tx_buf),使能spi-dma传送,然后拉低一个gpio管脚(主spi模块检测到gpio管脚拉低后开始通过spi读取数据),当cc3200从spi的dma传送接收后,拉高gpio管脚(主spi模块检测到gpio管脚拉高后停止spi读取数据),cc3200 spi从模式端持续检测是否有主spi端传来的数据,如果有数据传来,则转存到ram空间(rx_buf),通过tcp server发送到wifi网络。
代码如下:
1、spi初始化:
// Reset SPI
//
MAP_SPIReset(GSPI_BASE);
MAP_SPIConfigSetExpClk(GSPI_BASE,MAP_PRCMPeripheralClockGet(PRCM_GSPI),//
SPI_IF_BIT_RATE,SPI_MODE_SLAVE,spi_mode,
(SPI_HW_CTRL_CS |
SPI_4PIN_MODE |
SPI_TURBO_OFF |
SPI_CS_ACTIVELOW |//SPI_CS_ACTIVEHIGH
SPI_WL_8));
UDMAInit();
// Set DMA channel
MAP_uDMAChannelAssign(UDMA_CH30_GSPI_RX);
//MAP_uDMAChannelAttributeDisable(UDMA_CH30_GSPI_RX,UDMA_ATTR_ALTSELECT);
MAP_uDMAChannelAssign(UDMA_CH31_GSPI_TX);
//MAP_uDMAChannelAttributeDisable(UDMA_CH31_GSPI_TX,UDMA_ATTR_ALTSELECT);
SPIFIFOLevelSet(GSPI_BASE,1,1);
SPIFIFOEnable(GSPI_BASE,SPI_RX_FIFO|SPI_TX_FIFO);
//
// Register Interrupt Handler
//
MAP_SPIIntRegister(GSPI_BASE,USR_SPI_SlaveIntHandler);
//MAP_SPIIntEnable(GSPI_BASE,SPI_INT_EOW);
MAP_SPIIntEnable(GSPI_BASE,SPI_INT_DMATX);
MAP_SPIIntEnable(GSPI_BASE,SPI_INT_DMARX);
2、spi中断
unsigned long ulRecvData;
unsigned long ulStatus;
ulStatus = MAP_SPIIntStatus(GSPI_BASE,true);
Message("SPI_INT");
if(ulStatus & SPI_INT_TX_EMPTY)
{
//MAP_SPIDataPut(GSPI_BASE,g_ucTxBuff[ucTxBuffNdx%TR_BUFF_SIZE]);
//ucTxBuffNdx++;
Message("SPI_INT_TX_EMPTY");
SPIIntClear(GSPI_BASE,SPI_INT_TX_EMPTY);
}
if(ulStatus & SPI_INT_RX_FULL)
{
//MAP_SPIDataGetNonBlocking(GSPI_BASE,&ulRecvData);
//g_ucTxBuff[ucRxBuffNdx%TR_BUFF_SIZE] = ulRecvData;
//Report("%c",ulRecvData);
//ucRxBuffNdx++;
Message("SPI_INT_RX_FULL");
SPIIntClear(GSPI_BASE,SPI_INT_RX_FULL);
}
if(ulStatus & SPI_INT_DMARX)
{
//ucTxBuffNdx++;
//MAP_SPIDataGet(GSPI_BASE,&ulDummy);
MAP_SPIDmaDisable(GSPI_BASE, SPI_RX_DMA );
Message("SPI_INT_DMARX");
SPIIntClear(GSPI_BASE,SPI_INT_DMARX);
}
if(ulStatus & SPI_INT_DMATX)
{
//ucTxBuffNdx++;
Message("SPI_INT_DMATX");
//MAP_SPIDisable(GSPI_BASE);
MAP_SPIDmaDisable(GSPI_BASE, SPI_TX_DMA );
SPIIntClear(GSPI_BASE,SPI_INT_DMATX);
MAP_GPIOPinWrite(GPIOA2_BASE,0x40,0x40);
}
3、spi从模式发送。
SPIWordCountSet(GSPI_BASE,wifi_rcv_num_all);
SetupTransfer(UDMA_CH31_GSPI_TX,UDMA_MODE_BASIC,wifi_rcv_num_all,
UDMA_SIZE_8,UDMA_ARB_1,
(void *)g_ucTxBuff,UDMA_SRC_INC_8,(void *)(GSPI_BASE + MCSPI_O_TX0),
UDMA_DST_INC_NONE);
SetupTransfer(UDMA_CH30_GSPI_RX,UDMA_MODE_BASIC,wifi_rcv_num_all,
UDMA_SIZE_8,UDMA_ARB_1,
(void *)(GSPI_BASE + MCSPI_O_RX0),UDMA_SRC_INC_NONE,
&count,UDMA_SRC_INC_NONE);
// MAP_SPIIntClear(GSPI_BASE,SPI_INT_EOW);
MAP_SPIIntEnable(GSPI_BASE,SPI_INT_DMATX);
MAP_SPIIntEnable(GSPI_BASE,SPI_INT_DMARX);
MAP_SPIDmaEnable(GSPI_BASE, SPI_RX_DMA | SPI_TX_DMA);
//SPICSEnable(GSPI_BASE);
MAP_SPIEnable(GSPI_BASE);
MAP_GPIOPinWrite(GPIOA2_BASE,0x40,0x00);
现在问题是:
1、系统会产生spi SPI_INT_DMATX中断,在中断中我拉高gpio脚,但是从spi发送100字节,主模式只收到79个字节。是因为产生SPI_INT_DMATX中断时,数据还没有全部发送到mosi管脚?那有没有标志可以判断数据已经全部发送到mosi脚。
2、spi 在dma模式,作为从模式如何检测主模式发送来的数据呢?
wei liu19:
请问这个问题你后来解决了吗?具体是什么原因呢?
lv tang:
回复 wei liu19:
这个问题,2位,你们的问题解决了吗!!为什么TI的大爷们,都不解答一下这个难题,不只是我一个人遇到了!!
这个问题,应该需要重视一下吧!
xing liu2:
请问问题有解决吗?
user4066886:
请问是否做成了spi转wifi?正在研究这个部分
Yonghua Pan:
回复 user4066886:
关于SPI DMA的部分,请参考一下下面的代码:
https://github.com/severin-kacianka/cc3200_dma_spi_example/