?? interruptc.c
字號(hào):
// 中斷服務(wù)程序
//--------------------------------------------------------------------
// SMBus中斷服務(wù)程序
void SMBUS_ISR (void) interrupt 7
{
switch (SMB0STA)
{
// SMBus狀態(tài)碼SMB0STA寄存器
// 主發(fā)送器/接收器起始條件已發(fā)送
// 在該狀態(tài)發(fā)送的COMMAND字的R/W位總是為0(W)
// 因?yàn)閷?duì)于讀和寫操作來說都必須先寫存儲(chǔ)器地址
case SMB_START:
SMB0DAT = (COMMAND & 0xFE); // 裝入要訪問的從器件的地址
STA = 0; // 手動(dòng)清除START位
break;
//主發(fā)送器/接收器重復(fù)起始條件已發(fā)送
// 該狀態(tài)只應(yīng)在讀操作期間出現(xiàn)在存儲(chǔ)器地址已發(fā)送并得到確認(rèn)之后
case SMB_RP_START:
SMB0DAT = COMMAND; // COMMAND中應(yīng)保持從地址 + R.
AA=1;
STA = 0;
break;
// 主發(fā)送器從地址 + WRITE已發(fā)送收到ACK
case SMB_MTADDACK:
SMB0DAT = LOW_ADD; // 裝入待寫存儲(chǔ)器地址的高字節(jié)
break;
// 主發(fā)送器從地址 + WRITE已發(fā)送收到NACK
// 從器件不應(yīng)答發(fā)送STOP + START重試
case SMB_MTADDNACK:
STO = 1;
STA = 1;
break;
// 主發(fā)送器數(shù)據(jù)字節(jié)已發(fā)送收到ACK
// 該狀態(tài)在寫和讀操作中都要用到BYTE_NUMBER看存儲(chǔ)器地址狀態(tài) - 如果
// 只發(fā)送了HIGH_ADD則裝入LOW_ADD如果LOW_ADD已發(fā)送檢查COMMAND
// 中的R/W 值以決定下一狀態(tài)
case SMB_MTDBACK:
if (COMMAND & 0x01) // 如果R/W=READ發(fā)送重復(fù)起始條件
{
//reversec=30;
STA = 1;
STEP = 1;//0表示還未寫地址,1表示地址已寫,2表示讀到第一個(gè)字節(jié),3表示讀到第一個(gè)字節(jié)。。。
}
else
{
if(BYTE_NUMBER>0)
{
SMB0DAT = WORD; // 如果R/W=WRITE裝入待寫字節(jié)
BYTE_NUMBER--;
}
else
{
STO = 1;
SM_BUSY = 0; // 釋放SMBus
}
}
break;
// 主發(fā)送器數(shù)據(jù)字節(jié)已發(fā)送收到NACK
// 從器件不應(yīng)答發(fā)送STOP + START重試
case SMB_MTDBNACK:
STO = 1;
STA = 1;
break;
// 主發(fā)送器競爭失敗
// 不應(yīng)出現(xiàn)如果出現(xiàn)重新開始傳輸過程
case SMB_MTARBLOST:
STO = 1;
STA = 1;
break;
// 主接收器從地址 + READ 已發(fā)送收到ACK
// 設(shè)置為在下一次傳輸后發(fā)送NACK因?yàn)槟菍⑹亲詈笠粋€(gè)字節(jié)唯一
case SMB_MRADDACK:
AA = 1; // 在應(yīng)答周期ACK
break;
// 主接收器從地址 + READ 已發(fā)送收到NACK
// 從器件不應(yīng)答發(fā)送重復(fù)起始條件重試
case SMB_MRADDNACK:
STA = 1;
break;
// 收到數(shù)據(jù)字節(jié)ACK已發(fā)送
// 該狀態(tài)不應(yīng)出現(xiàn)因?yàn)锳A已在前一狀態(tài)被清0如果出現(xiàn)發(fā)送停止條件
case SMB_MRDBACK:
//RECVCHARS[STEP-1]= revolve(SMB0DAT);
RECVCHARS[STEP-1]= SMB0DAT;
STEP++;
if (STEP>(RECVLEN-1)) AA= 0;
break;
// 收到數(shù)據(jù)字節(jié)NACK已發(fā)送
// 讀操作已完成讀數(shù)據(jù)寄存器后發(fā)送停止條件
case SMB_MRDBNACK:
//RECVCHARS[STEP-1]= revolve(SMB0DAT);
STEP=0;
STO = 1;
SM_BUSY = 0; // 釋放SMBus
break;
// 在本應(yīng)用中所有其它狀態(tài)碼沒有意義通信復(fù)位
default:
STO = 1; // 通信復(fù)位
SM_BUSY = 0;
break;
}
SI=0; // 清除中斷標(biāo)志
}
void RBuf (void) interrupt 4 //using 3
{
unsigned char tchar;
EA=0;
if (RI)
{
TR2 = 0;
TH2 =0xfe; //等待10個(gè)字節(jié)時(shí)須在16位模式下設(shè)置為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 //串口超時(shí)檢測
{
TR2 =0; //停計(jì)數(shù)器2
TF2 =0; //清溢出標(biāo)志位
ES0=0;
TestVar5=0x66;
if(DataNo>0)
{
DataNo=0 ;
Pos=0;
Head=0;
}
ES0=1;
}
void Timer3_ISR (void) interrupt 14 //定時(shí)讀取參數(shù)
{
TMR3CN &= ~(0x80); // clear TF3
S_SMBUS=1;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -