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

📄 example_281x_ulawde.c

📁 用DSP2812实现ULAW算法
💻 C
字号:
                                     

;* 文件名称 : Example_DSP281x_ulaw.c 	
;* 适用平台 : DSP E100 实验箱;
;* CPU类型  : DSP TMS320F2812 
;* 软件环境 : CCS2.20 (2000系列)
;* 试验接线 : 1、F2812CPU板的JUMP1的1和2脚短接,拨码开关SW1的第二位置ON;
;*            2、底板的开关SW1的第1和第6位置ON,其余置OFF。
;*            3、用导线连接二号孔SIN到AIN0。
;* 试验现象 : 设置好CCS的环境,打开本工程,编译、下载、运行。
;*            利用变量观察窗口观察变换结果。
;* 地址译码说明:基地址:0x2000,当底板片选CS1为低时,分配有效。
*/    
//------------------头文件-------------------------------------//
#include "DSP281x_Device.h"     // DSP281x Headerfile Include File
#include "DSP281x_Examples.h"   // DSP281x Examples Include File
#include <math.h>
#define pi 3.1415927
#define Length 256
int px[256];
int py[256];
int Input[Length],Output[Length];
int Package[Length];
int in, pack, out;
int i = 0;
int j = 0;
int k = 0;
// Prototype statements for functions found within this file.
interrupt void adc_isr(void);
// Global variables used in this example:
Uint16 ConversionCount,LoopCount;


int mu_law_compress ( int in)
{
	int vin0,vin1,vin2,vpack,n,m;
	
	vin0 = in;	
	vin1 = vin0/4;
	vin2 = abs(vin1);
	m = 0x20;
	vpack = 0;

	for ( n=1; n<=8; n++)
	{
		if ((vin2 >= m) && (vin2 < 2*m))
		{
			vpack = ((vin2>>n) & (0x0f)) + (0x10*(n-1));
			n=9;
		}
		else m = m*2;
	}

	if (vin0 < 0) vpack = vpack + 0x80;
	else vpack = vpack;	
		
	return(vpack);
}

int mu_law_expand( int pack )
{
	int vpack0,vpack1,vpack2,com1,com2,vout,n,m;
	
	vpack0 = pack;
	vpack1 = (abs(vpack0)) & 0x0f;
	vpack2 = (abs(vpack0) & 0x70)>>4;
	com1 = 0x3f;
	com2 = 0x21;
	m=1;
	
	for ( n=1; n<=8; n++)
	{
	  if (vpack2 == (0x00+(n-1)))
	  { 
	  	vout = ((vpack1<<n) & (com1*m)) + (com2*m);
	  	n=9;
	  }
	  else m = m*2;	  
	}

	if (vpack0 <128) vout = vout;
	else vout = -vout;
	
	vout = vout*4;
	
	return(vout);
}

interrupt void  adc_isr(void)
{ 
    
  px[ConversionCount] = AdcRegs.ADCRESULT0 >>4;
  
     
		in = px[ConversionCount];
		
		pack = mu_law_compress(in) ;
		
	   	out = mu_law_expand(pack) ;
	   	
	   	py[j] = out;
	   	
	   	if (i<=Length-1)
  		{
  	  		Input[i] = in;
  			Package[i] = pack;
  	 		Output[i] = out;
  		}
  
		i++;
		i = i%Length;
         

  if(ConversionCount == 256) 
  {
     ConversionCount = 0;
        
  }
  else ConversionCount++;
  

  // Reinitialize for next ADC sequence
  AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1;         // Reset SEQ1
  AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;       // Clear INT SEQ1 bit
  PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;   // Acknowledge interrupt to PIE
  
  return;
}

void main(void) 
{

// PLL, WatchDog, enable Peripheral Clocks
// This example function is found in the DSP281x_SysCtrl.c file.
   InitSysCtrl();

// For this example, set HSPCLK to SYSCLKOUT / 6 (25Mhz assuming 150Mhz SYSCLKOUT)
   EALLOW;
   SysCtrlRegs.HISPCP.all = 0x3;  // HSPCLK = SYSCLKOUT/6
   EDIS;
   

// Disable CPU interrupts 
   DINT;

// Initialize the PIE control registers to their default state.
   InitPieCtrl();

// Disable CPU interrupts and clear all CPU interrupt flags:
   IER = 0x0000;
   IFR = 0x0000;

// Initialize the PIE vector table with pointers to the shell Interrupt 
// Service Routines (ISR).  
   InitPieVectTable();
     
// Interrupts that are used in this example are re-mapped to
// ISR functions found within this file.       
   EALLOW;  // This is needed to write to EALLOW protected register
   PieVectTable.ADCINT = &adc_isr;
   EDIS;    // This is needed to disable write to EALLOW protected registers

   InitAdc();  // For this example, init the ADC

// Enable ADCINT in PIE
   PieCtrlRegs.PIEIER1.bit.INTx6 = 1;
   IER |= M_INT1; // Enable CPU Interrupt 1
   EINT;          // Enable Global interrupt INTM
   ERTM;          // Enable Global realtime interrupt DBGM

   ConversionCount = 0;
    
// Configure ADC
   AdcRegs.ADCTRL1.bit.SEQ_CASC = 1; 
   AdcRegs.ADCMAXCONV.all = 0x0000;       // Setup 2 conv's on SEQ1
   AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0; // Setup ADCINA0 as 1st SEQ1 conv.
   AdcRegs.ADCTRL2.bit.EVA_SOC_SEQ1 = 1;  // Enable EVASOC to start SEQ1
   AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1;  // Enable SEQ1 interrupt (every EOS)

// Configure EVA
// Assumes EVA Clock is already enabled in InitSysCtrl();
   EvaRegs.T1CMPR = 0x0380;               // Setup T1 compare value
   EvaRegs.T1PR = 0x0FFF;                 // Setup period register
   EvaRegs.GPTCONA.bit.T1TOADC = 1;       // Enable EVASOC in EVA
   EvaRegs.T1CON.all = 0x1042;            // Enable timer 1 compare (upcount mode)

  while(1)
   {
      LoopCount++;
   }

}
//***********结束*******************************************************





⌨️ 快捷键说明

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