仿真进入不了中断,函数 EEPROM_ByteWrite 没执行,求大神解答!
#include "c8051F392.h"
#include "iic.h"
void delay(int);
sbit EN_1151P = P0^5;
main(void)
{
unsigned char temp_char[1];
EN_1151P = 0;
PCA0MD &= ~0x40; //WDT
Port_IO_Init();
Oscillator_Init();
I2C_Init();
Timer3_Init();
EA = 1 ; //开中断
while(1)
{
EEPROM_ByteWrite(0X00, 0x08);
EEPROM_ByteWrite(0X01, 0x01);
EEPROM_ByteWrite(0X02, 0x05);
EEPROM_ByteWrite(0X03, 0x07);
EEPROM_ByteWrite(0X07, 0x01);
EEPROM_ByteWrite(0X0B, 0x80);
EEPROM_ByteWrite(0X0C, 0x80);
EEPROM_ByteWrite(0X0D, 0x80);
temp_char[0] = EEPROM_ByteRead(0x0F);
delay(1000);
SMBus_ISR ();
}
}
void delay (int i)
{
int m;
for(m=0;m<i;m++);
}
//以下中断函数:
char Tran_Flag;
char xdata sRecComBuf[8];
char *pointer;
void Timer3_ISR (void) interrupt 14 //Timer3_ISR
{
SMB0CF &= ~0x80; // 禁止
SMB0CF |= 0x80; // 打开
TMR3CN &= ~0x80; // 清除
SMB_BUSY=0; //MARK
}
void SMBus_ISR (void) interrupt 7 //SMBus_ISR
{
bit FAIL = 0; // 标志位---ISR
static char i; // 发或收的计数
static bit SEND_START = 0;
switch (SMB0CN & 0xF0) //状态
{
case SMB_MTSTA:
SMB0DAT = TARGET; // 连接目标从机地址
SMB0DAT |= SMB_RW; // 连接R/W
STA = 0; // 清除开始位
i = 0; // 重置数据字节计数
break;
case SMB_MTDB:
if (ACK) // 应答
{
if (SEND_START)
{
STA = 1;
SEND_START = 0;
break;
}
if(SMB_SENDWORDADDR) // 是否发送?
{
SMB_SENDWORDADDR = 0; // 清标志位
SMB0DAT = WORD_ADDR; // 发高8位地址
/* if (SMB_RANDOMREAD)
{
SEND_START = 1;
SMB_RW = READ;
}*/
break;
}
else if(SMB_SENDWORDADDR1)
{
SMB_SENDWORDADDR1 = 0;
SMB0DAT = WORD_ADDR1; // 发低8位地址
if (SMB_RANDOMREAD)
{
SEND_START = 1; // 在下一个ACK后发STA
SMB_RW = READ;
}
break;
}
if (SMB_RW==WRITE) // 写?
{
if (i < SMB_DATA_LEN)
{
SMB0DAT = *pSMB_DATA_OUT;
pSMB_DATA_OUT++;
i++;
}
else
{
STO = 1; // 停止传输
SMB_BUSY = 0; // 清除
}
}
else {}
}
else // NACK,
{
if(SMB_ACKPOLL)
{
STA = 1; // 重发
}
else
{
FAIL = 1; // 发送失败
}
}
break;
case SMB_MRDB: //接收
if ( i < SMB_DATA_LEN )
{
*pSMB_DATA_IN = SMB0DAT;
pSMB_DATA_IN++;
i++;
ACK = 1; //设定ACK
}
if (i == SMB_DATA_LEN)
{
SMB_BUSY = 0; // 释放SMB
ACK = 0;
STO = 1;
}
break;
default:
FAIL = 1;
break;
}
if (FAIL)
{
SMB0CN &= ~0x40; // 复位
SMB0CN |= 0x40;
SMB_BUSY = 0;
}
SI=0; // 清除终端标志位
}
void EEPROM_ByteWrite( unsigned int addr, unsigned char dat ) //EEPROM_ByteWrite
{
while (SMB_BUSY); // 等待SMB空闲
SMB_BUSY = 0;
// ISR参数设置
TARGET = EEPROM_ADDR; // 设置目标从机地址
SMB_RW = WRITE; // 写标记
SMB_SENDWORDADDR = 1; // 高8位
SMB_SENDWORDADDR1 = 1; // 低8位
SMB_RANDOMREAD = 0; // 不发STA
SMB_ACKPOLL = 1; //如从机无应答将自动重发
WORD_ADDR = addr/256;
WORD_ADDR1 = addr%256;
SMB_SINGLEBYTE_OUT = dat;
pSMB_DATA_OUT = &SMB_SINGLEBYTE_OUT;
SMB_DATA_LEN = 1;
STA = 1;
}
unsigned char EEPROM_ByteRead( unsigned int addr)
{
unsigned char retval;
while (SMB_BUSY);
SMB_BUSY = 0;
TARGET = EEPROM_ADDR;
SMB_RW = WRITE;
SMB_SENDWORDADDR = 1;
SMB_SENDWORDADDR1 = 1;
SMB_RANDOMREAD = 1;
SMB_ACKPOLL = 1;
WORD_ADDR = addr/256;
WORD_ADDR1 = addr%256;
pSMB_DATA_IN = &retval;
SMB_DATA_LEN = 1;
STA = 1;
while(SMB_BUSY);
return retval;
} |