📄 interrupt.#1
字号:
#include "C8051F330.H"
#include "IR_Rx_Tx.h"
extern unsigned char DataAvailByte;
extern int IR_Key;
extern char IRsampData[40];
extern char SampNo;
extern char SampNoData;
extern BOOL bAddrRecv;
extern unsigned char* pSMB_DATA_OUT;
extern unsigned char SMB_DATA_LEN;
unsigned char i_Tx;
//-----------------------------------------------------------------------------
// SMBus Interrupt
//-----------------------------------------------------------------------------
void Interrupt_SMBus(void) interrupt 7
{
switch (SMB0CN & 0xF0) // Status vector
{
//static char i;
static unsigned char AddrTemp;
// Detect a START condition and a slave address.
case SMBus_DetectSTA:
STA = 0;
ACK = 0;
AddrTemp = 0;
AddrTemp = SMB0DAT;
if((SMB0DAT&0xFE)==0xE0)
{
ACK = 1;
SMB0DAT = 0x55;
}
if((SMB0DAT&0xFE)==0xE2) // The address received is correct
{
ACK = 1;
SMB0DAT = DataAvailByte; // transmitt DataAvailByte
}
if((SMB0DAT&0xFE)==0xE4)
{
ACK = 1;
i_Tx = 0;
SMB0DAT = *pSMB_DATA_OUT;
pSMB_DATA_OUT++;
i_Tx++;
}
break;
// A slave byte was received
case SMBus_RxData:
break;
// A slave byte was transmitted and Validate the ACK
case SMBus_TxData:
if(ACK)
{
if(AddrTemp==SMBus_FlagAddress)
;
else if(AddrTemp==SMBus_DataAddress)
{
if(i_Tx<SMB_DATA_LEN)
{
SMB0DAT = *pSMB_DATA_OUT;
pSMB_DATA_OUT++;
i_Tx++;
}
if(i_Tx==SMB_DATA_LEN)
{
DataAvailByte = FALSE;
pSMB_DATA_OUT = IRsampData;
i_Tx = 0;
}
}
}
else
{
if(i_Tx==SMB_DATA_LEN)
{
DataAvailByte = FALSE;
}
pSMB_DATA_OUT = IRsampData;
i_Tx = 0;
}
break;
// Detect a STOP condition ---- No action need to do
case SMBus_TxSTO:
DataAvailByte = FALSE;
break;
case SMBus_RxSTO:
STO = 0; // STO must be cleared by software when
// a STOP is detected as a slave
break;
default:
SMB0CN &= ~0x40; // Reset communication
SMB0CN |= 0x40;
ACK = 0;
STA = 0;
STO = 1;
break;
}
SI = 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -