keil c 程序乱跳不能设置断点
以下为C语言程序,IIC中断处理
当I2C0->I2CSTATUS 的值为0x20时不能跳到0x20处
并且在0x20处不能设置断点 好悲剧,求指导
看图片, 值为0x8但是他执行完0x8后 有去执行别的!!!!
void I2C0_IRQHandler(void)
{
switch(I2C0->I2CSTATUS)
{
case 0x00:
{
I2C0-> I2CON |= 0x1<<4; // 发送停止
break;
}
case 0x08: //发送了起始,应该发送地址+W
{
I2C0-> I2CDAT = address ;
}
break;
case 0x10: //主机发送了重起,应该发送地址+R/W
{
if(R_W)
I2C0-> I2CDAT = address|0x1 ;
else
I2C0-> I2CDAT = address ;
}
break;
case 0x18: //主机发送了地址和W,应该写数
{
if(data_count==0 )
I2C0-> I2CON |= 0x1<<4; // 发送停止
else
{
I2C0-> I2CDAT = *data;
data_count--;
data++;
}
}
break;
case 0x20: //主机发送了地址+R/W,接收到NAK, 可以重启,或者停止
{
I2C0-> I2CON |= 0x3<<4; // 发送停止和重启
data=data_backup;
data_count= data_count_backup;
}
break;
case 0x28: //主机发送了数据,接收到了ACK, 接着传输数据,或者发送停止
{
if(data_count==0 )
I2C0-> I2CON |= 0x1<<4; // 发送停止
else
{
I2C0-> I2CDAT = *data;
data_count--;
data++;
}
}
break;
case 0x30: //主机传送了数据,接收到了NAK, 可以重启,或者停止
{
I2C0-> I2CON |= 0x3<<4; // 发送停止和重启
data=data_backup;
data_count= data_count_backup;
}
break;
case 0x40: //主机发送了 地址+R,接收到了ACK, 准备接收数据
{
if(data_count==0 )
I2C0-> I2CON |= 0x1<<4; // 发送停止
else
{
I2C0-> I2CON |= 0x1<<2; // 准备ACK
*data = I2C0-> I2CDAT;
data_count--;
data++;
}
}
break;
case 0x48: //主机发送了 地址+R,接收到了NAK, 可以重启,或者停止
{
I2C0-> I2CON |= 0x3<<4; // 发送停止和重启
data=data_backup;
data_count= data_count_backup;
}
break;
case 0x50: //主机接收到了数据,发送了ACK, 准备接收数据,发送ACK或NAK
{
if(data_count==1 )
{
I2C0-> I2CON &= ~(0x1<<2); // 准备NAK
*data = I2C0-> I2CDAT;
}
else
{
I2C0-> I2CON |= 0x1<<2; // 准备ACK
*data = I2C0-> I2CDAT;
data_count--;
data++;
}
}
break;
case 0x58: //主机接收了数据,发送了NAK, 可以重启,或者停止
{
I2C0-> I2CON |= 0x1<<4; // 发送停止
}
break;
}
//清除中断标志位
I2C0-> I2CON |= 0x1<<3;
}