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

📄 cochlear.c

📁 这是一个在TMS5509A平台上运行的工程
💻 C
📖 第 1 页 / 共 2 页
字号:
	IRQ_plug(IRQ_EVT_INT0,&Power_Switch_Isr);	// Place address of interrupt service routines at associated vector location
	IRQ_plug(IRQ_EVT_INT1,&Signal_Alter_Isr);
	IRQ_plug(IRQ_EVT_INT2,&Alert_Bat_Isr);
	IRQ_plug(Timer0_eventId,&Timer0_Isr);
	IRQ_plug(Timer1_eventId,&Timer1_Isr);
	IRQ_plug(DMA_rcvEventId,&DMA_rcv_Isr);

	IRQ_enable(IRQ_EVT_INT0);				// Enable INT0
	IRQ_enable(IRQ_EVT_INT1);				// Enable INT1
	IRQ_enable(IRQ_EVT_INT2);				// Enable INT2
	IRQ_enable(Timer0_eventId);				// Enable Timer0 interrupt
	IRQ_enable(Timer1_eventId);				// Enable Timer1 interrupt
    IRQ_enable(DMA_rcvEventId);				// Enable DMA Channel 0 receive interrupt

	TIMER_config(mhTimer0, &timCfg0);		// Write values from configuration structure to Timer0 control regs
	TIMER_config(mhTimer1, &timCfg1);		// Write values from configuration structure to Timer1 control regs
    MCBSP_config(mhMcbsp, &Config_MCBSP);	// Write values from configuration structure to MCBSP1 control regs
	DMA_config(mhDmaRcv, &DMAConfig_Rcv);	// Write values from configuration structure to DMA Channel 0 control regs

	DMA_RSET(DMAGCR,0x0004);					// Set FREE Bit in Global Control Register 
	DMA_RSET(DMAGSCR,0x0001u);					// Enhance DMA Mode
	DMA_FSET(DMACCR0,ENDPROG,DMA_DMACCR_ENDPROG_ON);	// ENDPROG = 1;

	delay();
	IRQ_clear(DMA_rcvEventId);					// Clear any pending DMA Channel 0 receiver interrupts	
	IRQ_globalEnable();							// Enable Global IRQ

	TIMER_FSET(TCR0,TLB,TIMER_TCR_TLB_NORESET);	// Timer0: TLB = 0;
	TIMER_FSET(TCR1,TLB,TIMER_TCR_TLB_NORESET);	// Timer1: TLB = 0;
	MCBSP_start(mhMcbsp,MCBSP_RCV_START, 0);	// Enable MCBSP1 Receiver
	DMA_start(mhDmaRcv);						// Enable DMA Channel 0 Receiver

	while(AUDIO_DATA_SECTION < 3);
	while(1)
	{
		process_data0_mark=0;
		process_data1_mark=0;
		process_data2_mark=0;
		process_data3_mark=0;
		
		switch(AUDIO_DATA_SECTION)
		{
			case 0: 
				process_data0_mark=1;
				p1 = AUDIO_DATA1;
				break;
			case 1: 
				process_data1_mark=1;
				p1 = AUDIO_DATA2;
				break;
			case 2: 
				process_data2_mark=1;
				p1 = AUDIO_DATA3;
				break;
			case 3: 
				process_data3_mark=1;
				p1 = AUDIO_DATA0;
				break;
		}
		
/********************************/
/*		Process Program			*/
/********************************/

/* Coding Pulse Data */
		if((AUDIO_DATA_SECTION==0)||(AUDIO_DATA_SECTION==2))
		{
			p_code = PULSE_DATA1;
			for(i=0;i<AMOUNT_DATA_FRAME;i++)
			{
				PULSE_DATA1[i] = 0x100;				
			}
		}
		else
		{
			p_code = PULSE_DATA0;
			for(i=0;i<AMOUNT_DATA_FRAME;i++)
			{
				PULSE_DATA0[i] = 0x100;
			}
		}	
		electrode_select = 0;				// Sequence of Stimulating Electrode
		pulse_width = PULSE_WIDTH;			// Stimulating Pulse Width is 25us
		for(i=0;i<AMOUNT_DATA_FRAME;i++)	// Coding Pulse Data
		{
			temp1 = 0;						// To Compute Checkout Bit0
			temp0 = *p_code & 0x0001;
			temp1 = temp0 + temp1;
			temp0 = *p_code & 0x0002;
			temp0 = temp0 >> 1;
			temp1 = temp0 + temp1;
			temp0 = *p_code & 0x0004;
			temp0 = temp0 >> 2;
			temp1 = temp0 + temp1;
			temp0 = *p_code & 0x0008;
			temp0 = temp0 >> 3;
			temp1 = temp0 + temp1;
			temp0 = *p_code & 0x0010;
			temp0 = temp0 >> 4;
			temp1 = temp0 + temp1;
			temp0 = *p_code & 0x0020;
			temp0 = temp0 >> 5;
			temp1 = temp0 + temp1;
			temp0 = *p_code & 0x0040;
			temp0 = temp0 >> 6;
			temp1 = temp0 + temp1;
			temp0 = *p_code & 0x0080;
			temp0 = temp0 >> 7;
			temp1 = temp0 + temp1;
			temp0 = *p_code & 0x0100;
			temp0 = temp0 >> 8;
			temp1 = temp0 + temp1;
			temp0 = *p_code & 0x0200;
			temp0 = temp0 >> 9;
			temp1 = (temp0 + temp1) & 0x0001;	// temp1 = Checkout Bit0
			*p_code = (*p_code << 13) + (temp1 << 12); 
			
			temp1 = 0;
			temp0 = pulse_width & 0x0001;		// To Compute Checkout Bit1
			temp1 = temp0 + temp1;
			temp0 = pulse_width & 0x0002;
			temp0 = temp0 >> 1;
			temp1 = temp0 + temp1;
			temp0 = pulse_width & 0x0004;
			temp0 = temp0 >> 2;
			temp1 = temp0 + temp1;
			temp0 = pulse_width & 0x0008;
			temp0 = temp0 >> 3;
			temp1 = temp0 + temp1;
			temp0 = pulse_width & 0x0010;
			temp0 = temp0 >> 4;
			temp1 = temp0 + temp1;
			temp0 = pulse_width & 0x0020;
			temp0 = temp0 >> 5;
			temp1 = temp0 + temp1;
			temp0 = electrode_select & 0x0001;
			temp1 = temp0 + temp1;
			temp0 = electrode_select & 0x0002;
			temp0 = temp0 >> 1;
			temp1 = temp0 + temp1;
			temp0 = electrode_select & 0x0004;
			temp0 = temp0 >> 2;
			temp1 = temp0 + temp1;
			temp0 = electrode_select & 0x0008;
			temp0 = temp0 >> 3;
			temp1 = temp0 + temp1;
			temp0 = electrode_select & 0x0010;
			temp0 = temp0 >> 4;
			temp1 = (temp0 + temp1) & 0x0001;	// temp1 = Checkout Bit1
			
			*p_code = *p_code + (pulse_width << 6);
			*p_code = (*p_code + (electrode_select << 1) + temp1) | START_BIT;	// Complete Coding
			
			electrode_select++;							// Increase Electrode Sequence
			if(electrode_select == AMOUNT_ELECTRODE)
				electrode_select =0;
			p_code++;
		}
        while(((AUDIO_DATA_SECTION==0)&&(process_data0_mark==1))||		// Wait for new sample data
        	  ((AUDIO_DATA_SECTION==1)&&(process_data1_mark==1))||
        	  ((AUDIO_DATA_SECTION==2)&&(process_data2_mark==1))||
        	  ((AUDIO_DATA_SECTION==3)&&(process_data3_mark==1)));
    }
}

/*==============================================================*/
/* External Interrupt0 - Power On or Off */
interrupt void Power_Switch_Isr(void)
{
	Uint16 i;

	for(i=0;i<10;i++)
	{
		GPIO_FSET(IODATA,IO6D,0x0001);			// Dark the Green LED
		delay();
		GPIO_FSET(IODATA,IO6D,0x0000);			// Light the Green LED
		delay();
	}
	IRQ_clear(IRQ_EVT_INT0);
}

/* External Interrupt1 - Select a Signal form Micphone or Line in */
interrupt void Signal_Alter_Isr(void)
{   
	Uint16 WM8950_R2[2];		// R2 - Power Manage2 Register
	Uint16 WM8950_R32[2];		// R32 - ALC Control Register1
	Uint16 WM8950_R44[2];		// R44 - Input Control Register
	Uint16 WM8950_R47[2];		// R47 - ADC Boost Control Register
	
	if(SIGNAL_SELECT==0) 
	{
		SIGNAL_SELECT = 1;
		
		WM8950_R2[0] = 0x04;
		WM8950_R2[1] = 0x01;
		WM8950_R32[0] = 0x40;
		WM8950_R32[1] = 0x00;
		WM8950_R44[0] = 0x58;
		WM8950_R44[1] = 0x00;
		WM8950_R47[0] = 0x5e;
		WM8950_R47[1] = 0x00;
	
		I2C_write(WM8950_R2,2,1,I2C_Addr,1,30000);
		I2C_write(WM8950_R32,2,1,I2C_Addr,1,30000);
		I2C_write(WM8950_R44,2,1,I2C_Addr,1,30000);
		I2C_write(WM8950_R47,2,1,I2C_Addr,1,30000);
	}
	else
	{
		SIGNAL_SELECT = 0;
		
		WM8950_R2[0] = 0x04;
		WM8950_R2[1] = 0x15;
		WM8950_R32[0] = 0x41;
		WM8950_R32[1] = 0x38;
		WM8950_R44[0] = 0x58;
		WM8950_R44[1] = 0x03;
		WM8950_R47[0] = 0x5f;
		WM8950_R47[1] = 0x00;

		I2C_write(WM8950_R2,2,1,I2C_Addr,1,30000);
		I2C_write(WM8950_R32,2,1,I2C_Addr,1,30000);
		I2C_write(WM8950_R44,2,1,I2C_Addr,1,30000);
		I2C_write(WM8950_R47,2,1,I2C_Addr,1,30000);
	}
	delay();
	IRQ_clear(IRQ_EVT_INT1);
}

/* External Interrupt2 - Cause the Interrupt When Battery Voltage is below a Threshold Defined */
interrupt void Alert_Bat_Isr(void)
{
	Uint16 i;

	for(i=0;i<10;i++)
	{
		GPIO_FSET(IODATA,IO1D,0x0000);		// Light the Red LED
		GPIO_FSET(IODATA,IO6D,0x0001);		// Dark the Green LED
	}
	IRQ_clear(IRQ_EVT_INT2);
}

/* Timer0 Interrupt */
interrupt void Timer0_Isr(void)
{
	if(timer_count0!=0)
	{
		timer_count0--;
		if(timer_count0==0)
		{
			GPIO_FSET(IODATA,IO7D,0);				// Pulse Data Line Become High to send START Bit
		}
	}
	else
	{
		timer_count1--;
		if(timer_count1==0)
		{
			pulse_code_bit_counter--;
			if(pulse_code_bit_counter != 0)
			{
				GPIO_FSET(IODATA,IO7D,1);
				*p_pulse = *p_pulse << 1;
				if((*p_pulse & 0x80000000) == 0)
				{
					timer_count0 = 1;
					timer_count1 = 2;
				}
				else
				{
					timer_count0 = 2;
					timer_count1 = 1;
				}
			}
			else
			{
				GPIO_FSET(IODATA,IO7D,0);
				TIMER_FSET(TCR0,TSS,TIMER_TCR_TSS_STOP);
				TIMER_FSET(TCR1,TSS,TIMER_TCR_TSS_START);				
			}
		}
	}
}

/* Timer1 Interrupt */
interrupt void Timer1_Isr(void)
{
	TIMER_FSET(TCR1,TSS,TIMER_TCR_TSS_STOP);		// Stop Timer1
	
	pulse_counter--;
	if(pulse_counter != 0)							// if One Frame Data hasn't been sent
	{
		GPIO_FSET(IODATA,IO7D,1);
		p_pulse++;
		*p_pulse = *p_pulse << 8;
		TIMER_FSET(TCR0,TSS,TIMER_TCR_TSS_START);
		pulse_code_bit_counter = AMOUNT_CODE_BITS;
		timer_count0 = 2;
		timer_count1 = 1;
	}
}
	
/* DMA Channel 0 Receiver interrupt */
void DMA_rcv_Isr(void)
{
	Uint16 dstAddrHi,dstAddrLo;

	switch(AUDIO_DATA_SECTION)
	{
		case 0:
			AUDIO_DATA_SECTION = 1;
			DMA_FSET(DMACCR0,EN,0x0000u);
			DMA_FSET(DMACSR0,FRAME,0x0000u);
			DMA_FSET(DMACSR0,SYNC,0x0000u);
			dstAddrHi = (Uint16)(((Uint32)(AUDIO_DATA1)) >> 15) & 0xFFFFu;
			dstAddrLo = (Uint16)(((Uint32)(AUDIO_DATA1)) << 1) & 0xFFFFu;
			DMA_RSET(DMACDSAL0,dstAddrLo);
			DMA_RSET(DMACDSAU0,dstAddrHi);
			DMA_FSET(DMACCR0,ENDPROG,DMA_DMACCR_ENDPROG_ON);
			DMA_FSET(DMACCR0,EN,0x0001u);
			p_pulse = PULSE_DATA1;
			break;
				
		case 1:
			AUDIO_DATA_SECTION = 2;
			DMA_FSET(DMACCR0,EN,0x0000u);
			DMA_FSET(DMACSR0,FRAME,0x0000u);
			DMA_FSET(DMACSR0,SYNC,0x0000u);
			dstAddrHi = (Uint16)(((Uint32)(AUDIO_DATA2)) >> 15) & 0xFFFFu;
			dstAddrLo = (Uint16)(((Uint32)(AUDIO_DATA2)) << 1) & 0xFFFFu;
			DMA_RSET(DMACDSAL0,dstAddrLo);
			DMA_RSET(DMACDSAU0,dstAddrHi);
			DMA_FSET(DMACCR0,ENDPROG,DMA_DMACCR_ENDPROG_ON);
			DMA_FSET(DMACCR0,EN,0x0001u);
			p_pulse = PULSE_DATA0;
			break;
		
		case 2:
			AUDIO_DATA_SECTION = 3;
			DMA_FSET(DMACCR0,EN,0x0000u);
			DMA_FSET(DMACSR0,FRAME,0x0000u);
			DMA_FSET(DMACSR0,SYNC,0x0000u);
			dstAddrHi = (Uint16)(((Uint32)(AUDIO_DATA3)) >> 15) & 0xFFFFu;
			dstAddrLo = (Uint16)(((Uint32)(AUDIO_DATA3)) << 1) & 0xFFFFu;
			DMA_RSET(DMACDSAL0,dstAddrLo);
			DMA_RSET(DMACDSAU0,dstAddrHi);
			DMA_FSET(DMACCR0,ENDPROG,DMA_DMACCR_ENDPROG_ON);
			DMA_FSET(DMACCR0,EN,0x0001u);
			p_pulse = PULSE_DATA1;
			break;
		
		case 3:
			AUDIO_DATA_SECTION = 0;
			DMA_FSET(DMACCR0,EN,0x0000u);
			DMA_FSET(DMACSR0,FRAME,0x0000u);
			DMA_FSET(DMACSR0,SYNC,0x0000u);
			dstAddrHi = (Uint16)(((Uint32)(AUDIO_DATA0)) >> 15) & 0xFFFFu;
			dstAddrLo = (Uint16)(((Uint32)(AUDIO_DATA0)) << 1) & 0xFFFFu;
			DMA_RSET(DMACDSAL0,dstAddrLo);
			DMA_RSET(DMACDSAU0,dstAddrHi);
			DMA_FSET(DMACCR0,ENDPROG,DMA_DMACCR_ENDPROG_ON);
			DMA_FSET(DMACCR0,EN,0x0001u);
			p_pulse = PULSE_DATA0;
			break;
				
		default:
			AUDIO_DATA_SECTION = 0;
			DMA_FSET(DMACCR0,EN,0x0000u);
			DMA_FSET(DMACSR0,FRAME,0x0000u);
			DMA_FSET(DMACSR0,SYNC,0x0000u);
			dstAddrHi = (Uint16)(((Uint32)(AUDIO_DATA0)) >> 15) & 0xFFFFu;
			dstAddrLo = (Uint16)(((Uint32)(AUDIO_DATA0)) << 1) & 0xFFFFu;
			DMA_RSET(DMACDSAL0,dstAddrLo);
			DMA_RSET(DMACDSAU0,dstAddrHi);
			DMA_FSET(DMACCR0,ENDPROG,DMA_DMACCR_ENDPROG_ON);
			DMA_FSET(DMACCR0,EN,0x0001u);
			p_pulse = PULSE_DATA0;
			break;
	}	
	
	*p_pulse = *p_pulse << 8;
	pulse_code_bit_counter = AMOUNT_CODE_BITS;
	pulse_counter = AMOUNT_DATA_FRAME;
	timer_count0 = 2;
	timer_count1 = 1;
	
	GPIO_FSET(IODATA,IO7D,0x0001);				// Pulse Data Line Become High to send Start Bit
	TIMER_FSET(TCR0,TSS,TIMER_TCR_TSS_START);	// Start Timer0
}

/******************************************************************************/

⌨️ 快捷键说明

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