?? main_edma1.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 + -