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.

C5416 中如何设置 使程序从片内SARAM开始运行?

Other Parts Discussed in Thread: CCSTUDIO

你好,我遇到了与之前一位相同的问题,我也是想从0x28000载入程序。并且我的PMST=0x00A8。请问问题出在哪儿了?关于.gel文件中,我也找到了关于0x28000的描述。在option->memory map中, 0x28000也是可用的地址。可是在load program时会出现“data verification failed at address 0x28000, Please verify target memory and memory map”. 因为之前那个帖子的解决方法和PMST中的MC/MP位有关,我在load之前看了下CPU REGISTER中的该位为1,是.gel文件设置的,然后我在CCS中更改该位为0之后(view->registers->CPU register->PMST直接修改),程序可以load, 可是运行的却不知道是什么(无法实现原本我自己的程序)。请问这是为什么?(此外,为什么我修改了.gel文件后,在CCS中 GEL->...操作之后,并没有相应的变化?例如我将c5416.gel中的PMST_VAL从0xFFE8改为0xFFA8,然后保存,CCS->GEL->reset CPU,然后view->registers->CPU register观察PMST依然是0xFFE8)

以下是我的CMD文件:

Test_AIC23.obj
-m Test_AIC23.map
-l rts.lib
-stack 0x80

MEMORY
{
   PAGE 0:  VECT:    origin =  0080h, length = 0080h          
            SARAM1:  origin =  28000h, length = 8000h

   PAGE 1:  DARAM11: origin =  0100h, length = 1F00h
            DARAM12: origin =  2000h, length = 6000h
            DARAM21: origin =  8000h, length = 4000h
            DARAM22: origin =  0C000h, length = 4000h
}          

SECTIONS
{  
   .vect   > VECT PAGE 0
   .text   > SARAM1 PAGE 0
   .cinit  > SARAM1 PAGE 0
   .switch > SARAM1 PAGE 0

   .data   > DARAM11 PAGE 1
   .const  > DARAM11 PAGE 1
   .bss    > DARAM11 PAGE 1
   .sysmem > DARAM11 PAGE 1
   .stack  > DARAM11 PAGE 1    

   .src    > DARAM21 PAGE 1
   .embuf  > DARAM22 PAGE 1
   .frame  > DARAM12 PAGE 1
   
}

  • 你好,

    试试修改GEL文件保存后, reload一下GEL文件。

  • 可以了,可以加载程序,可是无法正常运行。。好像从c_int00没有运行到main,请问是哪儿出错了?

  • 你好,

    我随便写了一个很简单的程序:

    #include <stdio.h>
    #include "cpu_reg.h"
    
    //#pragma CODE_SECTION(main,".text")
    void delay()
    {
    	int i;
    	for (i = 0; i < 1000; i++);
    }
    
    void main()
    {    
    	 asm("  STM #0000h,CLKMD ");  
         while(*CLKMD & 0x01 );
         asm("  STM #40C7h,CLKMD ");  //设置CPU运行频率=100M
         asm("  stm   #4240h, SWWSR ");
         //2 wait except for on-chip program 1
         asm("  stm   #0FFA0h, PMST  "); //MP/MC = 0, IPTR = 001,ovly=0  
         asm("  stm   #0802h, BSCR  "); 
         asm("  SSBX  INTM ");      /*禁止中断*/ 
    //////////////////////////////////////////////////////////////
    	 printf("123\n");
    }

    以下是CMD文件:

    -heap 400
    -stack 400
    MEMORY  {
    	PAGE 0:
    		RESEVE:   org   00h    len = 0x80 
     	PAGE 0:
    		PROG1:    org = 0x28000    len = 0x4000
    	PAGE 0:
    	    VECT:     org = 0x0FF80,  len = 0x80
    
    	PAGE 1:
    		RESEVE1:   org   00h   len = 0x1300 			
    	PAGE 1:
    		DARAM2:   org = 0x1300   len = 0x400
    	PAGE 1:
            DARAM1:   org = 0x1700   len = 0x2900
    
        
    }                  
    
    SECTIONS{
    
            .text :  >       PROG1   PAGE 0
            .cinit : >       PROG1   PAGE 0
            .switch: >       PROG1   PAGE 0
            .vectors:>       VECT    PAGE 0
            
            .const:  >       DARAM1   PAGE 1
            .bss  :  >       DARAM1   PAGE 1
    		.cio   :>        DARAM1   PAGE 1
    		 
            .stack : >       DARAM2   PAGE 1
            .system: >       DARAM2   PAGE 1
            .data :  >       DARAM2   PAGE 1 
                        
            }

    调用了rts.lib。并且在gel文件中设置了PMST=0xFFA8。

    编译成功,加载成功,可是运行之后却不知道运行了什么内容。我单步汇编调试过,发现可以进入main,并且看到相应的寄存器的改变,可是无法输出123,程序也无法停止。PC会继续增加。请问问题出在哪儿了?谢谢!

  • 请调用rts_ext.lib

    到CCS->Project->Build Options->Compiler->Advanced->-mf

  • 可以了,谢谢!!

  • 你好,

    我在另外几个程序中按照这个方法可以成功运行。可是在我的一个程序里(用到了rts_EXT.lib;csl5416.lib;54xdsp.lib),好像是csl5416库出问题了,产生的编译warning是:E:\softwares\CCStudio_v3.3\C5400\csl\lib\csl5416.lib: warning:  linking incompatible formats: file compiled without -mf

    然后,我将csl5416.lib换成csl5416x.lib,可以编译和load,可是运行却不对,运行到中断部分就无法进行了。以下给出了这个程序的两个版本,第一个是使用nearcall,程序在DARAM1~4中的;第二个是使用farcall,程序在SARAM1~4中的。其中第一个程序可以正常运行,第二个无法正常运行。

    程序1 (NEAR CALL):

    #pragma DATA_SECTION(SRC, ".src")
    #pragma DATA_SECTION(EMBUF, ".embuf")
    ///////////////////////////////////////////////////////////
    
    #include "type.h"
    #include "codec.h"
    #include <csl.h>
    #include <stdio.h>
    #include <csl_mcbsp.h>
    #include <csl_irq.h>
    #include <csl_dma.h>
    #include <dsplib.h>
    
    /////////////////////////////////////////////////////////////////////
    
    unsigned int *pmem=0;
    #define IMR    *(pmem+0x0000)
    #define IFR    *(pmem+0x0001)
    #define PMST   *(pmem+0x001d)
    #define SWCR   *(pmem+0x002b)
    #define SWWSR  *(pmem+0x0028)
    #define CLKMD  *(pmem+0x0058)
    #define ST1    *(pmem+0x007)
    #define PRD0   *(pmem+0x0025)  /* timer0 period register */
    #define TCR0   *(pmem+0x0026)  /* timer0 control register */
    #define XPC    *(pmem+0x001e)
    
    #define LENGTH   16000
    #define WLEN     256
    #define INC      200
    #define FN      (LENGTH - WLEN)/INC + 1//124
    #define MAXSEGMENT  10 //语音段最多10段
    
    ////////////////////////////////////////////////////////////////
    
    DMA_Handle   hDMA4, hDMA5;
    MCBSP_Handle hMCBSP0,hMCBSP1;
    Uint16 cha4EventId;
    
    ////////////////////////////////////////////////////////////////////
    ioport    unsigned portE000; //数码显示地址
    ioport    unsigned portE400; //数码显示地址
    ioport    unsigned port8000;
    
    unsigned char  oLD[16]=
    		{	
    			0x81,
    			0xeb,
    			0xa4,
    			0x94,
    			0xd2,
    			0x98,
    			0x88,
    			0xd5,
    			0x80,
    			0x90,
    			0xc0,
    			0x8a,
    			0xa9,
    			0x84,
    			0xa8,	
    			0xe8		
    			
    		};	
    
    int SRC[LENGTH];
    int EMBUF[LENGTH];
    
    int ms=0;
    /////////////////////////////////////////////////////////////////////
    
    
    interrupt void dmacha4Isr();
    interrupt void my_int1();
    interrupt void  timer0();
    
    
    
    MCBSP_Config MCBSP0_Config=
    {
         0x4000,  /*  SPCR1  
    	            Left justify
    				非CLKSTP MODE,不知为什么CLKSTP MODE 会发出很大噪声 
    	            DXEN为0,由于是SLAVE,不可以有delay*/
    	
    	 0x0000,    /*  SPCR2  (0200)*/
    
    	 0x0040, /*  RCR1 
    	             每帧接收1个16bit字 */
    
    	 0x0001,  /*  RCR2 
    	              无压缩,接收延时1-bit,接收帧不忽略 */
    
    	 0x0040, /*  XCR1 
    	             每帧发送1个16bit字 */
    
    	 0x0001,  /*  XCR2 
    	              无压缩,发送延时1-bit,发送帧不忽略 */
    	            
    	 0x0001,  /*  SRGR1
    	             在SLVAE MODE下:The sample rate generator should be
                                     programmed to its maximum rate of half the CPU clock rate. The internal sample
                                     rate clock is then used to synchronize the McBSP logic to the external master
                                     clock and slave-enable signals(帧同步信号).
                                     以上这段只使用于CLKSTP MODE下,此时采样率发生器用于接收外部master的信号帧,
                                     然后启动时钟接收,开始接收外部的时钟信号;而当不工作在CLKSTP MODE下时,采样
                                     率发生器不起作用。 */
    	 0x2000,/*  SRGR2  */ 
    	 0x0000,/*  MCR1  */
    	 0x0000,/*  MCR2  */
    
    	 0x0003,/*  PCR
    	             FSXM=0(external)
    				 FSRM=0
    				 CLKXM=0
    				 CLKRM=0
    
    	             FSXP=0(=FSRP)(同步帧高有效)
    	             CLKXP=1(时钟下降沿输出)
    	             CLKRP=1(时钟上升沿输入) 
    	             否则如果在同一时间输入输出的话会有噪声,可能是串扰之类的吧*/
    	 0x0000,
    	 0x0000,
         0x0000,
    	 0x0000,
    	 0x0000,
    	 0x0000,
    	 0x0000,
    	 0x0000,
    	 0x0000,
    	 0x0000,
    	 0x0000,
    	 0x0000,
    	 0x0000,
    	 0x0000,
    	 0x0000,
    	 0x0000
    };
    
    MCBSP_Config MCBSP1_Config=
    {
     	 0x1000, 
    	 0x0000,
    	 0x40,
    	 0x01,
    	 0x040,
    	 0x01,
    	 0x01,
    	 0x2000,
    	 0x0000,
    	 0x0000,
    	 0x0A0A,//!!
    	 0x0000,
    	 0x0000,
         0x0000,
         0x0000,
    	 0x0000,
    	 0x0000,
    	 0x0000,
    	 0x0000,
    	 0x0000,
    	 0x0000,
    	 0x0000,
    	 0x0000,
    	 0x0000,
    	 0x0000,
    	 0x0000,
    	 0x0000
    };
    
    DMA_Config  DMA4_Config = {
      0,                                /* Priority */
      0,                                /* Autoix   */ 
      DMA_DMMCR_RMK(
        DMA_DMMCR_AUTOINIT_OFF,
        DMA_DMMCR_DINM_ON,
        DMA_DMMCR_IMOD_FULL_ONLY,
        DMA_DMMCR_CTMOD_MULTIFRAME,
        DMA_DMMCR_SLAXS_OFF,
        DMA_DMMCR_SIND_NOMOD,
        DMA_DMMCR_DMS_DATA,
        DMA_DMMCR_DLAXS_OFF,
        DMA_DMMCR_DIND_POSTINC,
        DMA_DMMCR_DMD_DATA
       ),                               /* DMMCR */
       DMA_DMSFC_RMK(
         DMA_DMSFC_DSYN_REVT0,
         DMA_DMSFC_DBLW_OFF,
         DMA_DMSFC_FRAMECNT_OF(0)
       ),                               /* DMSFC */
       (DMA_AdrPtr) MCBSP_ADDR(DRR10),   /* DMSRC */
       (DMA_AdrPtr) &SRC[1],          /* DMDST */
       (Uint16)(LENGTH-2),                     /* DMCTR */
       0,                               /* DMGSA */
       0,                               /* DMGDA */
       0,                               /* DMGCR */
       0                                /* DMGFR */
    };
    
    DMA_Config  DMA5_Config = {
      0,                                /* Priority */
      0,                                /* Autoix   */ 
      DMA_DMMCR_RMK(
        DMA_DMMCR_AUTOINIT_OFF,
        DMA_DMMCR_DINM_OFF,
        DMA_DMMCR_IMOD_FULL_ONLY,
        DMA_DMMCR_CTMOD_MULTIFRAME,
        DMA_DMMCR_SLAXS_OFF,
        DMA_DMMCR_SIND_POSTINC,
        DMA_DMMCR_DMS_DATA,
        DMA_DMMCR_DLAXS_OFF,
        DMA_DMMCR_DIND_NOMOD,
        DMA_DMMCR_DMD_DATA
       ),                               /* DMMCR */
       DMA_DMSFC_RMK(
         DMA_DMSFC_DSYN_XEVT0,
         DMA_DMSFC_DBLW_OFF,
         DMA_DMSFC_FRAMECNT_OF(0)
       ),                               /* DMSFC */
       (DMA_AdrPtr) &SRC[1],   /* DMSRC */
       (DMA_AdrPtr) MCBSP_ADDR(DXR10),          /* DMDST */
       (Uint16)(LENGTH-2),                     /* DMCTR */
       0,                               /* DMGSA */
       0,                               /* DMGDA */
       0,                               /* DMGCR */
       0                                /* DMGFR */
    };
    ////////////////////////////////////////////////////////////////
    
     
    
    //================================================================
    ////////////////////////////////////////////////////////////////////
    void cpu_init()                       /*初始化DSP*/
    {
       asm(" ssbx intm");
       asm(" ssbx xf ");                  //总清零
       PMST=0x00A8;                       //IPTR == 001,DROM=1,MC,OVLY=1
       SWWSR=0x4240;//7fff
       SWCR=0x0000;//1
       asm("  stm   #0802h, BSCR  "); 
       IMR=0x000A;    //INT1, TINT
       IFR=0xffff; 
    
       portE000=0x01;
       asm("  SSBX  XF ");
       
       asm("  STM #0000h,CLKMD ");  //因为要设置PLL的倍频必须先从PLL->div->PLL.因此有以下3行操作
       while(CLKMD & 0x01 );       //PLL->DIV  观察PLL STATUS位是否从1变为0了。变0就说明已经变为DIV mode
       asm("  STM #40c7h,CLKMD ");  //设置CPU运行频率=100M ,并且DIV->PLL(只需设置PLL COUNT即可)
    
       asm("  STM #0010h,TCR  "); //关定时器
       asm("  STM #0186ah,PRD  ");//6250+1
       asm("  STM #0C3fh,TCR  "); //TCR=最后四位:15+1 ,使CLKOUT/((PRD+1)*(TDDR+1))=TINT rate=1009.8Hz
    
       asm(" rsbx intm");  
    }
    
    //////////////////////////////////////////////////////////////////////////
    void main()
    {   
    	MCBSP_Handle set_codec(MCBSP_Handle);//declare
    
        cpu_init();
        IRQ_globalDisable();
        CSL_init();
    
    	hMCBSP0 = MCBSP_open(MCBSP_PORT0,MCBSP_OPEN_RESET);
    	hMCBSP1 = MCBSP_open(MCBSP_PORT1,MCBSP_OPEN_RESET); 
        
    	MCBSP_config(hMCBSP0,&MCBSP0_Config);
    	MCBSP_config(hMCBSP1,&MCBSP1_Config);
        
    //启动MCBSP1,对codec芯片配置
        MCBSP_start(hMCBSP1,MCBSP_RCV_START|MCBSP_XMIT_START,0);
    	while(!(MCBSP_xrdy(hMCBSP1)));
        MCBSP_write16(hMCBSP1,0x1234);   
        MCBSP_start(hMCBSP1,MCBSP_SRGR_START|MCBSP_SRGR_FRAMESYNC,0x200); 
    	set_codec(hMCBSP1);
    
    
    
    //打开并配置DMA4
        hDMA4=DMA_open(DMA_CHA4,DMA_OPEN_RESET);
        DMA_config(hDMA4,&DMA4_Config);
        cha4EventId=DMA_getEventId(hDMA4);
    
        DMA_FSET(DMPREC,INTOSEL,00);
        
        IRQ_disable(cha4EventId);
    	IRQ_clear(cha4EventId);
    	IRQ_plug(cha4EventId,&dmacha4Isr);
    	IRQ_enable(cha4EventId);
    
    //启动MCBSP0
        MCBSP_start(hMCBSP0,MCBSP_RCV_START|MCBSP_XMIT_START,0);
    //开全局中断;
        IRQ_globalEnable();
    
    //创建并配置DMA5
        hDMA5=DMA_open(DMA_CHA5,DMA_OPEN_RESET);
        DMA_config(hDMA5,&DMA5_Config);
    	
    
    //main
    
    	while(1);
    
    }
    
    
    ///////////////////////////////////////////////////////////////////////////////
    
    interrupt void  timer0()
    {
    	ms++;
    	if (ms < 1000)
    		portE400=oLD[3];
    	else if (ms < 2000)
    		portE400=oLD[2];
    	else if (ms < 3000)
    		portE400=oLD[1];
    	else if (ms < 4000)
    		portE400=oLD[0];
    	else if (ms < 5000)
    		portE400=oLD[1];
    	else if (ms >= 5000)
    		portE400=oLD[2];
    	
    	if (ms == 3000)
    	{
    	DMA_start(hDMA4);	
    	SRC[0] = MCBSP_read16(hMCBSP0);
    	}		
    }
    ///////////////////////////////////////////////////////////////////////////////
    void delay()
    {
    	int i, j;
    
    	for (i = 0; i<100; i++)
    		for (j = 0; j < 20000; j++);
    }
    /////////////////////////////////////////////////////////////////////////////////
    interrupt void my_int1()
    { 
    		delay();
    		if ((IFR & (0x02)) == 0)
    		{
    		TCR0 = (TCR0 & 0xFFEF); //开定时器			
    		}
    }
    
    
    interrupt void dmacha4Isr(void)
    {
    
    			//DMA_start(hDMA5);
    			//MCBSP_write16(hMCBSP0, SRC[0]);
    
    	DMA_close(hDMA4);//接收完毕,关闭DMA4,接收到的数据在SRC数组里。
    
    	preempha();//预加重
    }
    
    
    ////////////////////////////////////////////////////////////////////////////
    preempha(void)
    {
    	 float a = -0.9375;
         int i;
         
         for (i = 1; i < LENGTH; i++)
             EMBUF[i] = SRC[i] + a * SRC[i-1];	
    }
    ////////////////////////////////////////////////////////////////////////////
    
    
    
    ///////////////////////////////////////////////////////////////////////////
    //set_codec 函数的定义
    ////////////////////////////////////////////////////////////////////////////
    MCBSP_Handle set_codec(MCBSP_Handle hMcbsp)
    	 { 
    	    codec_reset(hMcbsp);
    	  /*设置Line input channel volume control,设置增益0DB
    	                                          左右声道同步*/
    	 	if(codec_lineain_gain(hMcbsp, 0x117)== ERROR)
    	  	{
    	  		return (MCBSP_Handle) ERROR;
    	  	}	
    	   
    	  /*设置耳机输出,输出增益 0DB 无过零检测 ,左右声道同步*/
    	  if(codec_headhponeout_gain(hMcbsp, 0x179)== ERROR)
    	  {
    	  		return (MCBSP_Handle) ERROR;
    	  }
    	  /*设置模拟部分的运行模式:侧音关闭
    	                            输入选择LINE
    	  							DAC开
    	  							bypass关
    	  							MIC输入0DB,静音方式,*/
    	  if(codec_analog_mode(hMcbsp,0x12)== ERROR)
    	  {
    	  		return (MCBSP_Handle) ERROR;
    	  }
    
    	  /*设置数字部分的运行模式:DAC softmute 关闭
    	                            de-emphasis:disable 
    	                            ADC高通瞬ㄆ?开 */
    	  if(codec_digital_mode(hMcbsp, 0x00) == ERROR)
    	  {
    	  		return (MCBSP_Handle) ERROR;
    	  }
    	  /*设置电源模式:除MICIN,其余部分均开放*/
    	  if(codec_power(hMcbsp,0x02) == ERROR)
    	  {
    	  		return (MCBSP_Handle) ERROR;
    	  }
    
    	  /*设置数据格式,CODEC工作为主方式
    	  				  数据在帧-LRCIN有效后的BCLK时钟的第二个上升沿有效
    	  				  为16位
    	  				  接口方式为DSP方式送2个字)*/
    	  if(codec_digital_format(hMcbsp,0x73) == ERROR)
    	  {
    	  		return (MCBSP_Handle) ERROR;
    	  }
    
    	  /*设置波特率,输入与输鼍?6K---------0x1D         88.2K--------0x3E
    	                             44.1K-------0x23         44.1K--------0x22
    								 32K---------0x19         8.021K-------0x2E
    	                             8.021K------0x2F
    	                             8K----------0x0D
    	                             USB MODE                NORMAL MODE*/ 
    	  if(codec_sample_rate(hMcbsp,0x2E) == ERROR)
    	  {
    	  		return (MCBSP_Handle) ERROR;
    	  }
    	  /*启疌ODEC*/
    	  if(codec_write_reg(hMcbsp,Codec_DIA,1) == ERROR)
    	  {
    			return (MCBSP_Handle) ERROR;
    	  }
    			  return  (MCBSP_Handle) OK;
    	}		
    	
    /******************************************************************************/
    /* codec_close() - 释放句柄所对应的MCBSP,并且复位对应的MCBSP		          */
    /* 参数:                                                                     */
    /*     hDevice - 已打开的有效的句柄						                      */
    /*                                                                            */
    /******************************************************************************/
    void codec_close()
    {
    	/*复位句柄相应的*/
    	//MCBSP_TX_RESET((int) hDevice);
    	//MCBSP_RX_RESET((int) hDevice);
    	MCBSP_FSET(SPCR11,RRST,1);
    	MCBSP_FSET(SPCR21,XRST,1);
    }
    /******************************************************************************/
    /*    codec_read_reg() - 读TLV320aic23B的控制寄存器		                      */
    /*参数:		                                                              */
    /*     hDevice - 对应控制接口的句柄;                					      */
    /*     reg - 指示一个在寄存器枚举列表中的一个寄存器地址					      */
    /*     regdata - 要写入的寄存器的数据*/
    /*返回值:																	  */
    /*	   要读的寄存器的值 													  */
    /*                                                                            */
    /******************************************************************************/
    int codec_write_reg(MCBSP_Handle hMcbsp, CodecReg reg,unsigned int value)
    {
    	//unsigned int output;
    	unsigned long output;	//my change
    	unsigned int timeout = 0x2000;
    	output = (reg<< 0x9) + value; 
    	/*等待数据准备好*/
        while (!MCBSP_FGET(SPCR21,XRDY) && (timeout) ) 
        {
           	timeout--;
        };
        if(timeout == 0)
        {
        	return ERROR;
        }
    	MCBSP_write16(hMcbsp, output);
    	return OK;
    }
    /******************************************************************************/
    /*    codec_linein_gain() - 控制音频输入的音量的增益		                      */
    /*参数:		                                                              */
    /*     hDevice - 对应控制接口的句柄;                					      */
    /*     gain - 输入音频通路的增益,0x0对应着-34.5DB,                         */
    /*            0x1f对应着+12DB,最小增益调整为1.5DB                           */   
    /*返回值:																	  */
    /*	   要读的寄存器的值 													  */
    /*                                                                            */
    /******************************************************************************/
    int codec_lineain_gain(MCBSP_Handle hMcbsp, unsigned int gain)
    {
    	if(codec_write_reg(hMcbsp,Codec_LLIVC,gain) == ERROR)
    	{
    		return ERROR;
    	}
    
    	return OK;
    }
    /******************************************************************************/
    /*    codec_headphoneout_gain() - 控制音频输入的音量的增益		              */
    /*参数:		                                                              */
    /*     hDevice - 对应控制接口的句柄;                					      */
    /*     gain - 输入音频通路脑鲆妫?x30对应着-73DB,                           */
    /*            0x3F对应着+6DB,在这之间共?9个步进 增益值小于0x30为无效       */   
    /*返回值:																	  */
    /*	   要读的寄存器的值 													  */
    /******************************************************************************/
    int codec_headhponeout_gain(MCBSP_Handle hMcbsp, unsigned int gain)
    {
    	if(codec_write_reg( hMcbsp,Codec_LHPVC,gain) == ERROR)
    	{
    		return ERROR;
    	}
    	    
    	return OK;
    }
    /******************************************************************************/
    /*    codec_analog_mode() - 控制音频输入的设置             		              */
    /*参数:		                                                              */
    /*     hDevice - 对应控制接口的句柄;                					      */
    /*     mode - adc的控制方式                                                   */   
    /*返回值:																	  */
    /*	   操作是否成功     													  */
    /******************************************************************************/
    int codec_analog_mode(MCBSP_Handle hMcbsp, unsigned int mode)
    {
    	if(codec_write_reg(hMcbsp,Codec_AAPC,mode) == ERROR)
    	{
    		return ERROR;
    	}
    	return OK;
    }
    /******************************************************************************/
    /*    codec_digital_mode() - 控制音频输入的设置             		              */
    /*参数:		                                                              */
    /*     hDevice - 对应控制接口的句柄;                					      */
    /*     mode - dac的控制方式                                                   */   
    /*返回值:																	  */
    /*	   操作是否成功     													  */
    /******************************************************************************/
    int codec_digital_mode(MCBSP_Handle hMcbsp, unsigned int mode)
    {
    	if(codec_write_reg(hMcbsp,Codec_DAPC,mode) == ERROR)
    	{
    		return ERROR;
    	}
    	return OK;
    }
    /******************************************************************************/
    /*    codec_sample_rate() - 控制音频的采样频率             		              */
    /*参数:		                                                              */
    /*     hDevice - 对应控制接口的句柄;                					      */
    /*     mode - sample rate的控制方式                                           */   
    /*返回值:																	  */
    /*	   操作是否成功     													  */
    /******************************************************************************/
    int codec_sample_rate(MCBSP_Handle hMcbsp, unsigned int mode)
    {
    	if(codec_write_reg(hMcbsp,Codec_SRC,mode) == ERROR)
    	{
    		return ERROR;
    	}
    	return OK;
    }
    /******************************************************************************/
    /*    codec_digital_format() - 控制音频的采样频率             		          */
    /*参数:		                                                              */
    /*     hDevice - 对应控制接口的句?               					      */
    /*     mode - sample rate的控制方式                                           */   
    /*返回值:																	  */
    /*	   操作是否成功     													  */
    /******************************************************************************/
    int codec_digital_format(MCBSP_Handle hMcbsp, unsigned int format)
    {
    	if(codec_write_reg( hMcbsp,Codec_DAIF,format) == ERROR)
    	{
    		return ERROR;
    	}
    	return OK;
    }
    /******************************************************************************/
    /*    codec_power() - 各项功能的电源开关选择						          */
    /*参数:                          		                                      */
    /*         hDevice -控制接口的句柄                                            */
    /*         ctrl - 关于各项功能省电模式的控制                                  */
    /*                                                                            */
    /******************************************************************************/
    int codec_power(MCBSP_Handle hMcbsp, unsigned int ctrl)
    {
    	if(codec_write_reg(hMcbsp,Codec_PDC,ctrl) == ERROR)
    	{
    		return ERROR;
    	}
    	return OK;
    }
    /******************************************************************************/
    /*    codec_reset() - 控制音频的复位             		              		  */
    /*参数:		                                                              */
    /*     hDevice - 对应控制接口的句柄;                					      */ 
    /*返回值:																	  */
    /*	   操作是否成功     													  */
    /******************************************************************************/
    int codec_reset(MCBSP_Handle hMcbsp)
    {
    	if(codec_write_reg(hMcbsp,Codec_RST,0) == ERROR)
    	{
    		return ERROR;
    	}
    	return OK;
    }
    //////////////////////////////////////////////////////////////////////////////

    CMD1:

    -c 
    -h
    Test_AIC23.obj
    -m Test_AIC23.map 
    -stack 0x80
    
    MEMORY
    {
       PAGE 0:  VECT:    origin =  0080h, length = 0080h  		 
    			DARAM12: origin =  2000h, length = 6000h 
    
       PAGE 1:  DARAM11: origin =  0100h, length = 1F00h 
    			DARAM21: origin =  8000h, length = 4000h
    			DARAM22: origin =  0C000h, length = 4000h
    }          
    
    SECTIONS
    {  
       .vect   > VECT PAGE 0
       .text   > DARAM12 PAGE 0
       .cinit  > DARAM12 PAGE 0
       .switch > DARAM12 PAGE 0
    
       .data   > DARAM11 PAGE 1
       .const  > DARAM11 PAGE 1
       .bss    > DARAM11 PAGE 1
       .sysmem > DARAM11 PAGE 1
       .stack  > DARAM11 PAGE 1    
    
       .src    > DARAM21 PAGE 1
       .embuf  > DARAM22 PAGE 1
       
    }

    程序2(FAR CALL ):

    与程序一相同。

    CMD2:

    -c 
    -h
    Test_AIC23.obj
    -m Test_AIC23.map 
    -stack 0x80
    
    MEMORY
    {
       PAGE 0:  VECT:    origin =  0080h, length = 0080h  		 
    			SARAM1: origin =  28000h, length = 6000h 
    
       PAGE 1:  DARAM11: origin =  0100h, length = 1F00h 
    			DARAM21: origin =  8000h, length = 4000h
    			DARAM22: origin =  0C000h, length = 4000h
    }          
    
    SECTIONS
    {  
       .vect   > VECT PAGE 0
       .text   > SARAM1 PAGE 0
       .cinit  > SARAM1 PAGE 0
       .switch > SARAM1 PAGE 0
    
       .data   > DARAM11 PAGE 1
       .const  > DARAM11 PAGE 1
       .bss    > DARAM11 PAGE 1
       .sysmem > DARAM11 PAGE 1
       .stack  > DARAM11 PAGE 1    
    
       .src    > DARAM21 PAGE 1
       .embuf  > DARAM22 PAGE 1
       
    }

    最后附上两个程序的中断表.ASM:

         	.ref  _my_int1
    		.ref  _c_int00
    		.ref  _timer0
    		
    		.sect ".vect"
    		
    rs: BD _c_int00
    	nop
    	nop
    nmi: rete 		;NMI, SINT16
        nop
    	NOP
    	NOP
    sint17: BD _c_int00 	;SINT17
    	NOP
    	NOP
    sint18: BD _c_int00 	;SINT18
    	NOP
    	NOP
    sint19: BD _c_int00 	;SINT19
    	NOP
    	NOP
    sint20: BD _c_int00 	;SINT20
    	NOP
    	NOP
    sint21: BD _c_int00 	;SINT21
    	NOP
    	NOP
    sint22: BD _c_int00 	;SINT22
    	NOP
    	NOP
    sint23: BD sint23 	;SINT23
    	NOP
    	NOP
    sint24: BD sint24 	;SINT24
    	NOP
    	NOP
    sint25: BD sint25 	;SINT25
    	NOP
    	NOP
    sint26: BD sint26 	;SINT26
    	NOP
    	NOP
    sint27: BD sint27 	;SINT27
    	NOP
    	NOP
    sint28: BD sint28 	;SINT28
    	NOP
    	NOP
    sint29: BD sint29 	;SINT29
    	NOP
    	NOP
    sint30: BD sint30 	;SINT30
    	NOP
    	NOP
    int0: BD  int0 		;INT0, SINT0
    	NOP
    	NOP
    int1: BD _my_int1 		;INT1, SINT1
    	NOP
    	NOP
    int2: BD int2 		;INT2, SINT2
    	NOP
    	NOP
    tint0: BD _timer0 	;TINT0, SINT3
    	NOP
    	NOP
    brint0: BD _c_int00 	;BRINT0, SINT4
    	NOP
    	NOP
    bxint0: BD bxint0 				;BXINT0, SINT5
    	NOP
    	NOP
    dmac0: BD dmac0 				;DMAC0, brint2, SINT6
    	NOP
    	NOP
    dmac1: BD _c_int00 				;DMAC1, bxint2, SINT7 ??
    	NOP
    	NOP
    int3: BD int3 					;INT3, SINT8
    	NOP
    	NOP
    hpint: BD _c_int00 				;HPINT, SINT9
    	NOP
    	NOP
    brint1: BD brint1 				;BRINT1 or DMAC2, SINT10
    	NOP
    	NOP
    bxint1: BD _c_int00 				;BXINT1 or DMAC3, SINT11
    	NOP
    	NOP
    dmac4: BD dmac4 				;DMAC4, SINT12
    	NOP
    	NOP
    dmac5: BD dmac5 				;DMAC5, SINT13
    	NOP
    	NOP
    rsvd1: BD rsvd1 				;reserved
    	NOP
    	NOP
    rsvd2: BD rsvd2 				;reserved
    	NOP
    	NOP

    由于是初学,所以程序可能有点冗长,混乱,请见谅。关于MCBSP与DMA的配置应该是对的,我认为问题应该是出在中断部分,或者是csl5416(x)库的选择方面。我不是很懂,请您有空帮我解答一下,万分感谢!!


                 

  • 你好,

    这个问题我已经解决了,谢谢~~

  • 怎么解决的,我也遇到同样的问题