本帖最后由 与时俱进 于 2014-5-2 11:18 编辑
我用Nano130板做SD读卡实验,SPI0用32位模式传输128字,原先程序是
for( i=0;i<128;i++)
{
SPI0->CTL |= SPI_CTL_GO_BUSY; //目的是发送时钟
while(SPI0->CTL & SPI_CTL_GO_BUSY); //等待发送完成
*p++ = SPI0->RX0; //从SD卡接收数据存入缓冲区
}
以上程序经过验证可以得到正确结果。我现在想用PDMA模式,把上述程序改成
PDMA_Init();
PDMA_EnableChannelClock(PDMAGCR_CSR_CLK1);/* Enable Channel 1 Clock */
sPDMA.DestAddr = (uint32_t)p; //目的地址
sPDMA.SrcAddr = (uint32_t)&(SPI0->TX0); //源地址
sPDMA.SrcCtrl = PDMA_CSR_SAD_FIX; //固定源地址
sPDMA.DestCtrl = PDMA_CSR_DAD_INC; //目的地址递增
sPDMA.TransWidth = PDMA_CSR_APB_TWS_32BIT; //32位
sPDMA.Mode = PDMA_CSR_IP2MEM;
sPDMA.ByteCnt = 128*4;
sPDMA.IsTimeOutEnable = 0;
PDMA_Open(PDMA1, &sPDMA);
PDMA_SPI0_RX_TO_CH1(); //PDMA1
PDMA_CHEnableTransfer(PDMA1);
SPI_SetRxPDMA(SPI0, TRUE); //
SPI_SetGo(SPI0);
while(!(PDMA1->ISR & PDMA_ISR_TD)); //等待DMA传输完成
SPI_SetTxPDMA(SPI0, FALSE);
PDMA_Close();
PDMA_DeInit();
p+=128;
实验结果不对,没有正确从SD卡读到数据,为什么?程序哪里有问题吗?
仿真中,SPI_SetGo(SPI0)执行前,PDMA1->ISR值是0,执行后,PDMA1->ISR值马上变为2,这个是不对的,不知何故。
|