资源说明:stm8si2c程序,调试通过
INTERRUPT_HANDLER(I2C_IRQHandler, 19)
{
/* In order to detect unexpected events during development,
it is recommended to set a breakpoint on the following instruction.
*/
struct SCB_T *system=&system_process;
unsigned char i,i2c_sr1,i2c_sr2,i2c_event,i2c__status=0,temp,sr1_analysis_int_resource[8],sr2_analysis_int_resource[8];
char i2c_interrupt_type=0,p;//在一次I2中断中,I2C中断中的中断标志位个数;
disableInterrupts();//关总中断
i2c_sr1=I2C->SR1;
p=I2C->SR3;
i2c_sr2=I2C->SR2;
//temp=I2C->SR3;
//analysis interrupt resource in i2c->sr1 register
sr1_analysis_int_resource[0]=i2c_sr1&I2C_SR1_SB;
sr1_analysis_int_resource[1]=i2c_sr1&I2C_SR1_ADDR;
sr1_analysis_int_resource[2]=i2c_sr1&I2C_SR1_BTF;
sr1_analysis_int_resource[3]=i2c_sr1&I2C_SR1_ADD10;
sr1_analysis_int_resource[4]=i2c_sr1&I2C_SR1_STOPF;
// sr1_i2c__state[5]=i2c_state&((u8)I2C_SR1_BIT6);
sr1_analysis_int_resource[6]=i2c_sr1&I2C_SR1_RXNE;
sr1_analysis_int_resource[7]=i2c_sr1&I2C_SR1_TXE;
//analysis interrupt resource in i2c->sr2 register
sr2_analysis_int_resource[0]=i2c_sr2&I2C_SR2_BERR;
sr2_analysis_int_resource[1]=i2c_sr2&I2C_SR2_ARLO;
sr2_analysis_int_resource[2]=i2c_sr2&I2C_SR2_AF;
sr2_analysis_int_resource[3]=i2c_sr2&I2C_SR2_OVR;
sr2_analysis_int_resource[5]=i2c_sr2&I2C_SR2_WUFH;
if(sr1_analysis_int_resource[0]==I2C_SR1_SB) {i2c__status=0x01;i2c_interrupt_type++;}
if(sr1_analysis_int_resource[1]==I2C_SR1_ADDR) {i2c__status=0x02;i2c_interrupt_type++;}
if(sr1_analysis_int_resource[2]==I2C_SR1_BTF) {i2c__status=0x03;i2c_interrupt_type++;}
if(sr1_analysis_int_resource[3]==I2C_SR1_ADD10) {i2c__status=0x04;i2c_interrupt_type++;}
if(sr1_analysis_int_resource[4]==I2C_SR1_STOPF) {i2c__status=0x05;i2c_interrupt_type++;}
if(sr1_analysis_int_resource[6]==I2C_SR1_RXNE) {i2c__status=0x06;i2c_interrupt_type++;}
if(sr1_analysis_int_resource[7]==I2C_SR1_TXE) {i2c__status=0x07;i2c_interrupt_type++;}
if(sr2_analysis_int_resource[0]==I2C_SR2_BERR) {i2c__status=0x08;i2c_interrupt_type++;}
if(sr2_analysis_int_resource[1]==I2C_SR2_ARLO) {i2c__status=0x09;i2c_interrupt_type++;}
if(sr2_analysis_int_resource[2]==I2C_SR2_AF) {i2c__status=0x0a;i2c_interrupt_type++;}
if(sr2_analysis_int_resource[3]==I2C_SR2_OVR) {i2c__status=0x0b;i2c_interrupt_type++;}
if(sr2_analysis_int_resource[5]==I2C_SR2_WUFH) {i2c__status=0x0c;i2c_interrupt_type++;}
if(i2c_interrupt_type>=2) /*there are more than one interrupt resource in the time*/
{
if(i2c_interrupt_type==2)
{
if((sr1_analysis_int_resource[1]==I2C_SR1_ADDR)&&(sr1_analysis_int_resource[7]==I2C_SR1_TXE))
{
I2C->DR=system->i2c.send_frame.data[system->i2c.send_frame.proc];
system->i2c.send_frame.proc++;
system->i2c.debug.reserve[system->i2c.int_debug_count].type=0x62;
}
else if((sr1_analysis_int_resource[7]==I2C_SR1_TXE)&&(sr1_analysis_int_resource[2]==I2C_SR1_BTF))
{
system->i2c.send_frame.terminate=0; //set I2C transfer terminate bit;
system->i2c.send_frame.mod=0;
system->i2c.send_frame.write=0;
system->i2c.debug.reserve[system->i2c.int_debug_count].type=0x64;
}
else if((sr1_analysis_int_resource[7]==I2C_SR1_TXE)&&(sr2_analysis_int_resource[2]==I2C_SR2_AF))
{
I2C->CR2|=I2C_CR2_STOP;
I2C->SR2&=(~I2C_SR2_AF);//clear AF bit;
system->i2c.error=1;
system->i2c.debug.reserve[system->i2c.int_debug_count].type=0x64;
}
else
{ system->i2c.error=1;
I2C_ITConfig(I2C_IT_EVT, DISABLE);
system->i2c.debug.reserve[system->i2c.int_debug_count].type=0x37;
}
}
else
{
system->i2c.error=1;
I2C_ITConfig(I2C_IT_EVT, DISABLE);
system->i2c.debug.reserve[system->i2c.int_debug_count].type=0x37;
}
}
else
{
switch(i2c__status)
{
case I2C_SR1_SB_proc:
//如果是发送模式
if(system->i2c.send_frame.mod==1)//说明本次中断之前是从模式,说明这是在从模式下发的起始位;
{ //EV5
p=I2C->SR1;
I2C->DR=system->i2c.send_frame.add__L; //自动清除I2C_SR1_SB标志
system->i2c.debug.reserve[system->i2c.int_debug_count].type=0x38;
}
else
{
if(system->i2c.rev_frame.mod==1) //说明本次中断之间是主模式,这次发的是重复起始位;
{ //EV6如果是接收模式
p=I2C->SR1;
I2C->DR=system->i2c.rev_frame.add__L;//自动清除I2C_SR1_SB标志;
system->i2c.debug.reserve[system->i2c.int_debug_count].type=0x51;
}
else
{
system->i2c.error=1;
system->i2c.debug.reserve[system->i2c.int_debug_count].type=0x36;
}
}
break;
case I2C_SR1_ADDR_proc:
p=I2C->SR1;
temp=I2C->SR3;//软件读取SR1寄存器后,对SR3寄存器的读操作将清除该位
temp&=(u8)I2C_SR3_TRA;
I2C->CR2|=(u8)I2C_CR2_ACK;// 使能应答位
I2C->CR2&=(u8)(~I2C_CR2_POS);//设置接受到当字节应答
//如果是发送模式
if(system->i2c.send_frame.mod==1)
{
if(temp==(u8)I2C_SR3_TRA)
{;
}
else
{
system->i2c.error=1;
}
}
else
{
if(system->i2c.rev_frame.mod==1)
{
if(temp==0)//machine at a master-receive mod
{
system->i2c.rev_frame.proc=0;
}
else
{
system->i2c.error=1;
}
}
else
{
system->i2c.error=1;
}
}
system->i2c.debug.reserve[system->i2c.int_debug_count].type=0x52;
break;
case I2C_SR1_RXNE_proc:
if(system->i2c.rev_frame.proc<=(u8)(system->i2c.rev_frame.num-3))
{
system->i2c.rev_frame.data[system->i2c.rev_frame.proc]=I2C->DR;
system->i2c.rev_frame.proc++;
system->i2c.debug.reserve[system->i2c.int_debug_count].type=0x57;
}
else if(system->i2c.rev_frame.proc==(u8)(system->i2c.rev_frame.num-2))
{
system->i2c.rev_frame.data[system->i2c.rev_frame.proc]=I2C->DR;
system->i2c.rev_frame.proc++;
system->i2c.debug.reserve[system->i2c.int_debug_count].type=0x58;
I2C->CR2&=(u8)(~I2C_CR2_ACK);//不返回应答
I2C->CR2|=I2C_CR2_STOP; //发停止位结束这次数据接收;
}
else if(system->i2c.rev_frame.proc>=(u8)(system->i2c.rev_frame.num-1))
{
system->i2c.rev_frame.data[system->i2c.rev_frame.proc]=I2C->DR;
system->i2c.rev_frame.proc++;
system->i2c.debug.reserve[system->i2c.int_debug_count].type=0x59;
system->i2c.rev_frame.terminate=0; //set I2C transfer terminate bit;
system->i2c.rev_frame.mod=0;
system->i2c.rev_frame.read=0;
}
else
{ system->i2c.error=1;
system->i2c.debug.reserve[system->i2c.int_debug_count].type=0xfb;
}
break;
case I2C_SR1_TXE_proc:
if(system->i2c.send_frame.proc<=(u8)(system->i2c.send_frame.num-1))
{
I2C->DR=system->i2c.send_frame.data[system->i2c.send_frame.proc];
system->i2c.send_frame.proc++;
system->i2c.debug.reserve[system->i2c.int_debug_count].type=0x61;
}
else if(system->i2c.send_frame.proc=(u8)(system->i2c.send_frame.num))
{
I2C->CR2|=I2C_CR2_STOP; // 发停止位结束 这次数据接收;
I2C_ITConfig(I2C_IT_BUF, DISABLE);
system->i2c.debug.reserve[system->i2c.int_debug_count].type=0x60;
}
else
{
system->i2c.error=1;
system->i2c.debug.reserve[system->i2c.int_debug_count].type=0xfc;
}
break;
case I2C_SR2_AF_proc:
I2C->CR2|=I2C_CR2_STOP;
I2C->SR2&=(~I2C_SR2_AF);//clear AF bit;
system->i2c.error=1;
system->i2c.debug.reserve[system->i2c.int_debug_count].type=0x63;
break;
default: system->i2c.error=1;
system->i2c.debug.reserve[system->i2c.int_debug_count].type=0xfd;
break;
}
}
system->i2c.int_debug_count++;
enableInterrupts();//开总中断
}
本源码包内暂不包含可直接显示的源代码文件,请下载源码包。
English
