📄 cochlear1.c
字号:
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 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
delay();
GPIO_FSET(IODATA,IO1D,0x0001); // Dark the Red LED
delay();
}
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 + -