你好,
我在另外几个程序中按照这个方法可以成功运行。可是在我的一个程序里(用到了rts_EXT.lib;csl5416.lib;54xdsp.lib),好像是csl5416库出问题了,产生的编译warning是:E:softwaresCCStudio_v3.3C5400csllibcsl5416.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 #include #include #include #include #include /////////////////////////////////////////////////////////////////////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(" s***x intm"); asm(" s***x 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(" r***x 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 = SRC + 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 -hTest_AIC23.obj-m Test_AIC23.map -stack 0x80MEMORY[ 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 -hTest_AIC23.obj-m Test_AIC23.map -stack 0x80MEMORY[ 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 nopnmi: rete ;NMI, SINT16 nop NOP NOPsint17: BD _c_int00 ;SINT17 NOP NOPsint18: BD _c_int00 ;SINT18 NOP NOPsint19: BD _c_int00 ;SINT19 NOP NOPsint20: BD _c_int00 ;SINT20 NOP NOPsint21: BD _c_int00 ;SINT21 NOP NOPsint22: BD _c_int00 ;SINT22 NOP NOPsint23: BD sint23 ;SINT23 NOP NOPsint24: BD sint24 ;SINT24 NOP NOPsint25: BD sint25 ;SINT25 NOP NOPsint26: BD sint26 ;SINT26 NOP NOPsint27: BD sint27 ;SINT27 NOP NOPsint28: BD sint28 ;SINT28 NOP NOPsint29: BD sint29 ;SINT29 NOP NOPsint30: BD sint30 ;SINT30 NOP NOPint0: BD int0 ;INT0, SINT0 NOP NOPint1: BD _my_int1 ;INT1, SINT1 NOP NOPint2: BD int2 ;INT2, SINT2 NOP NOPtint0: BD _timer0 ;TINT0, SINT3 NOP NOPbrint0: BD _c_int00 ;BRINT0, SINT4 NOP NOPbxint0: BD bxint0 ;BXINT0, SINT5 NOP NOPdmac0: BD dmac0 ;DMAC0, brint2, SINT6 NOP NOPdmac1: BD _c_int00 ;DMAC1, bxint2, SINT7 ?? NOP NOPint3: BD int3 ;INT3, SINT8 NOP NOPhpint: BD _c_int00 ;HPINT, SINT9 NOP NOPbrint1: BD brint1 ;BRINT1 or DMAC2, SINT10 NOP NOPbxint1: BD _c_int00 ;BXINT1 or DMAC3, SINT11 NOP NOPdmac4: BD dmac4 ;DMAC4, SINT12 NOP NOPdmac5: BD dmac5 ;DMAC5, SINT13 NOP NOPrsvd1: BD rsvd1 ;reserved NOP NOPrsvd2: BD rsvd2 ;reserved NOP NOP
由于是初学,所以程序可能有点冗长,混乱,请见谅。关于MCBSP与DMA的配置应该是对的,我认为问题应该是出在中断部分,或者是csl5416(x)库的选择方面。我不是很懂,请您有空帮我解答一下,万分感谢!!
|
|
|
2018-7-30 08:03:14
评论
举报
|
|
|
|