⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nb_perph_ping.c

📁 DSP EDMA入门源代码
💻 C
字号:
/********************************************************************************/
/* nb_perph_ping.c                                                              */
/* written by David Bell                                                        */
/*         on 01/09/01                                                          */
/*                                                                              */
/* nb_perph_ping uses two EDMA channels to service McBSP0. Channel 12 is used   */
/* to transmit frames of data from L2 to the DXR. Channel 13 is used to trans-  */
/* mit frames of data from the DRR to L2. After each frame is transferred, the  */
/* input/output buffers toggle between ping and pong. This allows the CPU to    */
/* access one buffer while the EDMA accesses the other. After the frames are    */
/* transmitted 10 times the channels are disabled and the data is verified.     */
/********************************************************************************/

#include <csl.h>
#include <csl_edma.h>
#include <csl_mcbsp.h>


/* definitions */
#define PING_SRC    0x80000000              /* Ping source address for transfer */
#define PONG_SRC    0x80001000              /* Pong source address for transfer */
#define PING_DST    0x0000D000              /* Ping dest address for transfer   */
#define PONG_DST    0x0000E000              /* Pong dest address for transfer   */
#define EL_COUNT    0x0100                  /* Element count for transfer       */
#define ITERATE     10                      /* Number of frames to iterate      */

/* prototypes */
void cfg_data(void);
Int32 cfg_edma(EDMA_Handle *hEdma_ch12, EDMA_Handle *hEdma_ch13);
void wait(void);
Int32 check_data(void);
extern void cfg_mcbsp(MCBSP_Handle *hMcbsp_ch0);
extern void start_mcbsp(MCBSP_Handle *hMcbsp_ch0);



/************************************cfg_data************************************/
/* Store a data ramp in the source memory space. This data will be transferred  */
/* by the EDMA.                                                                 */
/********************************************************************************/
void
cfg_data()
{
unsigned short  *pingval;
unsigned short  *pongval;
unsigned short   i = 0;

      pingval = (unsigned short *)PING_SRC;
      pongval = (unsigned short *)(PONG_SRC + (EL_COUNT<<1));
      /* Set up transfer data */
      for (i = 0; i < (EL_COUNT<<1); i++){
            *pingval++ = i;
            *--pongval = i;
      } /* end for */
      
} /* end cfg_data */


/*************************************cfg_edma***********************************/
/* Program EDMA channels 12 and 13 to service McBSP0. Four sets must be used    */
/* from the PaRAM reload space to allow ping pong operation.                    */
/********************************************************************************/
Int32
cfg_edma(EDMA_Handle *hEdma_ch12, EDMA_Handle *hEdma_ch13)
{
Uint32 link_ping_xmt;
Uint32 link_ping_rcv;
Uint32 link_pong_xmt;
Uint32 link_pong_rcv;
EDMA_Config config;
EDMA_Handle hEdma_ping_xmt;
EDMA_Handle hEdma_ping_rcv;
EDMA_Handle hEdma_pong_xmt;
EDMA_Handle hEdma_pong_rcv;

      if (!EDMA_allocTableEx(1, &hEdma_pong_xmt)) return(-1);
      link_pong_xmt = EDMA_getTableAddress(hEdma_pong_xmt);
      
      if (!EDMA_allocTableEx(1, &hEdma_ping_xmt)) return(-1);
      link_ping_xmt = EDMA_getTableAddress(hEdma_ping_xmt);

      if (!EDMA_allocTableEx(1, &hEdma_pong_rcv)) return(-1);
      link_pong_rcv = EDMA_getTableAddress(hEdma_pong_rcv);
      
      if (!EDMA_allocTableEx(1, &hEdma_ping_rcv)) return(-1);
      link_ping_rcv = EDMA_getTableAddress(hEdma_ping_rcv);

      *hEdma_ch12 = EDMA_open(12, EDMA_OPEN_RESET);
      *hEdma_ch13 = EDMA_open(13, EDMA_OPEN_RESET);

      /* Configure the transmit channel (13) */
      config.opt = (Uint32)                          
                   ((EDMA_OPT_PRI_HIGH     << _EDMA_OPT_PRI_SHIFT   )
                  | (EDMA_OPT_ESIZE_32BIT  << _EDMA_OPT_ESIZE_SHIFT )
                  | (EDMA_OPT_2DS_NO       << _EDMA_OPT_2DS_SHIFT   )
                  | (EDMA_OPT_SUM_INC      << _EDMA_OPT_SUM_SHIFT   )
                  | (EDMA_OPT_2DD_NO       << _EDMA_OPT_2DD_SHIFT   )
                  | (EDMA_OPT_DUM_NONE     << _EDMA_OPT_DUM_SHIFT   )
                  | (EDMA_OPT_TCINT_YES    << _EDMA_OPT_TCINT_SHIFT )
                  | (EDMA_OPT_TCC_OF(12)   << _EDMA_OPT_TCC_SHIFT   )
#if (C64_SUPPORT)
                  | (EDMA_OPT_TCCM_DEFAULT << _EDMA_OPT_TCCM_SHIFT  )
                  | (EDMA_OPT_ATCINT_NO    << _EDMA_OPT_ATCINT_SHIFT)
                  | (EDMA_OPT_ATCC_DEFAULT << _EDMA_OPT_ATCC_SHIFT  )
                  | (EDMA_OPT_PDTS_DISABLE << _EDMA_OPT_PDTS_SHIFT  )
                  | (EDMA_OPT_PDTD_DISABLE << _EDMA_OPT_PDTD_SHIFT  )
#endif
                  | (EDMA_OPT_LINK_YES     << _EDMA_OPT_LINK_SHIFT  )
                  | (EDMA_OPT_FS_NO        << _EDMA_OPT_FS_SHIFT    ));

      config.src = (Uint32)PING_SRC;                 /* 0x80000000 */
      config.cnt = (Uint32)EL_COUNT;                 /* 0x00000100 */ 
      config.dst = (Uint32)_MCBSP_DXR0_ADDR;         /* 0x30000000 */
      config.idx = (Uint32)0;                        /* 0x00000000 */
      config.rld = (Uint32)link_pong_xmt & 0xffff;        /* &pong */

      EDMA_config(*hEdma_ch12, &config);
      EDMA_config(hEdma_ping_xmt, &config);

      config.src = (Uint32)PONG_SRC;                 /* 0x80001000 */
      config.rld = (Uint32)link_ping_xmt & 0xffff;        /* &ping */
      EDMA_config(hEdma_pong_xmt, &config);
      
      config.opt = (Uint32)                          
                   ((EDMA_OPT_PRI_HIGH     << _EDMA_OPT_PRI_SHIFT   )
                  | (EDMA_OPT_ESIZE_32BIT  << _EDMA_OPT_ESIZE_SHIFT )
                  | (EDMA_OPT_2DS_NO       << _EDMA_OPT_2DS_SHIFT   )
                  | (EDMA_OPT_SUM_NONE     << _EDMA_OPT_SUM_SHIFT   )
                  | (EDMA_OPT_2DD_NO       << _EDMA_OPT_2DD_SHIFT   )
                  | (EDMA_OPT_DUM_INC      << _EDMA_OPT_DUM_SHIFT   )
                  | (EDMA_OPT_TCINT_YES    << _EDMA_OPT_TCINT_SHIFT )
                  | (EDMA_OPT_TCC_OF(13)   << _EDMA_OPT_TCC_SHIFT   )
#if (C64_SUPPORT)
                  | (EDMA_OPT_TCCM_DEFAULT << _EDMA_OPT_TCCM_SHIFT  )
                  | (EDMA_OPT_ATCINT_NO    << _EDMA_OPT_ATCINT_SHIFT)
                  | (EDMA_OPT_ATCC_DEFAULT << _EDMA_OPT_ATCC_SHIFT  )
                  | (EDMA_OPT_PDTS_DISABLE << _EDMA_OPT_PDTS_SHIFT  )
                  | (EDMA_OPT_PDTD_DISABLE << _EDMA_OPT_PDTD_SHIFT  )
#endif
                  | (EDMA_OPT_LINK_YES     << _EDMA_OPT_LINK_SHIFT  )
                  | (EDMA_OPT_FS_NO        << _EDMA_OPT_FS_SHIFT    ));

      config.src = (Uint32)_MCBSP_DRR0_ADDR;         /* 0x30000000 */
      config.cnt = (Uint32)EL_COUNT;                 /* 0x00000100 */ 
      config.dst = (Uint32)PING_DST;                 /* 0x0000D000 */
      config.idx = (Uint32)0;                        /* 0x00000000 */
      config.rld = (Uint32)link_pong_rcv & 0xffff;        /* &pong */

      EDMA_config(*hEdma_ch13, &config);
      EDMA_config(hEdma_ping_rcv, &config);

      config.dst = (Uint32)PONG_DST;                 /* 0x0000E000 */
      config.rld = (Uint32)link_ping_rcv & 0xffff;        /* &ping */
      EDMA_config(hEdma_pong_rcv, &config);
      
      return(0);
      
} /* end cfg_edma */


/**************************************wait**************************************/
/* Wait until the transfer completes, as indicated by bit 13 of the Channel     */
/* Interrupt Pending Register (CIPR).                                           */
/********************************************************************************/
void
wait(void)
{
      while (1){
            if ((Uint32)EDMA_RGET(CIPR) & (1 << 13)){
                  EDMA_RSET(CIPR, (1 << 13));
                  break;
            } /* end if */
      } /* end while */

} /* end wait */


/***********************************check_data***********************************/
/* Verify that the data was properly transferred by comparing the source data   */
/* to the destination data.                                                     */
/********************************************************************************/
int
check_data(void)
{
Uint16 *src,
       *dst,
        source = 0,
        dest = 0,
        i;
Uint32  err = 0;

      src = (Uint16 *)PING_SRC;
      dst = (Uint16 *)PING_DST;
      for (i = 0; i < (EL_COUNT<<1); i++){
            dest = *dst++;
            source = *src++;

            if (dest != source){
                  /* Set error value if incorrect data */
                  err = i + 0x1000;
                  break;
            } /* end if */
      } /* end for i */

      src = (Uint16 *)PONG_SRC;
      dst = (Uint16 *)PONG_DST;
      for (i = 0; i < (EL_COUNT<<1); i++){
            dest = *dst++;
            source = *src++;

            if (dest != source){
                  /* Set error value if incorrect data */
                  err = i + 0x2000;
                  break;
            } /* end if */
      } /* end for i */
      return(err);

} /* end check_data */


/**************************************main**************************************/
/* Main code body.                                                              */
/********************************************************************************/
void
main(void)
{
Uint16 i;
Uint32 error  = 0;
EDMA_Handle hEdma_ch12;
EDMA_Handle hEdma_ch13;
MCBSP_Handle hMcbsp_ch0;

      cfg_data();
      error = cfg_edma(&hEdma_ch12, &hEdma_ch13);
      if (!error){
            cfg_mcbsp(&hMcbsp_ch0);
            EDMA_enableChannel(hEdma_ch12);
            EDMA_enableChannel(hEdma_ch13);
            start_mcbsp(&hMcbsp_ch0);

            for(i=0; i<ITERATE; i++) wait();
               
            EDMA_disableChannel(hEdma_ch12);
            EDMA_disableChannel(hEdma_ch13);
            EDMA_close(hEdma_ch12);
            EDMA_close(hEdma_ch13);
            MCBSP_close(hMcbsp_ch0);
      } /* end if !error */

      if (!error) error = check_data();
      
      while(error);
      while(!error);

} /* end main */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -