找回密码
 立即注册

QQ登录

只需一步,快速开始

打印 上一主题 下一主题
开启左侧

[NANO] 看来只有顶楼才会得到回复。我就重开一贴,关于PDMA

[复制链接]
跳转到指定楼层
楼主
与时俱进 发表于 2014-5-2 11:10:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 与时俱进 于 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,这个是不对的,不知何故。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 顶 踩
回复

使用道具 举报

沙发
a_ziliu 发表于 2014-5-2 22:18:52 | 只看该作者
你的sdcard有先初始化嗎?另外的問題,初始化後有掛fatfs去讀卡的內容嗎?
回复 支持 反对

使用道具 举报

板凳
 楼主| 与时俱进 发表于 2014-5-3 09:54:01 | 只看该作者
本帖最后由 与时俱进 于 2014-5-3 12:10 编辑

SD卡经过初始化,没用FATFS读内容,直接用扇区读程序,读出0扇区再用半主机显示出来。
我已经声明过“以上程序经过验证可以得到正确结果。”----指第一段程序。第二段程序用来替换第一段的。
关键是PDMA传输这样写,程序本身有没有什么地方错误和疏漏。
回复 支持 反对

使用道具 举报

地板
 楼主| 与时俱进 发表于 2014-5-3 11:28:29 | 只看该作者
本帖最后由 与时俱进 于 2014-5-3 14:20 编辑

找到程序的两个错误:1、源地址应该是&(SPI0->RX0)  2、关闭接收DMA应该用SPI_SetRxPDMA(SPI0, FALSE);
但是这样改后,读第一个扇区正常,后续扇区还是不行,说明第二段程序还是不能完全替换第一段程序。
回复 支持 反对

使用道具 举报

5#
 楼主| 与时俱进 发表于 2014-5-3 12:04:22 | 只看该作者
可能的原因:
1、关闭PDMA用如下3个语句还不够:
                SPI_SetTxPDMA(SPI0, FALSE);
                PDMA_Close();
                PDMA_DeInit();
2、这种PDMA传输是否很严格地只传输指定字节的数据,换句话说,是否在时钟线上仅仅送出指定字节的时钟信号?会不会时钟“过冲”。
SD卡多扇区读的时序是:  发命令----握手----传第1扇区数据-----握手---传第2扇区数据----,如果时钟“过冲”,可能造成后续扇区握手不成功,导致读取后续扇区失败。
回复 支持 反对

使用道具 举报

6#
 楼主| 与时俱进 发表于 2014-5-3 14:28:22 | 只看该作者
本帖最后由 与时俱进 于 2014-5-9 20:42 编辑

经过试验,传输完数据,要加上PDMA1->ISR=PDMA1->ISR;  为什么?
正确的程序是:
                PDMA_Init();
                PDMA_EnableChannelClock(PDMAGCR_CSR_CLK1);/* Enable Channel 1 Clock */
                sPDMA.DestAddr  = (uint32_t)p;    //目的地址
                sPDMA.SrcAddr = (uint32_t)&(SPI0->RX0);   //源地址
                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传输完成
                      PDMA1->ISR=PDMA1->ISR;
                SPI_SetRxPDMA(SPI0, FALSE);
                PDMA_Close();
                PDMA_DeInit();
                p+=128;
回复 支持 反对

使用道具 举报

7#
 楼主| 与时俱进 发表于 2014-5-6 08:22:29 | 只看该作者
与时俱进 发表于 2014-5-3 14:28
经过试验,传输完数据,要加上PDMA1->ISR=PDMA1->ISR;  为什么?
正确的程序是:
                PDMA_Ini ...

@a_ziliu 请指教。   
回复 支持 反对

使用道具 举报

8#
a_ziliu 发表于 2014-5-7 09:45:09 | 只看该作者
PDMA1->ISR=PDMA1->ISR;
是在清除pdma的中斷旗號位。
回复 支持 反对

使用道具 举报

9#
a_ziliu 发表于 2014-5-7 09:46:26 | 只看该作者
忘了問那一版的bsp?
回复 支持 反对

使用道具 举报

10#
 楼主| 与时俱进 发表于 2014-5-7 10:08:32 | 只看该作者
a_ziliu 发表于 2014-5-7 09:46
忘了問那一版的bsp?

DownloadList_NANO100B_Series_CMSIS_BSP_EN_Rev1.00.007.zip
回复 支持 反对

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies |上传

本版积分规则

新唐MCU