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

📄 main_edma1.c

📁 DSP67xx下2进制相移键控的实现代码。可应用在软件无线电上。
💻 C
字号:
/********************************************************************************/
/* b_perph.c                                                                    */
/* written by David Bell                                                        */
/*         on 01/09/01                                                          */
/*                                                                              */
/* b_perph uses a single EDMA channel to service an external AFE. Channel 4 is  */
/* used to burst a frame of data for every EXT_INT4 event received. The data is */
/* transferred from the AFE to L2 memory.                                       */
/********************************************************************************/
/***********************6713初始化(xt1029)************************/
#define CHIP_6713 1

#include <stdio.h>
#include <csl_cache.h>
#include <csl_timer.h>
#include <csl_irq.h>
#include <csl.h>
#include <csl_edma.h>

#include <c6x.h>
#include "c6211dsk.h"
#include "math.h"


/* definitions */
#define MEM_SRC     0x8000              /* Source address for transfer      */
#define MEM_DST     0xB0280000          /* Switch(2..0) = 001     0xB0000000  Switch(2..0) =000  */
#define EL_COUNT    2049                  /* Element count for transfer       */
#define FR_COUNT    1


/* PLL configuration */    //屏蔽pll(xt1029)
#define PLL_DIV0  0
#define PLL_DIV1  1
#define PLL_DIV2  2
#define PLL_DIV3  3

/****************CDMA过程所需参数(xt1029)***************/
#define length_crc_coding 16
#define length_convolution_coding 40
#define length_intertexture_coding 36
#define length_walsh 96/*36/3*8=96*/
#define length_longcode_spreading 384/*96*4=384*/
#define length_IPN_spreading 384
 #define length_QPN_spreading 384

/****************CDMA过程所需参数(xt1029)***************/
int w;

void submit_qdmas(void);
void submit_qdma(void);
void wait(void);

void startPLL();
void delay();
extern far void vectors();
void setupInterrupts(void);

/***********************************submit_qdma**********************************/
/* Submit a QDMA request to transfer the data.                                  */
/********************************************************************************/
void
submit_qdma(void)
{
EDMA_Config config;

      config.opt = (Uint32)                          /* 0x21200001 */
                   ((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_NO     << _EDMA_OPT_TCINT_SHIFT )
                  | (EDMA_OPT_TCC_DEFAULT  << _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_NO      << _EDMA_OPT_LINK_SHIFT  )
                  | (EDMA_OPT_FS_YES       << _EDMA_OPT_FS_SHIFT    ));

      config.src = (unsigned int)MEM_SRC;             /* 0x80000000 */
      config.cnt = (unsigned int)EL_COUNT;            /* 0x00000100 */ 
      config.dst = (unsigned int)MEM_DST;             /* 0x00002000 */
      config.idx = (unsigned int)0;                   /* 0x00000000 */

      EDMA_qdmaConfig(&config);
      
} /* end submit_qdma */

/**************************************wait**************************************/
/* Wait until the transfer completes, as indicated by the status of the low-    */
/* priority queue in the queue status register (QSR).                           */
/********************************************************************************/
void
wait(void)
{
      while (!(EDMA_getPriQStatus() & EDMA_OPT_PRI_HIGH));

} /* end wait */

/******************************以上为6713所需初始化(xt1029)****************/

    
 /*******************手动给一个输入数据(xt1029)*************/
    unsigned input_crc[]={1,1,0,0,1,1,0,0};


  /************************完毕(xt1029)************************/

/***************全局变量,子函数声明(xt1029)*********/
static unsigned  crc_bits[length_crc_coding];//8位信息比特+4位CRC比特+4位帧尾比特
static unsigned  convolution_bits[length_convolution_coding];  // 12位信息比特经过卷积编码后,变成了36位,再加4位帧尾比特
static unsigned intertexture_bits[length_intertexture_coding+8];/*卷积和交织,数据比特没有发生变化36位编码符合+8位帧尾比特*/
static unsigned walsh_bits[length_walsh+8]; /*8阶walsh函数正交扩展后,36/3*8=96+8=104*/
static unsigned longcode_spreading_bits[length_longcode_spreading+8];/*长码扩频后,96*4+8=392*/
static unsigned IPN_spreading_bits[length_IPN_spreading+8];/*I路数据流384+8=392*/
static unsigned QPN_spreading_bits[length_QPN_spreading+8]; /*Q路数据流384+8=392*/


 void CRC_Coding();/*CRC编码函数声明*/
  void Convolution_Coding();/*卷积编码函数声明*/
  void Intertexture_Coding();/*交织函数声明*/
  void Walsh_Coding();/*walsh正交扩展函数声明*/
   void Longcode_Coding();/*长码扩频函数声明*/
   void IQ_spreading_code();/*IQ两路正交相位扩展函数声明*/
  void Experiment9_Display(); /* 输出显示函数声明*/
 

void main()
{

   /****************************  配置6713(xt1029)*******************/  

int i=0;


/* DSP initialization                                                       */
  CSR=0x100;                           /* Disable all interrupts              */
  IER=1;                               /* Disable all interrupts except NMI   */
  ICR=0xffff;                          /* Clear all pending interrupts        */


// PLL Configuration
 startPLL();
 delay();


  *(unsigned volatile int *)EMIF_GCR = 0x3778;
  *(unsigned volatile int *)EMIF_CE0 = 0x30;    	/* EMIF CE1 control, 32bit  */
  *(unsigned volatile int *)EMIF_CE1 = CE1_8;    	/* EMIF CE1 control, 32bit  */
  *(unsigned volatile int *)EMIF_CE2 = 0x30;    	/* EMIF CE1 control, 32bit  */
  *(unsigned volatile int *)EMIF_CE3 = CE1_32;    	/* EMIF CE1 control, 32bit  */
  *(unsigned volatile int *)EMIF_SDCTRL = 0x07126000; 	/* EMIF SDRAM control   */ 
  *(unsigned volatile int *)EMIF_SDRP = 0x61a;    	/* EMIF SDRM refresh period */
  *(unsigned volatile int *)EMIF_SDEXT= 0x54529;  	/* EMIF SDRM extension      */

  /* Configure L2 for 64K Cache and enable caching of external memory*/
    for(i=0;i<5;i++)
  {
	  *(short int *)(0xB0040000) =  0x000;  

  }  
    for(i=0;i<5;i++)
  {
	  *(short int *)(0xB0040000) =  0x001;  

  }





   submit_qdma();
   wait();
   i=0;
   submit_qdma();
   wait();
   i=0;

    for(i=0;i<5;i++)
  {
	  *(short int *)(0xB0040000) =  0x000;  

  }

    for(i=0;i<5;i++)
  {
	  *(short int *)(0xB0040000) =  0xFFFFFFFF;  
	  *(short int *)(0xB004000C) =  0xFFFFFFFF;  
	  *(short int *)(0xB0040010) =  0xFFFFFFFF;  

  } 

	IRQ_setVecs(vectors);     
	IRQ_globalEnable();        
	IRQ_nmiEnable();             
	IRQ_map(IRQ_EVT_EXTINT4, 4); 
	IRQ_reset(IRQ_EVT_EXTINT4);  
	IRQ_enable(IRQ_EVT_EXTINT4);

/*************************配置完毕(xt1029)****************************/


/***************调用函数产生结果(xt1029)*****************/
  
  CRC_Coding();/*CRC函数调用*/
  Convolution_Coding();/*卷积编码函数调用*/
 Intertexture_Coding();/*交织函数调用*/
 Walsh_Coding();/*walsh正交扩展函数调用*/
  Longcode_Coding();/*长码扩频函数调用*/
   IQ_spreading_code();/*IQ两路正交相位扩展函数调用*/
   Experiment9_Display();/*输出函数调用*/

}







/************************子函数和子程序定义***************************/
/**********************CRC编码函数定义开始*****************/
void CRC_Coding()
{
  int i=0,j=0,k=0;
  unsigned return_bit=0;             //设置return_bit作为每次的反馈比特
  unsigned crc_coef[4]={1,1,0,0};    // CRC的生成多项式:g(x)=x0+x1+0+0+x4
  unsigned shift_buff[4]={1,1,1,1};  //四位移位寄存器,并赋初值
  unsigned return_bits[4]={0,0,0,0}; //进行异或比较的值(需要理解这个数组的作用) 
  for(i=0;i<8;i++)//最后一次获得四位CRC的值
  {
   return_bit=shift_buff[3]^input_crc[i];//移位寄存器的最后一位与信息比特进行异或运行以获得一位返回值
   for(j=0;j<4;j++)//获得四位进行异或比较的值
   {
    return_bits[j]=crc_coef[j]*return_bit;
    }
   for(j=2;j>=0;j--)//异或并且移位
   {
    shift_buff[j+1]=shift_buff[j]^return_bits[j+1];
    }
     shift_buff[0]=return_bits[0];   //第一值直接返回
     j=0;//每一个循环后,j都必需重新置零    
   }
   
   for(i=0;i<length_crc_coding;i++)//将8位信息比特+4位CRC比特+4位帧尾比特读入

⌨️ 快捷键说明

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