📄 cochlear.c
字号:
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 + -