TI中文支持网
TI专业的中文技术问题搜集分享网站

咨询一个有关SPI传输的基本问题

关键词:CC3200   SPI   DMA

主要配置流程如下:

我想咨询几个问题

1,这段程序的意思是:

              SPI通过中断接收到数据后,缓存到一个FIFO中,当SPI的FIFO中的数据达8个时,触发DMA来读 一次,读后缓存入DMA的FIFO中,

              当DMA中的FIFO的数据达TOTAL_DMA_ELEMENTS时,触发SPI中断函数SpiIntHandler().我的理解是否正确?如果不正确错在哪里?

2,如果我上面的理解正确的话,我想请教下面个问题:

       a,   SPI接收到数据后是首先是存放在GSPI_BASE + MCSPI_O_RX0这个寄存器中的,收到8个数据触发DMA时,DMA读取的源地址还是这个地址,

             这个地址是代表着SPI的FIFO地址吗?

       b,UDMA_ARB_8代表什么函义?

3,关于UDMASetupTransfer这个函数的详细说明在哪个文档中?有相关的API说明吗?

4,NO DEAD CYCLE BETWEEN TWO SUCCESSIVE WORDS IN SLAVE MODE的内含是什么?

      是指在多个字节之间可以一直保持CS为低,直到传输结束而不用拉高吗?

spi_init()

{

       UDMAInit();

       ***();

       SPIIntRegister(ulBase,SpiIntHandler);

       UDMASetupTransfer(UDMA_CH30_GSPI_RX,UDMA_MODE_PINGPONG,TOTAL_DMA_ELEMENTS,
       UDMA_SIZE_8,UDMA_ARB_8,
       (void *)(GSPI_BASE + MCSPI_O_RX0),UDMA_SRC_INC_NONE,
       (void *)&g_Buff, UDMA_DST_INC_8);

       UDMASetupTransfer(UDMA_CH30_GSPI_RX|UDMA_ALT_SELECT,UDMA_MODE_PINGPONG,TOTAL_DMA_ELEMENTS,
       UDMA_SIZE_8, UDMA_ARB_8,
       (void *)(GSPI_BASE + MCSPI_O_RX0),UDMA_SRC_INC_NONE,
       (void *)&g_Buff[TOTAL_DMA_ELEMENTS], UDMA_DST_INC_8);

       SPIFIFOLevelSet(ulBase,8,8);

       SPIDmaEnable(ulBase,SPI_RX_DMA);
       MAP_SPIIntEnable(ulBase,SPI_INT_DMARX);      SPIDmaEnable(ulBase,SPI_TX_DMA);
      MAP_SPIIntEnable(ulBase,SPI_INT_DMATX);

}

SpiIntHandler()
{
       ulStatus = MAP_SPIIntStatus(GSPI_BASE,true);

       if(ulStatus & SPI_INT_DMARX)
       {
             if(g_DMARcvBank == 0)
             {
                     UDMASetupTransfer(UDMA_CH30_GSPI_RX,UDMA_MODE_PINGPONG,TOTAL_DMA_ELEMENTS,
                    UDMA_SIZE_8,UDMA_ARB_8,
                    (void *)(GSPI_BASE + MCSPI_O_RX0),UDMA_SRC_INC_NONE,
                    (void *)&g_Buff[g_Count], UDMA_DST_INC_8);

            }

            else
            {
                     UDMASetupTransfer(UDMA_CH30_GSPI_RX|UDMA_ALT_SELECT,UDMA_MODE_PINGPONG,TOTAL_DMA_ELEMENTS,
                     UDMA_SIZE_8,UDMA_ARB_8,
                     (void *)(GSPI_BASE + MCSPI_O_RX0),UDMA_SRC_INC_NONE,
                     (void *)&g_BeamBuff[g_Count], UDMA_DST_INC_8);

             }

            g_Count += TOTAL_DMA_ELEMENTS

    }

}

Viki Shi:

当DMA中的FIFO的数据达TOTAL_DMA_ELEMENTS时,触发SPI中断函数SpiIntHandler().我的理解是否正确?如果不正确错在哪里?

这句理解不对,dma获取到数据后会通知cpu来处理这些数据。当使用spi的dma模式来读取数据时,流程为 spi中断接收到满足fifo设置要求的数据后,通知DMA来获取 。DMA的功能主要是分担cpu 的工作,让cpu可以继续做其他事情 ,当dma获取到设定的数据大小后,就要通知cpu来把这些数据拿走处理

user1252639:

回复 Viki Shi:

那SpiIntHandler()这个中断函数是谁触发的?SPI每收到一个数据就触发一次吗还是SPI的FIFO中有8个数据时触发一次?这样的话SPI_INT_DMARX又是指什么含义,还有就是在前面配置SPI和DMA就是指明了DMA的源地址和目标地址,为什么在SpiIntHandler()中又调用了一遍UDMASetupTransfer()?dma获取到设定的数据大小后,就要通知cpu来把这些数据拿走处理,这个通过什么通知的???没发现有DMA获取设定数据有中断处理函数啊!!!

Viki Shi:

回复 user1252639:

这个讲起来比较复杂,建议先了解下DMA,原理问题不好阐述

user1252639:

回复 Viki Shi:

原理性的东西会看,现在就想知道谁触发的SpiIntHandler()?文档写的不是很清晰!!!

赞(0)
未经允许不得转载:TI中文支持网 » 咨询一个有关SPI传输的基本问题
分享到: 更多 (0)