📄 interruptc.#1
字号:
// 中断服务程序
//--------------------------------------------------------------------
// SMBus中断服务程序
void SMBUS_ISR (void) interrupt 7
{
switch (SMB0STA)
{
// SMBus状态码SMB0STA寄存器
// 主发送器/接收器起始条件已发送
// 在该状态发送的COMMAND字的R/W位总是为0(W)
// 因为对于读和写操作来说都必须先写存储器地址
case SMB_START:
SMB0DAT = (COMMAND & 0xFE); // 装入要访问的从器件的地址
STA = 0; // 手动清除START位
break;
//主发送器/接收器重复起始条件已发送
// 该状态只应在读操作期间出现在存储器地址已发送并得到确认之后
case SMB_RP_START:
SMB0DAT = COMMAND; // COMMAND中应保持从地址 + R.
AA=1;
STA = 0;
break;
// 主发送器从地址 + WRITE已发送收到ACK
case SMB_MTADDACK:
SMB0DAT = LOW_ADD; // 装入待写存储器地址的高字节
break;
// 主发送器从地址 + WRITE已发送收到NACK
// 从器件不应答发送STOP + START重试
case SMB_MTADDNACK:
STO = 1;
STA = 1;
break;
// 主发送器数据字节已发送收到ACK
// 该状态在写和读操作中都要用到BYTE_NUMBER看存储器地址状态 - 如果
// 只发送了HIGH_ADD则装入LOW_ADD如果LOW_ADD已发送检查COMMAND
// 中的R/W 值以决定下一状态
case SMB_MTDBACK:
if (COMMAND & 0x01) // 如果R/W=READ发送重复起始条件
{
//reversec=30;
STA = 1;
STEP = 1;//0表示还未写地址,1表示地址已写,2表示读到第一个字节,3表示读到第一个字节。。。
}
else
{
if(BYTE_NUMBER>0)
{
SMB0DAT = WORD; // 如果R/W=WRITE装入待写字节
BYTE_NUMBER--;
}
else
{
STO = 1;
SM_BUSY = 0; // 释放SMBus
}
}
break;
// 主发送器数据字节已发送收到NACK
// 从器件不应答发送STOP + START重试
case SMB_MTDBNACK:
STO = 1;
STA = 1;
break;
// 主发送器竞争失败
// 不应出现如果出现重新开始传输过程
case SMB_MTARBLOST:
STO = 1;
STA = 1;
break;
// 主接收器从地址 + READ 已发送收到ACK
// 设置为在下一次传输后发送NACK因为那将是最后一个字节唯一
case SMB_MRADDACK:
AA = 1; // 在应答周期ACK
break;
// 主接收器从地址 + READ 已发送收到NACK
// 从器件不应答发送重复起始条件重试
case SMB_MRADDNACK:
STA = 1;
break;
// 收到数据字节ACK已发送
// 该状态不应出现因为AA已在前一状态被清0如果出现发送停止条件
case SMB_MRDBACK:
//RECVCHARS[STEP-1]= revolve(SMB0DAT);
RECVCHARS[STEP-1]= SMB0DAT;
STEP++;
if (STEP>(RECVLEN-1)) AA= 0;
break;
// 收到数据字节NACK已发送
// 读操作已完成读数据寄存器后发送停止条件
case SMB_MRDBNACK:
//RECVCHARS[STEP-1]= revolve(SMB0DAT);
STEP=0;
STO = 1;
SM_BUSY = 0; // 释放SMBus
break;
// 在本应用中所有其它状态码没有意义通信复位
default:
STO = 1; // 通信复位
SM_BUSY = 0;
break;
}
SI=0; // 清除中断标志
}
void RBuf (void) interrupt 4 //using 3
{
unsigned char tchar;
EA=0;
if (RI)
{
TR2 = 0;
TH2 =0xfe; //等待10个字节时须在16位模式下设置为0xf933
TL2 =0xfb;
TR2 = 1;
if(DataNo<RBUFSIZE)
{
RData[Pos]=SBUF;
Pos++;
Pos%=RBUFSIZE;
DataNo++;
}
else
{
tchar=SBUF;
TestVar=tchar;
}
RI=0;
}
if(TI)
{
TI=0;
if(DataSended>0)
{
if(DataSended<20)
{
SBUF=SData[DataSended];
DataSended++;
TestVar4=DataSended;
}
else
{
SData[0] =0;
DataSended =0;
}
}
}
EA=1;
return;
}
void Timer0_ISR (void) interrupt 1 //DA REFRESH TIMER
{
DAC0L=DALOW;
DAC0H=DAHIGH;
}
void Timer2_ISR (void) interrupt 5 //串口超时检测
{
TR2 =0; //停计数器2
TF2 =0; //清溢出标志位
ES0=0;
TestVar5=0x66;
if(DataNo>0)
{
DataNo=0 ;
Pos=0;
Head=0;
}
ES0=1;
}
void Timer3_ISR (void) interrupt 14 //定时读取参数
{
TMR3CN &= ~(0x80); // clear TF3
S_SMBUS=1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -