📄 interru.c
字号:
#include <head.h> // SFR declarations
/*
void Timer2_ISR (void) interrupt 5
{
TF2 = 0;
}
*/
void SMBUS_ISR (void) interrupt 7
{
switch (SMB0STA) // Status code for the SMBus
{
// 起始条件已发出,典型操作:
// 将从地址+R/W装入到SMB0DAT,STA=0
case SMB_START://0x08
if(StartReadflag)
{
SMB0DAT = 0xa3; // read
}
else SMB0DAT = 0xa2; // write
STA = 0; // Manually clear STA bit
SI = 0; // Clear interrupt flag
break;
// 重复起始条件已发出,典型操作:
// 将从地址+R/W装入到SMB0DAT,STA=0
case SMB_RP_START://0x10
if(StartReadflag)
{ SMB0DAT = 0xa3; }
else SMB0DAT = 0xa2; // write
STA = 0; // Manually clear START bit.
SI = 0;
break;
// 从地址+W 已发出,收到ACK,典型操作:
// 将要发送的数据装入SMB0DAT
case SMB_MTADDACK://0x18
if(RWflag == I2CREAD)
{ SMB0DAT = 0x00; } // 从地址0x00开始读
if(RWflag == I2CWRITE)
{ PcfPoint =0;SMB0DAT = 0x00;}// 从地址0x00开始写
SI = 0; // Clear interrupt flag
break;
// 从地址+W 已发出,收到NACK,典型操作:
// 确认查询重试,置位STO+STA
case SMB_MTADDNACK://0x20
STO = 1;
// delay(2000);
STA = 1;
SI = 0; // Clear interrupt flag
break;
// 数据字节已发出,收到ACK,典型操作:将下一字节装入到
// SMB0DAT,或置位STO,或置位STA,以发送重复起始条件
case SMB_MTDBACK://0x28
if(RWflag == I2CREAD)
{
STO = 1;
delay(100);
STA = 1;
PcfPoint = 0;
StartReadflag = 1;
}
else if(PcfPoint == 0x10)
{
RWflag = I2CREAD; // read
STO = 1;
delay(100);
STA = 1;
PcfPoint = 0;
}
else
{
SMB0DAT = Pcf8563.Time[PcfPoint++];
}
SI = 0;
break;
// 数据字节已发出,收到NACK,典型操作:重试传输或置位STO
case SMB_MTDBNACK://0x30
STO = 1;
delay(100);
STA = 1;
SI = 0; // Clear interrupt flag
break;
// 竞争失败,典型操作:保存当前数据
case SMB_MTARBLOST://0x38
SI = 0; // Clear interrupt flag
break;
// 从地址+R已发出,收到ACK,典型操作:如果只接收一个字节,
// 清AA位(收到字节后发送NACK),等待接收数据
case SMB_MRADDACK://0x40
PcfPoint = 0x00; // NACK sent during acknowledge cycle.
SI = 0;
break;
// 从地址+R已发出,收到NACK,典型操作:确认查询重试,
// 置位STO+STA
case SMB_MRADDNACK://0x48
STO = 1;
// delay(2000);
STA = 1;
SI = 0;
break;
// 数据字节已收到,ACK已发出,典型操作:读SMB0DAT,
// 等待下一字节,若下一字节是最后字节,清楚AA
case SMB_MRDBACK://0x50
Pcf8563.Time[PcfPoint++] = SMB0DAT;
if(PcfPoint == 0x0f)
{ AA = 0;PcfPoint = 0;StartReadflag = 0;}
SI = 0;
break;
// 数据字节已收到,NACK已发出,典型操作:置位STO
case SMB_MRDBNACK://0x58
STO = 1;
Pcf8563.Time[0x0f] = SMB0DAT;
Readoverflag = 1; // 已经读完
AA = 1; // Set AA for next transfer
SI = 0;
break;
default:
SI = 0;
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -