打印

5502串口和DMA问题求救

[复制链接]
3783|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
navywhj|  楼主 | 2007-9-14 15:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我是想用McBSP接收一个帧信号为8K,时钟为4.096M的2倍E1的信号。
想法是帧信号和时钟都由外部提供,每帧64个8比特数据,A-law压扩。

DMA设置为64个元素,接收/发送完64个数据产生中断。

我搞了好几天还是不行。
似乎是串口没有配置对,明明配置成一帧64个元素,用rrdy/xrdy来触发中断,结果一帧只来了一个中断,也就是说只收到一个数据,其它63个都没有了?不知道怎么回事。
我的DMA也一直工作不正常,中断只能进去一次,后面就进不去了。
现在天天找问题,头晕脑胀啊。

我的配置文件放在下面大家看看。
因为怕那个8k的时钟对不齐,所以先初始化一个由FRAME触发的中断,然后在这个中断程序里面重新初始化串口和DMA。
发现5502真是很麻烦。




/********************************************************************************/
/* 文件名:        GSBPerConfg.h                                                      */                                                
/* 创建日期:    08/06/2007                                                        */
/* 功能描述:     外设寄存器配置参数                                                */
/* Author  :   whj                                                            */
/********************************************************************************/
#ifndef _GSB_PER_CNFG
#define _GSB_PER_CNFG

#include <csl.h>
#include <csl_pll.h>
#include <csl_chip.h>
#include <csl_irq.h>
#include <csl_gpt.h>

#include <csl_chip.h>
#include <csl_mcbsp.h>
#include <csl_hpi.h>
#include <csl_dma.h>


//一帧中的时隙数
#define   TS       64


/* Define transmit and receive buffers */
#pragma DATA_SECTION(xmt,"dmaMem")
Int16 xmt[TS];

#pragma DATA_SECTION(rcv,"dmaMem")
Int16 rcv[TS];




    /*64 bit general purpose timer */
    /* Define and initialize the GPT module configuration structure  */
    GPT_Config  MyGptConfig = {
            0,                             //Emulation management register
            0,                             //GPIO interrupt control register
            0,                             //GPIO enable register
            0,                             //GPIO direction register
            0,                             //GPIO data register
            0xB9EF,                     //Timer period register 1
            0x05F5,                         //Timer period register 2
            0,                            //Timer period register 3
            0,                             //Timer period register 4
        GPT_GPTCTL1_RMK(            //Timer control register 1
            GPT_GPTCTL1_TIEN_NOT_GATED,
            GPT_GPTCTL1_CLKSRC_VBUS,
            GPT_GPTCTL1_ENAMODE_CONTINUOUS,
            GPT_GPTCTL1_PWID_INACTIVE_1CYCLE,
            GPT_GPTCTL1_CP_CLOCK_MODE,
            GPT_GPTCTL1_INVIN_DONT_INVERT_OUTPUT,
            GPT_GPTCTL1_INVOUT_DONT_INVERT_OUTPUT
          ),             
        GPT_GPTCTL2_RMK(            //Timer control register 2
            GPT_GPTCTL2_TIEN_NOT_GATED,
            GPT_GPTCTL2_CLKSRC_VBUS,
            GPT_GPTCTL2_ENAMODE_CONTINUOUS,
            GPT_GPTCTL2_PWID_INACTIVE_1CYCLE,
            GPT_GPTCTL2_CP_CLOCK_MODE,
            GPT_GPTCTL2_INVIN_DONT_INVERT_OUTPUT,
            GPT_GPTCTL2_INVOUT_DONT_INVERT_OUTPUT
          ),             
        GPT_GPTGCTL1_RMK(            //Global timer control register
            GPT_GPTGCTL1_PSC34_DEFAULT,
            GPT_GPTGCTL1_TIMMODE_DEFAULT,
            GPT_GPTGCTL1_TIM34RS_NOT_IN_RESET,
            GPT_GPTGCTL1_TIM12RS_NOT_IN_RESET
          )     
    };

/**********       McBSP Config        *****************/
    MCBSP_Config GSBMcBspConfigInit = {
            MCBSP_SPCR1_RMK(
                MCBSP_SPCR1_DLB_OFF,        /*  Digital loopback Disable */
                MCBSP_SPCR1_RJUST_RZF,      /* Right justify the data and zero fill the MSBs. */
                MCBSP_SPCR1_CLKSTP_DISABLE, /*Clock stop mode is disabled. only used in SPI protocol  */
                MCBSP_SPCR1_DXENA_OFF,      /*DX delay enabler off  */ 
                MCBSP_SPCR1_ABIS_DISABLE,   /*  */
                MCBSP_SPCR1_RINTM_FRM,     /* Receive Ready interrupt*/
                MCBSP_SPCR1_RSYNCERR_NO,    /* No error */
                MCBSP_SPCR1_RFULL_YES,      /* Read Only */
                MCBSP_SPCR1_RRDY_YES,       /* Read Only */
                MCBSP_SPCR1_RRST_ENABLE     /* Not in Reset */
                ),
            //0x01,
            MCBSP_SPCR2_RMK(
                MCBSP_SPCR2_FREE_NO,    /*The McBSP transmit and receive clocks are affected as determined by the */
                                        /*SOFT bit. */
                MCBSP_SPCR2_SOFT_YES,    /* The McBSP transmit clock stops after completion of the current
                                            serial word transfer. The McBSP receive clock is not affected.*/
                MCBSP_SPCR2_FRST_FSG,    /* 1: frame-sync logic not in Reset*/
                MCBSP_SPCR2_GRST_CLKG,   /* 1: Not in reset  */
                MCBSP_SPCR2_XINTM_XRDY,  /* interrupt is sent when each one word is tansmitted completely*/
                MCBSP_SPCR2_XSYNCERR_NO,
                MCBSP_SPCR2_XEMPTY_YES,   /*Read Only */
                MCBSP_SPCR2_XRDY_YES,     /*Read Only */
                MCBSP_SPCR2_XRST_ENABLE   /* enable transmitter  */
                ),
            MCBSP_RCR1_RMK(
                MCBSP_RCR1_RFRLEN1_OF(1),      /* 1 words per receive frame */
                MCBSP_RCR1_RWDLEN1_8BIT         /* receive word length 8 bit */
                ),
            MCBSP_RCR2_RMK(
                MCBSP_RCR2_RPHASE_SINGLE,     /*  signle phase */   
                MCBSP_RCR2_RFRLEN2_OF(0),     /* phase 2 not used */
                MCBSP_RCR2_RWDLEN2_8BIT ,     /* no meaning */
                MCBSP_RCR2_RCOMPAND_ALAW,     /*ALAW companding in reception */
                MCBSP_RCR2_RFIG_YES,          /* An unexpected FSR pulse causes the receiver to  */
                                              /* discard the contents of RSR[1,2] in favor of the new incoming data.*/
                MCBSP_RCR2_RDATDLY_1BIT       /* rcv 1 bit delay */
                ),
            MCBSP_XCR1_RMK(
                MCBSP_XCR1_XFRLEN1_OF(1),    /* Transmit frame length 1 (1 to 128 words). 64 words per frame */
                MCBSP_XCR1_XWDLEN1_8BIT         /* transmit word length1 8 bit */
                ),
            MCBSP_XCR2_RMK(
                MCBSP_XCR2_XPHASE_SINGLE,  /*  The transmit frame has only one phase, phase 1 */    
                MCBSP_XCR2_XFRLEN2_OF(0),  /* phase 2 not used */
                MCBSP_XCR2_XWDLEN2_8BIT,   /* Transmit word length 2, no used */
                MCBSP_XCR2_XCOMPAND_ALAW,  /*  ALAW companding in transmission */
                MCBSP_XCR2_XFIG_YES,       /*  Unexpected Transmit Frame-Synch Pulse */
                MCBSP_XCR2_XDATDLY_1BIT    /* xmt 1 bit delay */
                ),
            MCBSP_SRGR1_RMK(
                MCBSP_SRGR1_FWID_OF(0),    /* Frame-sync(FSG) pulse width is 1(0+1) CLKG cycles */
                MCBSP_SRGR1_CLKGDV_OF(0)   /* CLKG frequency = (Input clock frequency) / (CLKGDV + 1), CLKG equals to CLKR/CLKX */
                ),
            MCBSP_SRGR2_RMK(
                MCBSP_SRGR2_GSYNC_FREE,    /* Always write 0 to this bit on 5502,NO this function on 5502    */
                MCBSP_SRGR2_CLKSP_RISING,  /* we don't use CLKS input, don't care this bit*/
                MCBSP_SRGR2_CLKSM_CLKS,/* 0 : input clock for sample rate generator is Signal on CLKS/CLKR pin,depend on SCLKME */
                MCBSP_SRGR2_FSGM_FSG,      /* the transmitter uses frame-sync pulses generated by the sample rate generator */
                MCBSP_SRGR2_FPER_OF(511)   /* Frame-sync period is 512 CLKG cycles*/            
                ),
            MCBSP_MCR1_DEFAULT,     /* we don't use multiple channels*/
            MCBSP_MCR2_DEFAULT,
            
            MCBSP_PCR_RMK(
                0,                     /* IDLEEN, 5502 should write to 0*/
                MCBSP_PCR_XIOEN_SP,    /*The CLKX, FSX, DX, and CLKS pins are serial port pins*/
                MCBSP_PCR_RIOEN_SP,    /*The CLKR, FSR, DR, and CLKS pins are serial port pins*/
                MCBSP_PCR_FSXM_EXTERNAL, /*Transmit frame synchronization is supplied by an external source via the FSX pin.*/
                MCBSP_PCR_FSRM_EXTERNAL, /*Receive  frame synchronization is supplied by an external source via the FSR pin*/
                
                MCBSP_PCR_SCLKME_BCLK,     /*1 :The input clock for the sample rate generator is taken from the CLKR pin   */
                                           /*cause the value of the CLKSM bit of SRGR2 is 0    */
                MCBSP_PCR_CLKSSTAT_0,      /*  CLKS pin status bit. 5502 doesn't have this pin   */
                MCBSP_PCR_DXSTAT_0,        /*  DX pin status bit.   */
                MCBSP_PCR_DRSTAT_0,        /*  DR pin status bit. Not GPIO, no meaning here  */
                MCBSP_PCR_CLKXM_INPUT,     /* The transmitter gets its clock signal from an external source via the CLKX pin. */
                MCBSP_PCR_CLKRM_INPUT,     /* The transmitter gets its clock signal from an external source via the CLKR pin. */
                MCBSP_PCR_FSXP_ACTIVEHIGH,  /*  Transmit frame-sync pulses are active low.  */
                MCBSP_PCR_FSRP_ACTIVEHIGH,  /*  Receive frame-sync pulses are active low.  */
                MCBSP_PCR_CLKXP_RISING,    /*  Transmit data is driven on the rising edge of CLKX,发送上升沿   */
                MCBSP_PCR_CLKRP_FALLING    /*  When the CLKR pin is configured as an input, the external CLKR is not */
                                           /*  inverted before being used internally and the receive data is sampled on the */
                                           /*  falling edge of CLKR.  */
                ),
            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    
    };

    /**********       McBSP Config        *****************/
    MCBSP_Config GSBMcBspConfig = {
//            MCBSP_SPCR1_RMK(
//                MCBSP_SPCR1_DLB_OFF,        /*  Digital loopback Disable */
//                MCBSP_SPCR1_RJUST_RZF,      /* Right justify the data and zero fill the MSBs. */
//                MCBSP_SPCR1_CLKSTP_DISABLE, /*Clock stop mode is disabled. only used in SPI protocol  */
//                MCBSP_SPCR1_DXENA_OFF,      /*DX delay enabler off  */ 
//                MCBSP_SPCR1_ABIS_DISABLE,   /*  */
//                MCBSP_SPCR1_RINTM_RRDY,     /* Receive Ready interrupt*/
//                MCBSP_SPCR1_RSYNCERR_NO,    /* No error */
//                MCBSP_SPCR1_RFULL_YES,      /* Read Only */
//                MCBSP_SPCR1_RRDY_YES,       /* Read Only */
//                MCBSP_SPCR1_RRST_ENABLE     /* Not in Reset */
//                ),
            0x01,
            MCBSP_SPCR2_RMK(
                MCBSP_SPCR2_FREE_NO,    /*The McBSP transmit and receive clocks are affected as determined by the */
                                        /*SOFT bit. */
                MCBSP_SPCR2_SOFT_YES,    /* The McBSP transmit clock stops after completion of the current
                                            serial word transfer. The McBSP receive clock is not affected.*/
                MCBSP_SPCR2_FRST_FSG,    /* 1: frame-sync logic not in Reset*/
                MCBSP_SPCR2_GRST_CLKG,   /* 1: Not in reset  */
                MCBSP_SPCR2_XINTM_XRDY,  /* interrupt is sent when each one word is tansmitted completely*/
                MCBSP_SPCR2_XSYNCERR_NO,
                MCBSP_SPCR2_XEMPTY_YES,   /*Read Only */
                MCBSP_SPCR2_XRDY_YES,     /*Read Only */
                MCBSP_SPCR2_XRST_ENABLE   /* enable transmitter  */
                ),
            MCBSP_RCR1_RMK(
                MCBSP_RCR1_RFRLEN1_OF(TS),      /* 64 words per receive frame */
                MCBSP_RCR1_RWDLEN1_8BIT         /* receive word length 8 bit */
                ),
            MCBSP_RCR2_RMK(
                MCBSP_RCR2_RPHASE_SINGLE,     /*  signle phase */   
                MCBSP_RCR2_RFRLEN2_OF(0),     /* phase 2 not used */
                MCBSP_RCR2_RWDLEN2_8BIT ,     /* no meaning */
                MCBSP_RCR2_RCOMPAND_ALAW,     /*ALAW companding in reception */
                MCBSP_RCR2_RFIG_YES,          /* An unexpected FSR pulse causes the receiver to  */
                                              /* discard the contents of RSR[1,2] in favor of the new incoming data.*/
                MCBSP_RCR2_RDATDLY_1BIT       /* rcv 1 bit delay */
                ),
            MCBSP_XCR1_RMK(
                MCBSP_XCR1_XFRLEN1_OF(TS),    /* Transmit frame length 1 (1 to 128 words). 64 words per frame */
                MCBSP_XCR1_XWDLEN1_8BIT         /* transmit word length1 8 bit */
                ),
            MCBSP_XCR2_RMK(
                MCBSP_XCR2_XPHASE_SINGLE,  /*  The transmit frame has only one phase, phase 1 */    
                MCBSP_XCR2_XFRLEN2_OF(0),  /* phase 2 not used */
                MCBSP_XCR2_XWDLEN2_8BIT,   /* Transmit word length 2, no used */
                MCBSP_XCR2_XCOMPAND_ALAW,  /*  ALAW companding in transmission */
                MCBSP_XCR2_XFIG_YES,       /*  Unexpected Transmit Frame-Synch Pulse */
                MCBSP_XCR2_XDATDLY_1BIT    /* xmt 1 bit delay */
                ),
            MCBSP_SRGR1_RMK(
                MCBSP_SRGR1_FWID_OF(0),    /* Frame-sync(FSG) pulse width is 1(0+1) CLKG cycles */
                MCBSP_SRGR1_CLKGDV_OF(0)   /* CLKG frequency = (Input clock frequency) / (CLKGDV + 1), CLKG equals to CLKR/CLKX */
                ),
            MCBSP_SRGR2_RMK(
                MCBSP_SRGR2_GSYNC_FREE,    /* Always write 0 to this bit on 5502,NO this function on 5502    */
                MCBSP_SRGR2_CLKSP_RISING,  /* we don't use CLKS input, don't care this bit*/
                MCBSP_SRGR2_CLKSM_CLKS,/* 0 : input clock for sample rate generator is Signal on CLKS/CLKR pin,depend on SCLKME */
                MCBSP_SRGR2_FSGM_FSG,      /* the transmitter uses frame-sync pulses generated by the sample rate generator */
                MCBSP_SRGR2_FPER_OF(511)   /* Frame-sync period is 512 CLKG cycles*/            
                ),
            MCBSP_MCR1_DEFAULT,     /* we don't use multiple channels*/
            MCBSP_MCR2_DEFAULT,
            
            MCBSP_PCR_RMK(
                0,                     /* IDLEEN, 5502 should write to 0*/
                MCBSP_PCR_XIOEN_SP,    /*The CLKX, FSX, DX, and CLKS pins are serial port pins*/
                MCBSP_PCR_RIOEN_SP,    /*The CLKR, FSR, DR, and CLKS pins are serial port pins*/
                MCBSP_PCR_FSXM_EXTERNAL, /*Transmit frame synchronization is supplied by an external source via the FSX pin.*/
                MCBSP_PCR_FSRM_EXTERNAL, /*Receive  frame synchronization is supplied by an external source via the FSR pin*/
                
                MCBSP_PCR_SCLKME_BCLK,     /*1 :The input clock for the sample rate generator is taken from the CLKR pin   */
                                           /*cause the value of the CLKSM bit of SRGR2 is 0    */
                MCBSP_PCR_CLKSSTAT_0,      /*  CLKS pin status bit. 5502 doesn't have this pin   */
                MCBSP_PCR_DXSTAT_0,        /*  DX pin status bit.   */
                MCBSP_PCR_DRSTAT_0,        /*  DR pin status bit. Not GPIO, no meaning here  */
                MCBSP_PCR_CLKXM_INPUT,     /* The transmitter gets its clock signal from an external source via the CLKX pin. */
                MCBSP_PCR_CLKRM_INPUT,     /* The transmitter gets its clock signal from an external source via the CLKR pin. */
                MCBSP_PCR_FSXP_ACTIVEHIGH,  /*  Transmit frame-sync pulses are active low.  */
                MCBSP_PCR_FSRP_ACTIVEHIGH,  /*  Receive frame-sync pulses are active low.  */
                MCBSP_PCR_CLKXP_RISING,    /*  Transmit data is driven on the rising edge of CLKX,发送上升沿   */
                MCBSP_PCR_CLKRP_FALLING    /*  When the CLKR pin is configured as an input, the external CLKR is not */
                                           /*  inverted before being used internally and the receive data is sampled on the */
                                           /*  falling edge of CLKR.  */
                ),
            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 */

/*   DMACSDP       dstben    == 0                           */
/*                 dstpack   == 0                           */
/*                 dst       == 0                           */
/*                 srcben    == 0                           */
/*                 srcpack   == 0                           */
/*                 src       == 5                           */
/*                 datatype  == 1                           */
/*                                                          */
/*   DMACCR        dstamode  == 1                           */
/*                 srcamode  == 0                           */
/*                 endprog   == 0                           */
/*                 repeat    == 0                           */ 
/*                 autoinit  == 1                           */
/*                 en        == 0                           */
/*                 prio      == 0                           */
/*                 fs        == 0                           */
/*                 sync      == 0                           */
/*                                                          */
/*  DMACICR        blockie   == 0                           */
/*                 lastie    == 0                           */
/*                 frameie   == 1                           */
/*                 firsthalfie == 0                         */
/*                 dropie    == 0                           */
/*                 timeoutie == 0                           */
DMA_Config  dmaRcvConfig = { 
    DMA_DMACSDP_RMK(
        DMA_DMACSDP_DSTBEN_NOBURST,    /* dest NO burst */
        DMA_DMACSDP_DSTPACK_OFF,       /* DST Packing disabled */
        DMA_DMACSDP_DST_DARAM,         /* DST is DARAM */
        DMA_DMACSDP_SRCBEN_NOBURST,    /* source NO burst   */
        DMA_DMACSDP_SRCPACK_OFF,       /* source  Packing disabled*/
        DMA_DMACSDP_SRC_PERIPH,        /* source is PERIPH, McBSP0(RCV)*/
        DMA_DMACSDP_DATATYPE_16BIT
    ),                                       /* DMACSDP  */
    DMA_DMACCR_RMK(       /* chanel control register */
        DMA_DMACCR_DSTAMODE_DBLINDX,  /*After each element transfer, the address is incremented according to the selected data type:*/
        DMA_DMACCR_SRCAMODE_CONST,    /*Constant address*/
        DMA_DMACCR_ENDPROG_ON,        /* 1 */
        DMA_DMACCR_REPEAT_ON,         /*Repeat only if ENDPROG = 1*/
        DMA_DMACCR_AUTOINIT_ON,       /*Auto-initialization is enabled*/
        DMA_DMACCR_EN_START,          /*1, Channel is enabled*/
        DMA_DMACCR_PRIO_LOW,          /*                       */
        DMA_DMACCR_FS_ELEMENT,        /* event occurs, one element transfered */      
        DMA_DMACCR_SYNC_REVT0         /* McBSP 0 receive event */
    ),                                       /* DMACCR   */
    DMA_DMACICR_RMK(   /* interrupt control register */
        DMA_DMACICR_BLOCKIE_OFF,  /* address error interrupt off */
        DMA_DMACICR_LASTIE_OFF,
        DMA_DMACICR_FRAMEIE_ON,   /* when all of current frame transfer complete, send int to cpu */
        DMA_DMACICR_FIRSTHALFIE_OFF,
        DMA_DMACICR_DROPIE_OFF,
        DMA_DMACICR_TIMEOUTIE_OFF
    ),                                     /* DMACICR  */
    (DMA_AdrPtr)(MCBSP_ADDR(DRR10)),       /* DMACSSAL, lower part, Data Receive Register 1, McBSP #0 */
    0,                                     /* DMACSSAU  source start address upper part*/
    (DMA_AdrPtr)&rcv[0],                   /* DMACDSAL; Destination Start Address Registers lower part */
    0,                                     /* DMACDSAU upper part*/
    (TS-1),                                /* DMACEN; numbr of element per Frame */
    1,                                     /* DMACFN; frame number per block  */
    0,                                     /* DMACFI; source frame index    */
    0,                                     /* DMACEI; source element index  */
    0,                      

相关帖子

沙发
navywhj|  楼主 | 2007-9-14 15:11 | 只看该作者

程序也发过来吧,一直在调,就是不知道问题在哪里。


/********************************************************************************/
/* 文件名:        Main.c                                                           */                                                
/* 创建日期:    08/06/2007                                                        */
/* 功能描述:     主程序                                                         */
/*   Author  :  whj                                                        */
/********************************************************************************/
#include <stdio.h>
#include <csl.h>
#include <csl_pll.h>
#include <csl_chip.h>
#include <csl_irq.h>
#include <csl_gpt.h>
#include <csl_chip.h>

#include <csl_mcbsp.h>
#include <csl_hpi.h>

#include "GSBPerConfg.h"
#include "MFCFrequent.h"



Uint16 MFC_Detect(Int16 input_x[], Int16 coef_cos[], Uint16 N_point, Uint16 MFC_num);
//extern void SingleFrqGen(Int16 freq, float Amptd, Int16 Q8frqtab[], Uint16 N);

/* Function/ISR prototypes */
interrupt void Timer0Isr(void);

void BSP_Init();
void DMA_Init();
void GPTimer_Init();
void HPI_Init();

void DSPSendIntToHost(Uint16 ts, Uint16 SigNum);

interrupt void dmaXmtIsr(void); 
interrupt void dmaRcvIsr(void); 
interrupt void HpiIntIsr(void); 
interrupt void McBSP0XmtInt(void);
interrupt void McBSP0RcvInt(void);
interrupt void NmiIntIsr(void);




/* Reference start of interrupt vector table   */
/* This symbol is defined in file, vectors.s55 */
extern void VECSTART(void);


#define DSPNUM 1


#pragma DATA_SECTION(HpiData,"HpiRam")
Uint16 HpiData[128];

//HpiData[0]:为HOST对DSP的命令,分别为下面两个宏定义,表示是开始接收MFC采样点还是发送MFC信号
#define HOSTCMD_RCVMFC 0
#define HOSTCMD_SNDMFC 0x55
//HpiData[1]:为发送MFC信号时,HOST对DSP的数据,高8比特为时隙号,低8比特为信令号
//HpiData[2]:为接收MFC信号时,HOST对DSP的数据,为时隙号,即那个时隙开始接收MFC

//HpiData[3]:为接收MFC信号时,DSP对HOST的数据,为时隙号,即那个时隙已经接收到MFC
//HpiData[4]:为接收MFC信号时,DSP对HOST的数据,为信令号, 即收到的是那个MFC
//HpiData[5]:为本地DSP号 







//MFC检测时的系数
//分别对应cos(2PI*(780+i*120)/8000以及cos(2PI*(1380+i*120)/8000的Q8值
Int16 MFC_coef[10]={209, 195, 178, 160, 120, 98, 75, 51, 28, 4};



Uint16 LEDMARK = 0;        // 设置指示灯的开关标志
/* 通过定义宏来控制两个外围存储器映射的寄存器,从而实现对GPIO口的控制 */
#define  GPIODIR      (*(volatile ioport Uint16*)(0x3400))
#define  GPIODATA     (*(volatile ioport Uint16*)(0x3401))


#define  DRR1_0     (*(volatile ioport Uint16*)(0x2800))
#define  DXR1_0     (*(volatile ioport Uint16*)(0x2802))
 
//每个MFC信号的采样点数
#define SAMPNUM 105

//接收发送状态
#define IDLE    0
#define RCVMFC  1
#define CALCMFC 2
#define SNDMFC  3

//前后向信令
#define BACKSIG1  20
#define BACKSIG2  21
#define BACKSIG3  22
#define BACKSIG4  23
#define BACKSIG5  24
#define BACKSIG6  25

#define FWDSIG1  0
#define FWDSIG2  1
#define FWDSIG3  2
#define FWDSIG4  3
#define FWDSIG5  4
#define FWDSIG6  5
#define FWDSIG7  6
#define FWDSIG8  7
#define FWDSIG9  8
#define FWDSIG10  9
#define FWDSIG11  10
#define FWDSIG12  11
#define FWDSIG13  12
#define FWDSIG14  13
#define FWDSIG15  14



/* 全局变量定义 */
typedef struct CircuitData
    {
        Uint16 RcvStatus;               /* 当前时隙状接收状态 */
        Uint16 RcvCnt;                  /* 接收采样信号计数器 */
        Int16  MFCSampleData[SAMPNUM];  /* MFC采样点数据 */
        Uint16 SndStatus;               /* 当前时隙发送状态 */
        Int16  SndNum;                  /* 发送的数据,对应于两个频率的数据 */
        Uint16 Sndcnt;                  /* 发送MFC计数器 */
    } CircuitData;    
CircuitData TsCircuitData[TS];

    /* Create a TIMER_Handle object for use with TIMER_open */
    GPT_Handle      hGpt;
    /* Define a MCBSP_Handle object to be used with MCBSP_open function */
    MCBSP_Handle hMcbsp;    
    /* Define a DMA_Handle object to be used with DMA_open function */
    DMA_Handle hDmaRcv, hDmaXmt;

Uint16 McbspWork = 0;
Uint16 TstCnt = 0;
void main(void)
{
    Int16 i;
    Uint16 SigNum;
        
    /* Initialize CSL library - This is REQUIRED !!! */
    CSL_init();

    /* PLL configuration structure used to set up PLL interface */
    // 主频为300Mhz
    PLL_setFreq(1, 0xF, 0, 1, 3, 3, 0);
    
    /* Set IVPH/IVPD to start of interrupt vector table */
    IRQ_setVecs((Uint32)(&VECSTART));     
    /* Temporarily disable all maskable interrupts */
    
    
    for (i=0; i<64; i++)
    {
        rcv = i;
        xmt = 0;
    }
    
    IRQ_globalDisable();      
    
    GPTimer_Init();    
    BSP_Init();
    
    
    /* Start Timer */
    GPT_start(hGpt);    
    
    //IRQ_plug(IRQ_EVT_NMI, &NmiIntIsr);
    
    /* Config GPIO7 in order to ignite led D5*/  
    GPIODIR = 0x80;    // config the GPIO7 as output pin
        
    /* 变量初始化 */
    for (i=0; i<TS; i++)
    {
        TsCircuitData.RcvStatus = IDLE;
        TsCircuitData.RcvCnt = 0;
        TsCircuitData.SndStatus = IDLE;
        TsCircuitData.Sndcnt = 0; 
    }
    
    
    for(;;)
    {
    /* Enter system loop and waiting for interrupt */
        if (LEDMARK)
        {
            CHIP_FSET(ST1_55, XF, 0);
        }
        else
        {
            CHIP_FSET(ST1_55, XF, 1);
        }
        
        for (i=0; i<TS; i++)
        {
            if (TsCircuitData.RcvStatus == CALCMFC)
            {
                HpiData[5] = DSPNUM;         //那个DSP发生中断
                SigNum = MFC_Detect(TsCircuitData.MFCSampleData, MFC_coef, SAMPNUM, 10);
                TsCircuitData.RcvStatus = IDLE;  //计算完成,将标志设为idle
                DSPSendIntToHost(i, SigNum);        //计算完成,向主机发中断,并告知主机计算结果
            }
        }
            
    }        
}







/*定时器0的中断程序*/
interrupt void Timer0Isr(void)
{
//      if(LEDMARK==0)
//      {
//           GPIODATA = 0x00;                /* 关闭指示灯D5 */
//           LEDMARK = 1;                   
//      }
//      else
//      {          
//          GPIODATA = 0x80;                /* 打开指示灯D5 */
//           LEDMARK = 0;                                          
//      }
}

/*
函数:void BSP_Init() 
功能:初始化DMA和McBSP
*/
void BSP_Init() 
{

    
    /* Open MCBSP Port 0 and set registers to their power on defaults */
    hMcbsp = MCBSP_open(MCBSP_PORT0, MCBSP_OPEN_RESET);  
        
    /********  for test  ***************  for test  *********/
    IRQ_plug(IRQ_EVT_RINT0, &McBSP0RcvInt);
    //IRQ_plug(IRQ_EVT_XINT0, &McBSP0XmtInt);   
    
    IRQ_enable(IRQ_EVT_RINT0);
    //IRQ_enable(IRQ_EVT_XINT0);

    /* Write values from configuration structure to MCBSP control regs */
    MCBSP_config(hMcbsp, &GSBMcBspConfigInit);
             
    IRQ_globalEnable();
    MCBSP_start(hMcbsp, MCBSP_RCV_START, 0x200u);
     

}


/*
函数:void DMA_BSP_Init() 
功能:初始化DMA和McBSP
*/
void DMA_Init()
{    
    Uint16 xmtEventId, rcvEventId;    
    
    Uint16 srcAddrHi, srcAddrLo;
    Uint16 dstAddrHi, dstAddrLo;

 
    /* 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)(dmaRcvConfig.dmacssal)) >> 15) & 0xFFFFu;
    srcAddrLo = (Uint16)(((Uint32)(dmaRcvConfig.dmacssal)) << 1) & 0xFFFFu;
    dstAddrHi = (Uint16)(((Uint32)(dmaRcvConfig.dmacdsal)) >> 15) & 0xFFFFu;
    dstAddrLo = (Uint16)(((Uint32)(dmaRcvConfig.dmacdsal)) << 1) & 0xFFFFu;

    dmaRcvConfig.dmacssal = (DMA_AdrPtr)srcAddrLo;
    dmaRcvConfig.dmacssau = srcAddrHi;
    dmaRcvConfig.dmacdsal = (DMA_AdrPtr)dstAddrLo;
    dmaRcvConfig.dmacdsau = dstAddrHi;

    srcAddrHi = (Uint16)(((Uint32)(dmaXmtConfig.dmacssal)) >> 15) & 0xFFFFu;
    srcAddrLo = (Uint16)(((Uint32)(dmaXmtConfig.dmacssal)) << 1) & 0xFFFFu;
    dstAddrHi = (Uint16)(((Uint32)(dmaXmtConfig.dmacdsal)) >> 15) & 0xFFFFu;
    dstAddrLo = (Uint16)(((Uint32)(dmaXmtConfig.dmacdsal)) << 1) & 0xFFFFu;

    dmaXmtConfig.dmacssal = (DMA_AdrPtr)srcAddrLo;
    dmaXmtConfig.dmacssau = srcAddrHi;
    dmaXmtConfig.dmacdsal = (DMA_AdrPtr)dstAddrLo;
    dmaXmtConfig.dmacdsau = dstAddrHi;

  

    /* 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);  

    /* 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);

    /* Place DMA interrupt service addresses at associate vector */
    IRQ_plug(xmtEventId, &dmaXmtIsr);
    IRQ_plug(rcvEventId, &dmaRcvIsr);

    /* Write values from configuration structure to DMA control regs */
    DMA_config(hDmaRcv, &dmaRcvConfig);
    DMA_config(hDmaXmt, &dmaXmtConfig);   
           
    
    
}

/*

功能: 定时器0初始化函数,该定时器主要用来点亮LED灯,没有什么实际用途

*/
void GPTimer_Init()
{    

    Uint16 EventId0;         // 定时器0所对应的事件ID号

    /* Open Timer 0, set registers to power on defaults */
    /* And return handle of Timer 0 */
    hGpt = GPT_open(GPT_DEV0, GPT_OPEN_RESET);
    
    /* Get Event Id associated with Timer 0, for use with */
    /* CSL interrupt enable functions.                    */         
    EventId0 = GPT_getEventId(hGpt);
    
    /* Clear any pending Timer interrupts */
    IRQ_clear(EventId0);
    
    /* Place interrupt service routine address at */
    /* associated vector location */
    IRQ_plug(EventId0, &Timer0Isr);
    
    /* Write configuration structure values to Timer control regs */ 
    GPT_config(hGpt, &MyGptConfig); 
    
    /* Enable Timer interrupt */
    IRQ_enable(EventId0);     
    
    
}


/*

功能: 初始化HPI

*/
void HPI_Init()
{
    HPI_Config myConfig = {0x3,  /*HPWREMU, Select FREE = SOFT =1 */
                           0x0,  /*HGPIOEB, Disable all GPIO pins */
                           0x0,  /*HGPIODIR, Default GPIO pins to output */
                           0x80  /*HPIC, Reset HPI */
                          };
    
    HPI_config(&myConfig);
    IRQ_plug(IRQ_EVT_DSPINT, &HpiIntIsr);
    IRQ_enable(IRQ_EVT_DSPINT);    
    HPI_FSET(HPIC, HPIRST, 0);  /* enable HPI, not in reset*/
    
}

/*

功能: 向HOST发送中断信号
       DSP给HOST发中断的功能只有一个,识别出某个时隙存在MFC信令,并将该信令送给HOST

*/
void DSPSendIntToHost(Uint16 ts, Uint16 SigNum)
{    
    HpiData[3] = ts;
    HpiData[4] = SigNum;
    HPI_FSET(HPIC, HINT, 1);    
}

/*

功能: HPI中断函数,响应HOST端中断请求
       HOST给HPI发中断的功能有两个个,
       1. 请求DSP在相应时隙发送MFC信令
       2. 请求DSP在相应的时隙开始接收MFC信令数据,并进行识别计算

*/
interrupt void HpiIntIsr(void) 
{
    Uint16 hostcmd;
    Uint16 ts, SigNum;
    
    HPI_FSET(HPIC, DSPINT, 1);  //进入中断以后先清除中断标志 
    
    hostcmd = HpiData[0];
    if (hostcmd == HOSTCMD_SNDMFC)
    {
        ts = (HpiData[1] & 0xff00u) >> 8;
        SigNum = HpiData[1] & 0x00ffu;
        TsCircuitData[ts].SndStatus = SNDMFC;
        TsCircuitData[ts].SndNum = SigNum;
        TsCircuitData[ts].Sndcnt = 0;
    }
    else if (hostcmd == HOSTCMD_RCVMFC)
    {
        ts = HpiData[2];    // 该时隙开始接收数据
        TsCircuitData[ts].RcvStatus = RCVMFC;
        TsCircuitData[ts].RcvCnt = 0;
    }
}




/*

功能: DMA发送中断函数,向E1线路发送MFC信号

*/
interrupt void dmaXmtIsr(void) 
{
    Uint16 i;
    
    

      
      
      
    for (i=0; i<TS; i++)
    {
        //当前时隙正在发送信令
        if (TsCircuitData.SndStatus == SNDMFC)
        {
            if (TsCircuitData.Sndcnt >= SAMPNUM)
            {
                TsCircuitData.SndStatus = IDLE;
                TsCircuitData.Sndcnt = 0;
                xmt = 0x55;   //发送完一个MFC,当时隙没有信令的时候,线路传送0x55
            }
            else
            {                
                if (TsCircuitData.SndNum >= 20) 
                {
                    //发送后向信令
                    xmt = bb[TsCircuitData].SndNum -20] << 3;
                }
                else
                {
                    //发送前向信令
                    xmt = ff[TsCircuitData].SndNum] << 3;
                }
                TsCircuitData.Sndcnt++;
            }
        }
        else
        {            
            xmt = i;   //当时隙没有信令的时候,线路传送0x55
            
        }
    }    

}



/*

功能: DMA接收中断函数
       需要将接收到的一帧(64个时隙)的数据按规定的格式存储,以便MFC算法检测

*/
interrupt void dmaRcvIsr(void) 
{
    Uint16 i;
    TstCnt = TstCnt+1;
    for (i=0; i<TS; i++)
    {
        if (TsCircuitData.RcvStatus == RCVMFC)
        {
            if(TsCircuitData.RcvCnt < SAMPNUM)
            {
                TsCircuitData.MFCSampleData[(TsCircuitData].RcvCnt)++] = rcv >> 3; //A律扩展以后,为13bit高对齐,需右移3位
            }
            else
            {
                TsCircuitData.RcvStatus = CALCMFC;
                TsCircuitData.RcvCnt = 0;
            }
        }
    }
}



interrupt void McBSP0RcvInt(void) 
{    
    rcv[0] = DRR1_0;
    
        if(LEDMARK==0)
      {
           GPIODATA = 0x00;                /* 关闭指示灯D5 */
           LEDMARK = 0;                   
      }
      else
      {          
          GPIODATA = 0x80;                /* 打开指示灯D5 */
           LEDMARK = 1;                                          
      }
    
    
    
    
    if (McbspWork == 0)
    {
        McbspWork = 1;
        
        IRQ_globalDisable();
        
        MCBSP_close(hMcbsp);
        /* Open MCBSP Port 0 and set registers to their power on defaults */
        hMcbsp = MCBSP_open(MCBSP_PORT0, MCBSP_OPEN_RESET);  
            
        /********  for test  *********  ******  for test  *********/
        IRQ_plug(IRQ_EVT_RINT0, &McBSP0RcvInt);
        IRQ_plug(IRQ_EVT_XINT0, &McBSP0XmtInt);   
        
        IRQ_enable(IRQ_EVT_RINT0);
        IRQ_enable(IRQ_EVT_XINT0);   
        
        
//        DMA_Init();        
//        /* Enable DMA */
//        DMA_start(hDmaRcv);
//        DMA_start(hDmaXmt);
//        
        
        /* Write values from configuration structure to MCBSP control regs */
        MCBSP_config(hMcbsp, &GSBMcBspConfig);        
        
        IRQ_globalEnable();
        MCBSP_write16(hMcbsp, xmt[0]);
        /* Take MCBSP transmit and receive out of reset */
        MCBSP_start(hMcbsp, MCBSP_XMIT_START | MCBSP_RCV_START, 0x200u); 
    }
}



interrupt void McBSP0XmtInt(void) 
{
    //printf("xmt int \n");
    DXR1_0 = 0x55;
    
    
}



interrupt void NmiIntIsr(void) 
{    
//    printf(" rcv[1] is : %3d \n", rcv[1]);
//    printf(" rcv[2] is : %3d \n", rcv[2]);
                      
    rcv[1] = 0;
    rcv[2] = 0;
    
    
}

使用特权

评论回复
板凳
zhangsifu| | 2007-9-14 15:22 | 只看该作者

先自发自收试试

先自发自收试试

使用特权

评论回复
地板
navywhj|  楼主 | 2007-9-15 17:07 | 只看该作者

自发自收,用串口中断可以,DMA就不行

这是什么问题呢?
另外我想问一下,用串口方式,设置为单帧模式,每帧64个元素,用RRDY和XRDY触发中断,那么每帧就会有64个中断,对吗?
我现在不能确定,是不是来了64个串口中断,反正中断连续产生了,我设断点都看到了,数据也正确。

使用特权

评论回复
5
wowow| | 2007-9-15 19:35 | 只看该作者

提一下我原来做MFC时McBsp与DMA的思路

由于项目保密要求,不能给代码了,只能提一下思路。再说我也忘得差不多了。用RRDY和XRDY触发中断肯定是不行了。

使用特权

评论回复
6
navywhj|  楼主 | 2007-9-17 08:16 | 只看该作者

To wowow

能不能多给点提示?

你为什么用这么多DMA?用两个缓冲不是浪费内存了吗?

你的DMA0和DMA1是用RRDY/XRDY作为DMA的事件吗?

另外你的McBSP用到多通道了吗?关于多通道我是看不明白了,我觉得一个帧里包含多个元素,每个元素实际就代表一个通道,何必再麻烦去搞什么多通道?
希望大家多指导一下小弟!!!

使用特权

评论回复
7
wowow| | 2007-9-17 08:49 | 只看该作者

re

双缓冲是必须的,收完一帧计算要很长时间,这时候还有新的数据过来,如果不用双缓冲,部分数据会被覆盖。缓冲区之间的复制可以不用DMA2、3。

DMA0 Element synchronization.McBSP 0 Receive Event (REVT0)
DMA1 Element synchronization.McBSP 0 Transmit Event (XEVT0)

Mcbsp没用多通道。

使用特权

评论回复
8
navywhj|  楼主 | 2007-9-17 16:00 | 只看该作者

to wowow

你们用5509才处理32路MFC?

我的那中断总算是对了,但是64路MFC,我都不知道5502能不能处理得过来。

另外我想问一下,数据经过A-law压缩扩展以后是不是有一定的误差??
我自发自收的时候发现收到的和发送的不一样。(压扩是啥原理也没搞懂,呵呵)


唉,我觉得像我这样子研发做的很失败啊。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

34

主题

69

帖子

0

粉丝