This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

5509A读取SD卡使能DMA

Other Parts Discussed in Thread: TMS320VC5509A

请问下有相关资料和例程吗?CSL库里面读取SD卡数据都没使能DMA

  • 可以参考C:\ti\C55xxCSL\examples\generic5509\csl\dma\dma4,这个例程是McBSP+DMA的。

    需要做修改的地方:

    1. DMA event改成MMC receive event, MMC transmit event

    Table 3−4. Synchronization Control Function
    http://www.ti.com/lit/ds/symlink/tms320vc5509a.pdf

    2. MMCCTL.DMAEN位使能 

  • 非常感谢您的回复,我想问下Serial Port 1 Mode这个是在哪个寄存器里面?我找了两天了都找不到

    还有我想问下,retVal = MMC_read(mmc0,0x219a00,datareceive,512);这句话我想读取SD卡这段数据,对于DMA原地址的定义应该如何编写?

  • 这个在EBSR寄存器里设置。
    3.5.1 External Bus Selection Register (EBSR)
    http://www.ti.com/lit/ds/symlink/tms320vc5509a.pdf 

  • 非常感谢您的回答,我想问下,CSL例程读取SD卡程序时应该已经设置了吧?如果没有设置的话他如何读取SD卡的数据呢?

    请问下如果没有设置的话我要调用哪个函数来对EBSR进行设置?

  • 如果你之前的SD卡程序已经可以读写了,那应该已经是设好了的,你也可以看一下EBSR的值确认。

    可以用CHIP_FSET函数设置,也可以直接写代码,如下:
    #define EBSR            (*(volatile ioport unsigned short*)0x6c00)

    ....
    EBSR =; 

  • 好的,那应该是已经设置好了的,我SD读写的程序是直接拿CSL的例程的

    还有我想问下,retVal = MMC_read(mmc0,0x219a00,datareceive,512);这句话,我如何将其应用到DMA的使用中?我想做的是将SD的一段数据取出来放到DARAM中

    下面是我的程序

    /*
     * Copyright (C) 2003 Texas Instruments Incorporated
     * All Rights Reserved
     */
    /*
     *---------main_dma4.c---------
     * This example places the MCBSP in digital loopback mode and
     * syncs MCBSP receive with DMA channel 4 and MCBSP transmit
     * with DMA channel 5.
     * The example uses predefined CSL macros and symbolic
     * constants to create the initialization values needed for
     * the MCBSP and DMA control registers to effect the transfer
     */
    #include <stdio.h>
    
    #include <csl_mmc.h>
    #include <csl_mcbsp.h>
    #include <csl_dma.h>
    #include <csl_irq.h>
    
    #define EBSR            (*(volatile ioport unsigned short*)0x6c00)
    
    #pragma DATA_SECTION(mmc0,"cslmem")
    MMC_Handle mmc0;
    MMC_CardObj *card, cardalloc;
    MMC_CardIdObj *cid, cardid;
    
    int count, retVal;
    Uint16 rca;
    Uint16 cardtype;
    
    /* Because of different operating clock frequencies, the Init structure for c5509    *
     * and c5509a have different values for memory and function clock divide down values */
    #if CHIP_5509A
      MMC_SetupNative Init = {
        0,   /* Disable DMA for data read/write                 */
        0,   /* Set level of edge detection for DAT3 pin        */
        0,   /* Determines if MMC goes IDLE during IDLE instr   */
        1,   /* Memory clk reflected on CLK Pin                 */
        7,   /* CPU CLK to MMC function clk divide down         */
        5,   /* MMC function clk to memory clk divide down      */
        0,   /* No. memory clks to wait before response timeout */
        0,   /* No. memory clks to wait before data timeout     */
        512, /* Block Length must be same as CSD                */
      };
    #else
      MMC_SetupNative Init = {
        0,   /* Disable DMA for data read/write                 */
        0,   /* Set level of edge detection for DAT3 pin        */
        0,   /* Determines if MMC goes IDLE during IDLE instr   */
        1,   /* Memory clk reflected on CLK Pin                 */
        3,   /* CPU CLK to MMC function clk divide down         */
        3,   /* MMC function clk to memory clk divide down      */
        0,   /* No. memory clks to wait before response timeout */
        0,   /* No. memory clks to wait before data timeout     */
        512, /* Block Length must be same as CSD                */
      };
    #endif
    
    /* Read and write buffers */
    Uint16 datasend[512];
    Uint16 datareceive[512];
    
    //---------Global constants---------
    #define N       128
    
    //---------Global data definition---------
    
    /* Define transmit and receive buffers */
    #pragma DATA_SECTION(xmt,"dmaMem")
    Uint16 xmt[N];
    #pragma DATA_SECTION(rcv,"dmaMem")
    Uint16 rcv[N];
    
      MCBSP_Config ConfigLoopBack16= {
      MCBSP_SPCR1_RMK(
        MCBSP_SPCR1_DLB_ON,                    /* DLB    = 1 数字回环模式使能*/
        MCBSP_SPCR1_RJUST_RZF,                 /* RJUST  = 0 接收数据符号扩展和调节方式(左对齐数据和右对齐数据等等)*/
        MCBSP_SPCR1_CLKSTP_DISABLE,            /* CLKSTP = 0 Clock stop mode disable */
        MCBSP_SPCR1_DXENA_NA,                  /* DXENA  = 0 DX引脚延时使能*/
        MCBSP_SPCR1_ABIS_DISABLE,              /* ABIS   = 0 reserved always write 0*/
        MCBSP_SPCR1_RINTM_RRDY,                /* RINTM  = 0 接收中断模式(可能需要设置?)*/
        0,                                     /* RSYNCER = 0 接收帧同步错误标志*/
        MCBSP_SPCR1_RRST_DISABLE               /* RRST   = 0 禁止接收器复位*/
       ),
        MCBSP_SPCR2_RMK(
        MCBSP_SPCR2_FREE_NO,                   /* FREE   = 0 free run bit, The McBSP transmit and receive clocks are affected as determined by the SOFT bit*/
        MCBSP_SPCR2_SOFT_NO,                   /* SOFT   = 0 Soft stop bit, Hard stop*/
        MCBSP_SPCR2_FRST_FSG,                  /* FRST   = 0 帧同步逻辑复位*/
        MCBSP_SPCR2_GRST_CLKG,                 /* GRST   = 0 采样率发生器复位*/
        MCBSP_SPCR2_XINTM_XRDY,                /* XINTM  = 0 发送中断模式(可能需要设置?)*/
        0,                                     /* XSYNCER = N/A transmit frame-sync error bit, no error*/
        MCBSP_SPCR2_XRST_DISABLE               /* XRST   = 0 发送器复位*/
        //注意:开始一定要设置为disable,否则不能设置它的寄存器,全部为默认值,导致不能正常接收,
    
        //在程序调用C库函数mcbspstart时会在设为1,McBSP便退出reset状态开始工作
    
       ),
      MCBSP_RCR1_RMK(
      MCBSP_RCR1_RFRLEN1_OF(0),                /* RFRLEN1 = 0 接收阶段1的帧长(1-128)个字*/
      MCBSP_RCR1_RWDLEN1_16BIT                 /* RWDLEN1 = 5 接收阶段1的字长*/
      ),
     MCBSP_RCR2_RMK(
        MCBSP_RCR2_RPHASE_SINGLE,              /* RPHASE  = 0 接收帧的阶段数*/
        MCBSP_RCR2_RFRLEN2_OF(0),              /* RFRLEN2 = 0 接收阶段2关闭*/
        MCBSP_RCR2_RWDLEN2_8BIT,               /* RWDLEN2 = 0 接收阶段2的字长为8位*/
        MCBSP_RCR2_RCOMPAND_MSB,               /* RCOMPAND = 0 接收数据压扩模式*/
        MCBSP_RCR2_RFIG_YES,                   /* RFIG    = 0 忽略不期望接收的帧同步信号*/
        MCBSP_RCR2_RDATDLY_0BIT                /* RDATDLY = 0 接收数据不延时*/
        ),
       MCBSP_XCR1_RMK(
        MCBSP_XCR1_XFRLEN1_OF(0),              /* XFRLEN1 = 0 发送阶段1的帧长(1-128)个字*/
        MCBSP_XCR1_XWDLEN1_16BIT               /* XWDLEN1 = 5 发送阶段1的字长*/
    
     ),
     MCBSP_XCR2_RMK(
        MCBSP_XCR2_XPHASE_SINGLE,              /* XPHASE  = 0 Transmit phase number bit, single-phase frame*/
        MCBSP_XCR2_XFRLEN2_OF(0),              /* XFRLEN2 = 0 */
        MCBSP_XCR2_XWDLEN2_8BIT,               /* XWDLEN2 = 0 */
        MCBSP_XCR2_XCOMPAND_MSB,               /* XCOMPAND = 0 Transmit companding mode bits, 0, no companding,MSB received first*/
        MCBSP_XCR2_XFIG_YES,                   /* XFIG    = 0 Transmit frame-sync ignore bit, 1, frame-sync detect*/
        MCBSP_XCR2_XDATDLY_0BIT                /* XDATDLY = 0 Transmit data delay bits*/
      ),
     MCBSP_SRGR1_RMK(
       MCBSP_SRGR1_FWID_OF(1),                /* FWID    = 1 帧同步信号FSG的脉冲宽度*/
       MCBSP_SRGR1_CLKGDV_OF(1)               /* CLKGDV  = 1 输出时钟信号CLKG的分频值*/
     ),
     MCBSP_SRGR2_RMK(
        MCBSP_SRGR2_GSYNC_FREE,                /* FREE    = 0 */
        MCBSP_SRGR2_CLKSP_RISING,              /* CLKSP   = 0 */
        MCBSP_SRGR2_CLKSM_INTERNAL,            /* CLKSM   = 1 */
        MCBSP_SRGR2_FSGM_DXR2XSR,              /* FSGM    = 0 */
        MCBSP_SRGR2_FPER_OF(15)                /* FPER    = 0 */
     ),
     MCBSP_MCR1_DEFAULT,						//MCR是通道控制器
     MCBSP_MCR2_DEFAULT,
     MCBSP_PCR_RMK(
       MCBSP_PCR_IDLEEN_RESET,                 /* IDLEEN   = 0   The McBSP remains active when the PERIPH domain is idled */
       MCBSP_PCR_XIOEN_SP,                     /* XIOEN    = 0   Transmit I/O enable bit, CLKX,FSX,DX,CLKS pins are serial port pins*/
       MCBSP_PCR_RIOEN_SP,                     /* RIOEN    = 0   Receive I/O enable bit, CLKR,FSR,DR,CLKS pins are serial port pins*/
       MCBSP_PCR_FSXM_INTERNAL,                /* FSXM     = 1   发送帧同步模式:1为由MCBSP提供*/
       MCBSP_PCR_FSRM_EXTERNAL,                /* FSRM     = 0   接收帧同步模式:0为FSR引脚提供*/
       MCBSP_PCR_CLKXM_OUTPUT,                 /* CLKXM    = 1   Transmit clock mode bit*/
       MCBSP_PCR_CLKRM_INPUT,                  /* CLKRM    = 0   Receive clock mode bit*/
       MCBSP_PCR_SCLKME_NO,                    /* SCLKME   = 0   Sample rate generator input clock mode bit,used with CLKSM to select the input clock*/
       0,                                      /* DXSTAT = N/A   */
       MCBSP_PCR_FSXP_ACTIVEHIGH,              /* FSXP     = 0   Transmit frame-sync polarity bit, 0,transmit frame-sync pulses are active high*/
       MCBSP_PCR_FSRP_ACTIVEHIGH,              /* FSRP     = 0   Receive frame-sync polarity bit, 0,receive frame-sync pulses are active high*/
       MCBSP_PCR_CLKXP_RISING,                 /* CLKXP    = 0   Transmit clock polarity bit,1,transmit data is driven on the rising edge of CLKX*/
       MCBSP_PCR_CLKRP_FALLING                 /* CLKRP    = 0   Receive clock polarity bit*/
     ),
     MCBSP_RCERA_DEFAULT,						//通道使能寄存器
     MCBSP_RCERB_DEFAULT,
     MCBSP_RCERC_DEFAULT,
     MCBSP_RCERD_DEFAULT,
     MCBSP_RCERE_DEFAULT,
     MCBSP_RCERF_DEFAULT,
     MCBSP_RCERG_DEFAULT,
     MCBSP_RCERH_DEFAULT,
     MCBSP_XCERA_DEFAULT,
     MCBSP_XCERB_DEFAULT,
     MCBSP_XCERC_DEFAULT,
     MCBSP_XCERD_DEFAULT,
     MCBSP_XCERE_DEFAULT,
     MCBSP_XCERF_DEFAULT,
     MCBSP_XCERG_DEFAULT,
     MCBSP_XCERH_DEFAULT
    };
    
    /* Create DMA Receive Side Configuration */
    DMA_Config  dmaRcvConfig = {
      DMA_DMACSDP_RMK(
        DMA_DMACSDP_DSTBEN_NOBURST,				//Destination burst :-不使用突发
        DMA_DMACSDP_DSTPACK_OFF,				//Destination packing :-目标口禁止打包
        DMA_DMACSDP_DST_DARAM,					//Destination selection :-接收的目标口是DARAM
    	//00 SARAM;01 DARAM;10 EMIF;11 PERIPH
        DMA_DMACSDP_SRCBEN_NOBURST,				//Source burst :-源突发禁止
        DMA_DMACSDP_SRCPACK_OFF,				//Source packing :-源口禁止打包
        DMA_DMACSDP_SRC_PERIPH,					//Source selection :-外设mcbsp
        DMA_DMACSDP_DATATYPE_16BIT				 //Data type :-设置数据类型16bit字长
      ),                                       /* DMACSDP  */
      DMA_DMACCR_RMK(
        DMA_DMACCR_DSTAMODE_POSTINC,			//Destination address mode :-自动执行后增量(由于本程序中数据类型是16bit,所以+2)
        DMA_DMACCR_SRCAMODE_CONST,				//Source address mode :-源地址为恒定地址
        DMA_DMACCR_ENDPROG_ON,					//End of programmation bit :-
        DMA_DMACCR_REPEAT_OFF,					//Repeat condition :(AUTOINIT=1)才有效?-0 管编程配置结束位 1 不管编程配置结束位,结束传输自动初始化开始
    											//0:Repeat only if ENDPROG = 1(AUTOINIT=1)
        DMA_DMACCR_AUTOINIT_OFF,				//Auto initialization bit :-
        DMA_DMACCR_EN_STOP,						//Channel enable :-设置时先关闭通道
        DMA_DMACCR_PRIO_LOW,					//Channel priority :-设置为低优先级
        DMA_DMACCR_FS_DISABLE,					//(FS_ELEMENT 单元事件同步)
        DMA_DMACCR_SYNC_REVT1					//Synchronization control bits
      ),                                       /* DMACCR   */
      DMA_DMACICR_RMK(
        DMA_DMACICR_BLOCKIE_OFF,				//Whole block interrupt enable :-块传输完成后中断不使能
        DMA_DMACICR_LASTIE_OFF,					//Last frame interrupt enable :-
        DMA_DMACICR_FRAMEIE_ON,					//Whole frame interrupt enable :-帧传输完成后中断使能
        DMA_DMACICR_FIRSTHALFIE_OFF,			//Half frame interrupt enable :-
        DMA_DMACICR_DROPIE_OFF,					//Sync. event drop interrupt enable :-
        DMA_DMACICR_TIMEOUTIE_OFF				//Time out interrupt enable :-
      ),                                       /* DMACICR  */
        (DMA_AdrPtr)(MCBSP_ADDR(DRR11)),        /* DMACSSAL 源地址低位*/
        0,                                     /* DMACSSAU 源地址高位*/
        (DMA_AdrPtr)&rcv,                      /* DMACDSAL 目的地址低位*/
        0,                                     /* DMACDSAU 目的地址高位*/
        N,                                     /* DMACEN   1帧内数据长度 N个数据一个帧*/
        1,                                     /* DMACFN   帧数大小*/
        0,                                     /* DMACFI  */
        0                                      /* DMACEI  */
      };
    
    /* Create DMA Transmit Side Configuration */
    DMA_Config  dmaXmtConfig = {
      DMA_DMACSDP_RMK(
        DMA_DMACSDP_DSTBEN_NOBURST,
        DMA_DMACSDP_DSTPACK_OFF,
        DMA_DMACSDP_DST_PERIPH,					//Destination selection :-外设mcbsp
        DMA_DMACSDP_SRCBEN_NOBURST,
        DMA_DMACSDP_SRCPACK_OFF,
        DMA_DMACSDP_SRC_DARAM,					//Source selection :DARAM
        DMA_DMACSDP_DATATYPE_16BIT
      ),                                       /* DMACSDP  */
      DMA_DMACCR_RMK(
        DMA_DMACCR_DSTAMODE_CONST,				//Destination address mode :-恒定地址
        DMA_DMACCR_SRCAMODE_POSTINC,			//Source address mode :-自动执行后增量(由于本程序中数据类型是16bit,所以+2
        DMA_DMACCR_ENDPROG_ON,
        DMA_DMACCR_REPEAT_OFF,
        DMA_DMACCR_AUTOINIT_OFF,
        DMA_DMACCR_EN_STOP,
        DMA_DMACCR_PRIO_LOW,
        DMA_DMACCR_FS_DISABLE,
        DMA_DMACCR_SYNC_XEVT1					//Synchronization control bits
      ),                                       /* DMACCR   */
      DMA_DMACICR_RMK(
        DMA_DMACICR_BLOCKIE_OFF,
        DMA_DMACICR_LASTIE_OFF,
        DMA_DMACICR_FRAMEIE_ON,
        DMA_DMACICR_FIRSTHALFIE_OFF,
        DMA_DMACICR_DROPIE_OFF,
        DMA_DMACICR_TIMEOUTIE_OFF
      ),                                       /* DMACICR  */
        (DMA_AdrPtr)&xmt[1],                   /* DMACSSAL */
        0,                                     /* DMACSSAU */
        (DMA_AdrPtr)(MCBSP_ADDR(DXR11)),       /* DMACDSAL */
        0,                                     /* DMACDSAU */
        N,                                     /* DMACEN   */
        1,                                     /* DMACFN   */
        0,                                     /* DMACFI   */
        0                                      /* DMACEI   */
    };
    
    /* Define a DMA_Handle object to be used with DMA_open function */
    DMA_Handle hDmaRcv, hDmaXmt;
    
    /* Define a MCBSP_Handle object to be used with MCBSP_open function */
    MCBSP_Handle hMcbsp;
    
    volatile Uint16 transferComplete = FALSE;
    Uint16 err = 0;
    Uint16 old_intm;
    Uint16 xmtEventId, rcvEventId;
    
    //---------Function prototypes---------
    /* Reference start of interrupt vector table   */
    /* This symbol is defined in file, vectors.s55 */
    extern void VECSTART(void);
    
    /* Protoype for interrupt functions */
    interrupt void dmaXmtIsr(void);
    interrupt void dmaRcvIsr(void);
    void taskFxn(void);
    
    //---------main routine---------
    void main(void)
    {
        Uint16 i;
    
        /* Initialize CSL library - This is REQUIRED !!! */
        CSL_init();
    
        /* Set IVPD/IVPH to start of interrupt vector table */
        IRQ_setVecs((Uint32)(&VECSTART));
    
        for (i = 0; i <= N - 1; i++) {
            xmt[i] =  i + 1;
            rcv[i] = 0;
        }
    
        printf ("\nMMC Single block read-write test\n");
    
        for (count=0;count<=256;count++){
            datasend[count]    = count;
            datareceive[count] = 0xFFFF;
        }
    
        /* A detailed explanation of MMC initialization is provided in mmc_setup example */
        mmc0 = MMC_open(MMC_DEV1);
        MMC_setupNative(mmc0,&Init);
    
        MMC_sendGoIdle(mmc0);
        for (count=0;count<4016;count++)
        	asm("	NOP");
    
        cardtype = MMC_sendOpCond(mmc0,0x00100000);
    
        if (cardtype == MMC_CARD){
           cid = &cardid;
           MMC_sendAllCID(mmc0,cid); // get the CID structure for all cards.
           rca = 10;
           card = &cardalloc;
           retVal = MMC_setRca(mmc0,card,rca);
        } else {
           cid = &cardid;
           SD_sendAllCID(mmc0,cid); // get the CID structure for all cards.
           card = &cardalloc;
           rca = SD_sendRca(mmc0,card);
           printf ("RCA sent by the SD card is 0x%x\n", rca);
        }
    
        /* Select the card to transfer data to/from. This step puts the card into the *
         * transfer state where it is ready to read/write data                        */
    
        retVal = MMC_selectCard(mmc0,card);
    
        printf ("Reading data from card...\n");
        retVal = MMC_read(mmc0,0x219a00,datareceive,512);
        for (count = 0; count < 6000; ++count);
    
        printf ("TEST PASSED\n");
    
        /* Call function to effect transfer */
        taskFxn();
    }
    
    void taskFxn(void)
    {
        Uint16 srcAddrHi, srcAddrLo;
        Uint16 dstAddrHi, dstAddrLo;
        Uint16 i;
    
        /* By default, the TMS320C55xx compiler assigns all data symbols word */
        /* addresses. The DMA however, expects all addresses to be byte       */
        /* addresses. Therefore, we must shift the address by 2 in order to   */
        /* change the word address to a byte address for the DMA transfer.    */
        srcAddrHi = (Uint16)(((Uint32)(MCBSP_ADDR(DRR11))) >> 15) & 0xFFFFu;
        srcAddrLo = (Uint16)(((Uint32)(MCBSP_ADDR(DRR11))) << 1) & 0xFFFFu;
        dstAddrHi = (Uint16)(((Uint32)(&rcv)) >> 15) & 0xFFFFu;
        dstAddrLo = (Uint16)(((Uint32)(&rcv)) << 1) & 0xFFFFu;
    
        dmaRcvConfig.dmacssal = (DMA_AdrPtr)srcAddrLo;
        dmaRcvConfig.dmacssau = srcAddrHi;
        dmaRcvConfig.dmacdsal = (DMA_AdrPtr)dstAddrLo;
        dmaRcvConfig.dmacdsau = dstAddrHi;
    
        srcAddrHi = (Uint16)(((Uint32)(&xmt[0])) >> 15) & 0xFFFFu;
        srcAddrLo = (Uint16)(((Uint32)(&xmt[0])) << 1) & 0xFFFFu;
        dstAddrHi = (Uint16)(((Uint32)(MCBSP_ADDR(DXR11))) >> 15) & 0xFFFFu;
        dstAddrLo = (Uint16)(((Uint32)(MCBSP_ADDR(DXR11))) << 1) & 0xFFFFu;
    
        dmaXmtConfig.dmacssal = (DMA_AdrPtr)srcAddrLo;
        dmaXmtConfig.dmacssau = srcAddrHi;
        dmaXmtConfig.dmacdsal = (DMA_AdrPtr)dstAddrLo;
        dmaXmtConfig.dmacdsau = dstAddrHi;
    
        /* Open MCBSP Port 1 and set registers to their power on defaults */
        hMcbsp = MCBSP_open(MCBSP_PORT1, MCBSP_OPEN_RESET);
    
        /* Open DMA channels 4 & 5 and set regs to power on defaults */
        hDmaRcv = DMA_open(DMA_CHA4,DMA_OPEN_RESET);
        hDmaXmt = DMA_open(DMA_CHA5,DMA_OPEN_RESET);
    
        /* Get interrupt event associated with DMA receive and transmit */
        xmtEventId = DMA_getEventId(hDmaXmt);
        rcvEventId = DMA_getEventId(hDmaRcv);
    
        /* Temporarily disable interrupts and clear any pending */
        /* interrupts for MCBSP transmit */
        old_intm = IRQ_globalDisable();
    
        /* Clear any pending interrupts for DMA channels */
        IRQ_clear(xmtEventId);
        IRQ_clear(rcvEventId);
    
        /* Enable DMA interrupt in IER register */
        IRQ_enable(xmtEventId);
        IRQ_enable(rcvEventId);
    
        /* Set Start Of Interrupt Vector Table */
        IRQ_setVecs(0x10000);
    
        /* Place DMA interrupt service addresses at associate vector */
        IRQ_plug(xmtEventId,&dmaXmtIsr);
        IRQ_plug(rcvEventId,&dmaRcvIsr);
    
        /* Write values from configuration structure to MCBSP control regs */
        MCBSP_config(hMcbsp, &ConfigLoopBack16);
    
        /* Write values from configuration structure to DMA control regs */
        DMA_config(hDmaRcv,&dmaRcvConfig);
        DMA_config(hDmaXmt,&dmaXmtConfig);
    
    #if 0
        /* Take MCBSP transmit and receive out of reset */
        MCBSP_start(hMcbsp,
                    MCBSP_XMIT_START | MCBSP_RCV_START,
                    0u);
    
        /* Prime MCBSP DXR */
        while (!(MCBSP_xrdy(hMcbsp))){
          ;
        }
        MCBSP_write16(hMcbsp,xmt[0]);
    
       /* Enable all maskable interrupts */
        IRQ_globalEnable();
    
        /* Enable DMA */
        DMA_start(hDmaRcv);
        DMA_start(hDmaXmt);
    
        /* Start Sample Rate Generator and Enable Frame Sync */
        MCBSP_start(hMcbsp,
                    MCBSP_SRGR_START | MCBSP_SRGR_FRAMESYNC,
                    0x300u);
    #else
    	/* Enable all maskable interrupts */
        IRQ_globalEnable();
    
        /* Start Sample Rate Generator and Enable Frame Sync */
        MCBSP_start(hMcbsp,
                    MCBSP_SRGR_START | MCBSP_SRGR_FRAMESYNC,
                    0x300u);
    
        /* Enable DMA */
        DMA_start(hDmaRcv);
        DMA_start(hDmaXmt);
    
        /* Take MCBSP transmit and receive out of reset */
        MCBSP_start(hMcbsp,
                    MCBSP_XMIT_START | MCBSP_RCV_START,
                    0u);
    #endif
        /* Wait for DMA transfer to be complete */
        while (!transferComplete){
            ;
        }
    
        /*------------------------------------------*\
         * Compare values
        \*------------------------------------------*/
        for(i = 0; i <= N - 1; i++){
            if (rcv[i] != xmt[i]){
                ++err;
                break;
           }
        }
    
        printf ("%s\n",err?"TEST FAILED" : "TEST PASSED");
    
        /* Restore status of global interrupt enable flag */
        IRQ_globalRestore(old_intm);
    
        /* We're done with MCBSP and DMA , so close them */
        MCBSP_close(hMcbsp);
        DMA_close(hDmaRcv);
        DMA_close(hDmaXmt);
    }
    
    interrupt void dmaXmtIsr(void) {
       DMA_stop(hDmaXmt);
       IRQ_disable(xmtEventId);
    }
    
    interrupt void dmaRcvIsr(void) {
       DMA_stop(hDmaRcv);
       IRQ_disable(rcvEventId);
       transferComplete = TRUE;
    }
    

    /*
     * Copyright (C) 2003 Texas Instruments Incorporated
     * All Rights Reserved
     */
    /*
     *---------main_dma4.c---------
     * This example places the MCBSP in digital loopback mode and
     * syncs MCBSP receive with DMA channel 4 and MCBSP transmit
     * with DMA channel 5.
     * The example uses predefined CSL macros and symbolic
     * constants to create the initialization values needed for
     * the MCBSP and DMA control registers to effect the transfer
     */
    #include <stdio.h>
    #include <csl_mmc.h>
    #include <csl_mcbsp.h>
    #include <csl_dma.h>
    #include <csl_irq.h>
    #define EBSR            (*(volatile ioport unsigned short*)0x6c00)
    #pragma DATA_SECTION(mmc0,"cslmem")
    MMC_Handle mmc0;
    MMC_CardObj *card, cardalloc;
    MMC_CardIdObj *cid, cardid;
    int count, retVal;
    Uint16 rca;
    Uint16 cardtype;
    /* Because of different operating clock frequencies, the Init structure for c5509    *
     * and c5509a have different values for memory and function clock divide down values */
    #if CHIP_5509A
      MMC_SetupNative Init = {
        0,   /* Disable DMA for data read/write                 */
        0,   /* Set level of edge detection for DAT3 pin        */
        0,   /* Determines if MMC goes IDLE during IDLE instr   */
        1,   /* Memory clk reflected on CLK Pin                 */
        7,   /* CPU CLK to MMC function clk divide down         */
        5,   /* MMC function clk to memory clk divide down      */
        0,   /* No. memory clks to wait before response timeout */
        0,   /* No. memory clks to wait before data timeout     */
        512, /* Block Length must be same as CSD                */
      };
    #else
      MMC_SetupNative Init = {
        0,   /* Disable DMA for data read/write                 */
        0,   /* Set level of edge detection for DAT3 pin        */
        0,   /* Determines if MMC goes IDLE during IDLE instr   */
        1,   /* Memory clk reflected on CLK Pin                 */
        3,   /* CPU CLK to MMC function clk divide down         */
        3,   /* MMC function clk to memory clk divide down      */
        0,   /* No. memory clks to wait before response timeout */
        0,   /* No. memory clks to wait before data timeout     */
        512, /* Block Length must be same as CSD                */
      };
    #endif
    /* Read and write buffers */
    Uint16 datasend[512];
    Uint16 datareceive[512];
    //---------Global constants---------
    #define N       128
    //---------Global data definition---------
    /* Define transmit and receive buffers */
    #pragma DATA_SECTION(xmt,"dmaMem")
    Uint16 xmt[N];
    #pragma DATA_SECTION(rcv,"dmaMem")
    Uint16 rcv[N];
      MCBSP_Config ConfigLoopBack16= {
      MCBSP_SPCR1_RMK(
        MCBSP_SPCR1_DLB_ON,                    /* DLB    = 1 数字回环模式使能*/
        MCBSP_SPCR1_RJUST_RZF,                 /* RJUST  = 0 接收数据符号扩展和调节方式(左对齐数据和右对齐数据等等)*/
        MCBSP_SPCR1_CLKSTP_DISABLE,            /* CLKSTP = 0 Clock stop mode disable */
        MCBSP_SPCR1_DXENA_NA,                  /* DXENA  = 0 DX引脚延时使能*/
        MCBSP_SPCR1_ABIS_DISABLE,              /* ABIS   = 0 reserved always write 0*/
        MCBSP_SPCR1_RINTM_RRDY,                /* RINTM  = 0 接收中断模式(可能需要设置?)*/
        0,                                     /* RSYNCER = 0 接收帧同步错误标志*/
        MCBSP_SPCR1_RRST_DISABLE               /* RRST   = 0 禁止接收器复位*/
       ),
        MCBSP_SPCR2_RMK(
        MCBSP_SPCR2_FREE_NO,                   /* FREE   = 0 free run bit, The McBSP transmit and receive clocks are affected as determined by the SOFT bit*/
        MCBSP_SPCR2_SOFT_NO,                   /* SOFT   = 0 Soft stop bit, Hard stop*/
        MCBSP_SPCR2_FRST_FSG,                  /* FRST   = 0 帧同步逻辑复位*/
        MCBSP_SPCR2_GRST_CLKG,                 /* GRST   = 0 采样率发生器复位*/
        MCBSP_SPCR2_XINTM_XRDY,                /* XINTM  = 0 发送中断模式(可能需要设置?)*/
        0,                                     /* XSYNCER = N/A transmit frame-sync error bit, no error*/
        MCBSP_SPCR2_XRST_DISABLE               /* XRST   = 0 发送器复位*/
        //注意:开始一定要设置为disable,否则不能设置它的寄存器,全部为默认值,导致不能正常接收,
        //在程序调用C库函数mcbspstart时会在设为1,McBSP便退出reset状态开始工作
       ),
      MCBSP_RCR1_RMK(
      MCBSP_RCR1_RFRLEN1_OF(0),                /* RFRLEN1 = 0 接收阶段1的帧长(1-128)个字*/
      MCBSP_RCR1_RWDLEN1_16BIT                 /* RWDLEN1 = 5 接收阶段1的字长*/
      ),
     MCBSP_RCR2_RMK(
        MCBSP_RCR2_RPHASE_SINGLE,              /* RPHASE  = 0 接收帧的阶段数*/
        MCBSP_RCR2_RFRLEN2_OF(0),              /* RFRLEN2 = 0 接收阶段2关闭*/
        MCBSP_RCR2_RWDLEN2_8BIT,               /* RWDLEN2 = 0 接收阶段2的字长为8位*/
        MCBSP_RCR2_RCOMPAND_MSB,               /* RCOMPAND = 0 接收数据压扩模式*/
        MCBSP_RCR2_RFIG_YES,                   /* RFIG    = 0 忽略不期望接收的帧同步信号*/
        MCBSP_RCR2_RDATDLY_0BIT                /* RDATDLY = 0 接收数据不延时*/
        ),
       MCBSP_XCR1_RMK(
        MCBSP_XCR1_XFRLEN1_OF(0),              /* XFRLEN1 = 0 发送阶段1的帧长(1-128)个字*/
        MCBSP_XCR1_XWDLEN1_16BIT               /* XWDLEN1 = 5 发送阶段1的字长*/
     ),
     MCBSP_XCR2_RMK(
        MCBSP_XCR2_XPHASE_SINGLE,              /* XPHASE  = 0 Transmit phase number bit, single-phase frame*/
        MCBSP_XCR2_XFRLEN2_OF(0),              /* XFRLEN2 = 0 */
        MCBSP_XCR2_XWDLEN2_8BIT,               /* XWDLEN2 = 0 */
        MCBSP_XCR2_XCOMPAND_MSB,               /* XCOMPAND = 0 Transmit companding mode bits, 0, no companding,MSB received first*/
        MCBSP_XCR2_XFIG_YES,                   /* XFIG    = 0 Transmit frame-sync ignore bit, 1, frame-sync detect*/
        MCBSP_XCR2_XDATDLY_0BIT                /* XDATDLY = 0 Transmit data delay bits*/
      ),
     MCBSP_SRGR1_RMK(
       MCBSP_SRGR1_FWID_OF(1),                /* FWID    = 1 帧同步信号FSG的脉冲宽度*/
       MCBSP_SRGR1_CLKGDV_OF(1)               /* CLKGDV  = 1 输出时钟信号CLKG的分频值*/
     ),
     MCBSP_SRGR2_RMK(
        MCBSP_SRGR2_GSYNC_FREE,                /* FREE    = 0 */
        MCBSP_SRGR2_CLKSP_RISING,              /* CLKSP   = 0 */
        MCBSP_SRGR2_CLKSM_INTERNAL,            /* CLKSM   = 1 */
        MCBSP_SRGR2_FSGM_DXR2XSR,              /* FSGM    = 0 */
        MCBSP_SRGR2_FPER_OF(15)                /* FPER    = 0 */
     ),
     MCBSP_MCR1_DEFAULT,      //MCR是通道控制器
     MCBSP_MCR2_DEFAULT,
     MCBSP_PCR_RMK(
       MCBSP_PCR_IDLEEN_RESET,                 /* IDLEEN   = 0   The McBSP remains active when the PERIPH domain is idled */
       MCBSP_PCR_XIOEN_SP,                     /* XIOEN    = 0   Transmit I/O enable bit, CLKX,FSX,DX,CLKS pins are serial port pins*/
       MCBSP_PCR_RIOEN_SP,                     /* RIOEN    = 0   Receive I/O enable bit, CLKR,FSR,DR,CLKS pins are serial port pins*/
       MCBSP_PCR_FSXM_INTERNAL,                /* FSXM     = 1   发送帧同步模式:1为由MCBSP提供*/
       MCBSP_PCR_FSRM_EXTERNAL,                /* FSRM     = 0   接收帧同步模式:0为FSR引脚提供*/
       MCBSP_PCR_CLKXM_OUTPUT,                 /* CLKXM    = 1   Transmit clock mode bit*/
       MCBSP_PCR_CLKRM_INPUT,                  /* CLKRM    = 0   Receive clock mode bit*/
       MCBSP_PCR_SCLKME_NO,                    /* SCLKME   = 0   Sample rate generator input clock mode bit,used with CLKSM to select the input clock*/
       0,                                      /* DXSTAT = N/A   */
       MCBSP_PCR_FSXP_ACTIVEHIGH,              /* FSXP     = 0   Transmit frame-sync polarity bit, 0,transmit frame-sync pulses are active high*/
       MCBSP_PCR_FSRP_ACTIVEHIGH,              /* FSRP     = 0   Receive frame-sync polarity bit, 0,receive frame-sync pulses are active high*/
       MCBSP_PCR_CLKXP_RISING,                 /* CLKXP    = 0   Transmit clock polarity bit,1,transmit data is driven on the rising edge of CLKX*/
       MCBSP_PCR_CLKRP_FALLING                 /* CLKRP    = 0   Receive clock polarity bit*/
     ),
     MCBSP_RCERA_DEFAULT,      //通道使能寄存器
     MCBSP_RCERB_DEFAULT,
     MCBSP_RCERC_DEFAULT,
     MCBSP_RCERD_DEFAULT,
     MCBSP_RCERE_DEFAULT,
     MCBSP_RCERF_DEFAULT,
     MCBSP_RCERG_DEFAULT,
     MCBSP_RCERH_DEFAULT,
     MCBSP_XCERA_DEFAULT,
     MCBSP_XCERB_DEFAULT,
     MCBSP_XCERC_DEFAULT,
     MCBSP_XCERD_DEFAULT,
     MCBSP_XCERE_DEFAULT,
     MCBSP_XCERF_DEFAULT,
     MCBSP_XCERG_DEFAULT,
     MCBSP_XCERH_DEFAULT
    };
    /* Create DMA Receive Side Configuration */
    DMA_Config  dmaRcvConfig = {
      DMA_DMACSDP_RMK(
        DMA_DMACSDP_DSTBEN_NOBURST,    //Destination burst :-不使用突发
        DMA_DMACSDP_DSTPACK_OFF,    //Destination packing :-目标口禁止打包
        DMA_DMACSDP_DST_DARAM,     //Destination selection :-接收的目标口是DARAM
     //00 SARAM;01 DARAM;10 EMIF;11 PERIPH
        DMA_DMACSDP_SRCBEN_NOBURST,    //Source burst :-源突发禁止
        DMA_DMACSDP_SRCPACK_OFF,    //Source packing :-源口禁止打包
        DMA_DMACSDP_SRC_PERIPH,     //Source selection :-外设mcbsp
        DMA_DMACSDP_DATATYPE_16BIT     //Data type :-设置数据类型16bit字长
      ),                                       /* DMACSDP  */
      DMA_DMACCR_RMK(
        DMA_DMACCR_DSTAMODE_POSTINC,   //Destination address mode :-自动执行后增量(由于本程序中数据类型是16bit,所以+2)
        DMA_DMACCR_SRCAMODE_CONST,    //Source address mode :-源地址为恒定地址
        DMA_DMACCR_ENDPROG_ON,     //End of programmation bit :-
        DMA_DMACCR_REPEAT_OFF,     //Repeat condition :(AUTOINIT=1)才有效?-0 管编程配置结束位 1 不管编程配置结束位,结束传输自动初始化开始
               //0:Repeat only if ENDPROG = 1(AUTOINIT=1)
        DMA_DMACCR_AUTOINIT_OFF,    //Auto initialization bit :-
        DMA_DMACCR_EN_STOP,      //Channel enable :-设置时先关闭通道
        DMA_DMACCR_PRIO_LOW,     //Channel priority :-设置为低优先级
        DMA_DMACCR_FS_DISABLE,     //(FS_ELEMENT 单元事件同步)
        DMA_DMACCR_SYNC_REVT1     //Synchronization control bits
      ),                                       /* DMACCR   */
      DMA_DMACICR_RMK(
        DMA_DMACICR_BLOCKIE_OFF,    //Whole block interrupt enable :-块传输完成后中断不使能
        DMA_DMACICR_LASTIE_OFF,     //Last frame interrupt enable :-
        DMA_DMACICR_FRAMEIE_ON,     //Whole frame interrupt enable :-帧传输完成后中断使能
        DMA_DMACICR_FIRSTHALFIE_OFF,   //Half frame interrupt enable :-
        DMA_DMACICR_DROPIE_OFF,     //Sync. event drop interrupt enable :-
        DMA_DMACICR_TIMEOUTIE_OFF    //Time out interrupt enable :-
      ),                                       /* DMACICR  */
        (DMA_AdrPtr)(MCBSP_ADDR(DRR11)),        /* DMACSSAL 源地址低位*/
        0,                                     /* DMACSSAU 源地址高位*/
        (DMA_AdrPtr)&rcv,                      /* DMACDSAL 目的地址低位*/
        0,                                     /* DMACDSAU 目的地址高位*/
        N,                                     /* DMACEN   1帧内数据长度 N个数据一个帧*/
        1,                                     /* DMACFN   帧数大小*/
        0,                                     /* DMACFI  */
        0                                      /* DMACEI  */
      };
    /* Create DMA Transmit Side Configuration */
    DMA_Config  dmaXmtConfig = {
      DMA_DMACSDP_RMK(
        DMA_DMACSDP_DSTBEN_NOBURST,
        DMA_DMACSDP_DSTPACK_OFF,
        DMA_DMACSDP_DST_PERIPH,     //Destination selection :-外设mcbsp
        DMA_DMACSDP_SRCBEN_NOBURST,
        DMA_DMACSDP_SRCPACK_OFF,
        DMA_DMACSDP_SRC_DARAM,     //Source selection :DARAM
        DMA_DMACSDP_DATATYPE_16BIT
      ),                                       /* DMACSDP  */
      DMA_DMACCR_RMK(
        DMA_DMACCR_DSTAMODE_CONST,    //Destination address mode :-恒定地址
        DMA_DMACCR_SRCAMODE_POSTINC,   //Source address mode :-自动执行后增量(由于本程序中数据类型是16bit,所以+2
        DMA_DMACCR_ENDPROG_ON,
        DMA_DMACCR_REPEAT_OFF,
        DMA_DMACCR_AUTOINIT_OFF,
        DMA_DMACCR_EN_STOP,
        DMA_DMACCR_PRIO_LOW,
        DMA_DMACCR_FS_DISABLE,
        DMA_DMACCR_SYNC_XEVT1     //Synchronization control bits
      ),                                       /* DMACCR   */
      DMA_DMACICR_RMK(
        DMA_DMACICR_BLOCKIE_OFF,
        DMA_DMACICR_LASTIE_OFF,
        DMA_DMACICR_FRAMEIE_ON,
        DMA_DMACICR_FIRSTHALFIE_OFF,
        DMA_DMACICR_DROPIE_OFF,
        DMA_DMACICR_TIMEOUTIE_OFF
      ),                                       /* DMACICR  */
        (DMA_AdrPtr)&xmt[1],                   /* DMACSSAL */
        0,                                     /* DMACSSAU */
        (DMA_AdrPtr)(MCBSP_ADDR(DXR11)),       /* DMACDSAL */
        0,                                     /* DMACDSAU */
        N,                                     /* DMACEN   */
        1,                                     /* DMACFN   */
        0,                                     /* DMACFI   */
        0                                      /* DMACEI   */
    };
    /* Define a DMA_Handle object to be used with DMA_open function */
    DMA_Handle hDmaRcv, hDmaXmt;
    /* Define a MCBSP_Handle object to be used with MCBSP_open function */
    MCBSP_Handle hMcbsp;
    volatile Uint16 transferComplete = FALSE;
    Uint16 err = 0;
    Uint16 old_intm;
    Uint16 xmtEventId, rcvEventId;
    //---------Function prototypes---------
    /* Reference start of interrupt vector table   */
    /* This symbol is defined in file, vectors.s55 */
    extern void VECSTART(void);
    /* Protoype for interrupt functions */
    interrupt void dmaXmtIsr(void);
    interrupt void dmaRcvIsr(void);
    void taskFxn(void);
    //---------main routine---------
    void main(void)
    {
        Uint16 i;
        /* Initialize CSL library - This is REQUIRED !!! */
        CSL_init();
        /* Set IVPD/IVPH to start of interrupt vector table */
        IRQ_setVecs((Uint32)(&VECSTART));
        for (i = 0; i <= N - 1; i++) {
            xmt[i] =  i + 1;
            rcv[i] = 0;
        }
        printf ("\nMMC Single block read-write test\n");
        for (count=0;count<=256;count++){
            datasend[count]    = count;
            datareceive[count] = 0xFFFF;
        }
        /* A detailed explanation of MMC initialization is provided in mmc_setup example */
        mmc0 = MMC_open(MMC_DEV1);
        MMC_setupNative(mmc0,&Init);
        MMC_sendGoIdle(mmc0);
        for (count=0;count<4016;count++)
         asm(" NOP");
        cardtype = MMC_sendOpCond(mmc0,0x00100000);
        if (cardtype == MMC_CARD){
           cid = &cardid;
           MMC_sendAllCID(mmc0,cid); // get the CID structure for all cards.
           rca = 10;
           card = &cardalloc;
           retVal = MMC_setRca(mmc0,card,rca);
        } else {
           cid = &cardid;
           SD_sendAllCID(mmc0,cid); // get the CID structure for all cards.
           card = &cardalloc;
           rca = SD_sendRca(mmc0,card);
           printf ("RCA sent by the SD card is 0x%x\n", rca);
        }
        /* Select the card to transfer data to/from. This step puts the card into the *
         * transfer state where it is ready to read/write data                        */
        retVal = MMC_selectCard(mmc0,card);
        printf ("Reading data from card...\n");
        retVal = MMC_read(mmc0,0x219a00,datareceive,512);
        for (count = 0; count < 6000; ++count);
        printf ("TEST PASSED\n");
        /* Call function to effect transfer */
        taskFxn();
    }
    void taskFxn(void)
    {
        Uint16 srcAddrHi, srcAddrLo;
        Uint16 dstAddrHi, dstAddrLo;
        Uint16 i;
        /* By default, the TMS320C55xx compiler assigns all data symbols word */
        /* addresses. The DMA however, expects all addresses to be byte       */
        /* addresses. Therefore, we must shift the address by 2 in order to   */
        /* change the word address to a byte address for the DMA transfer.    */
        srcAddrHi = (Uint16)(((Uint32)(MCBSP_ADDR(DRR11))) >> 15) & 0xFFFFu;
        srcAddrLo = (Uint16)(((Uint32)(MCBSP_ADDR(DRR11))) << 1) & 0xFFFFu;
        dstAddrHi = (Uint16)(((Uint32)(&rcv)) >> 15) & 0xFFFFu;
        dstAddrLo = (Uint16)(((Uint32)(&rcv)) << 1) & 0xFFFFu;
        dmaRcvConfig.dmacssal = (DMA_AdrPtr)srcAddrLo;
        dmaRcvConfig.dmacssau = srcAddrHi;
        dmaRcvConfig.dmacdsal = (DMA_AdrPtr)dstAddrLo;
        dmaRcvConfig.dmacdsau = dstAddrHi;
        srcAddrHi = (Uint16)(((Uint32)(&xmt[0])) >> 15) & 0xFFFFu;
        srcAddrLo = (Uint16)(((Uint32)(&xmt[0])) << 1) & 0xFFFFu;
        dstAddrHi = (Uint16)(((Uint32)(MCBSP_ADDR(DXR11))) >> 15) & 0xFFFFu;
        dstAddrLo = (Uint16)(((Uint32)(MCBSP_ADDR(DXR11))) << 1) & 0xFFFFu;
        dmaXmtConfig.dmacssal = (DMA_AdrPtr)srcAddrLo;
        dmaXmtConfig.dmacssau = srcAddrHi;
        dmaXmtConfig.dmacdsal = (DMA_AdrPtr)dstAddrLo;
        dmaXmtConfig.dmacdsau = dstAddrHi;
        /* Open MCBSP Port 1 and set registers to their power on defaults */
        hMcbsp = MCBSP_open(MCBSP_PORT1, MCBSP_OPEN_RESET);
        /* Open DMA channels 4 & 5 and set regs to power on defaults */
        hDmaRcv = DMA_open(DMA_CHA4,DMA_OPEN_RESET);
        hDmaXmt = DMA_open(DMA_CHA5,DMA_OPEN_RESET);
        /* Get interrupt event associated with DMA receive and transmit */
        xmtEventId = DMA_getEventId(hDmaXmt);
        rcvEventId = DMA_getEventId(hDmaRcv);
        /* Temporarily disable interrupts and clear any pending */
        /* interrupts for MCBSP transmit */
        old_intm = IRQ_globalDisable();
        /* Clear any pending interrupts for DMA channels */
        IRQ_clear(xmtEventId);
        IRQ_clear(rcvEventId);
        /* Enable DMA interrupt in IER register */
        IRQ_enable(xmtEventId);
        IRQ_enable(rcvEventId);
        /* Set Start Of Interrupt Vector Table */
        IRQ_setVecs(0x10000);
        /* Place DMA interrupt service addresses at associate vector */
        IRQ_plug(xmtEventId,&dmaXmtIsr);
        IRQ_plug(rcvEventId,&dmaRcvIsr);
        /* Write values from configuration structure to MCBSP control regs */
        MCBSP_config(hMcbsp, &ConfigLoopBack16);
        /* Write values from configuration structure to DMA control regs */
        DMA_config(hDmaRcv,&dmaRcvConfig);
        DMA_config(hDmaXmt,&dmaXmtConfig);
    #if 0
        /* Take MCBSP transmit and receive out of reset */
        MCBSP_start(hMcbsp,
                    MCBSP_XMIT_START | MCBSP_RCV_START,
                    0u);
        /* Prime MCBSP DXR */
        while (!(MCBSP_xrdy(hMcbsp))){
          ;
        }
        MCBSP_write16(hMcbsp,xmt[0]);
       /* Enable all maskable interrupts */
        IRQ_globalEnable();
        /* Enable DMA */
        DMA_start(hDmaRcv);
        DMA_start(hDmaXmt);
        /* Start Sample Rate Generator and Enable Frame Sync */
        MCBSP_start(hMcbsp,
                    MCBSP_SRGR_START | MCBSP_SRGR_FRAMESYNC,
                    0x300u);
    #else
     /* Enable all maskable interrupts */
        IRQ_globalEnable();
        /* Start Sample Rate Generator and Enable Frame Sync */
        MCBSP_start(hMcbsp,
                    MCBSP_SRGR_START | MCBSP_SRGR_FRAMESYNC,
                    0x300u);
        /* Enable DMA */
        DMA_start(hDmaRcv);
        DMA_start(hDmaXmt);
        /* Take MCBSP transmit and receive out of reset */
        MCBSP_start(hMcbsp,
                    MCBSP_XMIT_START | MCBSP_RCV_START,
                    0u);
    #endif
        /* Wait for DMA transfer to be complete */
        while (!transferComplete){
            ;
        }
        /*------------------------------------------*\
         * Compare values
        \*------------------------------------------*/
        for(i = 0; i <= N - 1; i++){
            if (rcv[i] != xmt[i]){
                ++err;
                break;
           }
        }
        printf ("%s\n",err?"TEST FAILED" : "TEST PASSED");
        /* Restore status of global interrupt enable flag */
        IRQ_globalRestore(old_intm);
        /* We're done with MCBSP and DMA , so close them */
        MCBSP_close(hMcbsp);
        DMA_close(hDmaRcv);
        DMA_close(hDmaXmt);
    }
    interrupt void dmaXmtIsr(void) {
       DMA_stop(hDmaXmt);
       IRQ_disable(xmtEventId);
    }
    interrupt void dmaRcvIsr(void) {
       DMA_stop(hDmaRcv);
       IRQ_disable(rcvEventId);
       transferComplete = TRUE;
    }
  • 感谢您的回答,还有我想问下retVal = MMC_read(mmc0,0x219a00,datareceive,512);这句读取SD的程序,我如何更改DMA和MCBSP的设置?我看了下关于MCBSP读SD卡的说明,貌似还要发命令什么的,我上一条回复贴上了我的代码,但是提示说需要等待版主通过才行

  • 我想你是误会我的意思了。

    我是让你把mcbsp+DMA的例程改成MMC+DMA。McBSP和MMC/SD是两个独立的口,没有关于MCBSP读SD卡的说法。

    建议你先看一下mcbsp+DMA的配置流程,再把mcbsp口替换成MMC/SD口的配置。