微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI WIFI设计交流 > wifi转spi问题

wifi转spi问题

时间:10-02 整理:3721RD 点击:

你好:

    我现在在做一个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模式,作为从模式如何检测主模式发送来的数据呢?

请问这个问题你后来解决了吗?具体是什么原因呢?

这个问题,2位,你们的问题解决了吗!为什么TI的大爷们,都不解答一下这个难题,不只是我一个人遇到了!

这个问题,应该需要重视一下吧!

请问问题有解决吗?

请问是否做成了spi转wifi?正在研究这个部分

关于SPI DMA的部分,请参考一下下面的代码:

https://github.com/severin-kacianka/cc3200_dma_spi_example/

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top