我用PIC18F2480单片机,在proteus里面调试,结果是当加上I2C DEBUGGER测试器的时候通讯正常,可以将值写入EEPROM里,PORTD输出的显示也正常(数码管),但是拿掉I2C DEBUGGER单片机就写不进EEPROM里了,用示波器查了一下原因,发现拿掉I2C DEBUGGER后PIC单片机I2C在发送了SEN=1的起始条件后,EEPROM不给应答信号请问这是怎么回事啊?现象如图所示
以下是源代码
#include<pic18.h>
#define uchar unsigned char
#define uint unsigned int
const uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f};
uchar read_data[9];
void delay(uint z);
void I2Cinit();
void I2Cwrite();
void I2Cread();
void main()
{
I2Cinit();
I2Cwrite();
delay(50);
I2Cread();
while(1)
{
uchar i;
for(i=0;i<9;i++)
{
PORTD=read_data;
delay(500);
RA0=1;RA1=1;//加入指示灯调程序
delay(100);
RA0=0;RA1=0;
}
}
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void I2Cinit()
{
INTCON=0;
PIE1=0;
PIE2=0;
TRISC3=1;
TRISC4=1;//设置为输入
TRISD=0;
TRISA=0;
SSPSTAT=0x80;//标准速度100K其他的都为检测位先设为零
SSPCON1=0x38;//使能同步串口SSP 时钟为100K
SSPCON2=0;
SSPADD=0x09;
RA0=1;
delay(10);//调程序标志
RA0=0;
}
void I2Cwrite()
{
uchar i;
SSPIF=0;
SEN=1; //使能ssp通信
while(!SSPIF);//通过检测 sspif 代替应答信号
SSPIF=0;
SSPBUF=0xA0; //发送器件地址P0=0;A=0;
while(!SSPIF);
SSPIF=0;
SSPBUF=0; //发送写的地址的高八位
while(!SSPIF);
SSPIF=0;
SSPBUF=0x01; //发送写的地址的低八位0x01
while(!SSPIF);
SSPIF=0;
for(i=0;i<9;i++)
{
SSPBUF=table;//依次写入要写的9个数
while(!SSPIF);
SSPIF=0;
RA0=1;
delay(100);
RA0=0;
}
PEN=1; //发送停止信号
while(!SSPIF);
SSPIF=0;
}
void I2Cread()
{
uchar i;
SSPIF=0;
SEN=1;
while(!SSPIF);
SSPIF=0;
SSPBUF=0xA0;
while(!SSPIF);
SSPIF=0;
SSPBUF=0; //发送写的地址的高八位
while(!SSPIF);
SSPIF=0;
SSPBUF=0x01; //发送写的地址的低八位0x01;
while(!SSPIF);
SSPIF=0;
// SSPIF=0;
RSEN=1; //发送开始信号
while(!SSPIF);
SSPIF=0;
SSPBUF=0xA1; //读指令
while(!SSPIF);
SSPIF=0;
for(i=0;i<9;i++)
{
RCEN=1;
while(!SSPIF);
read_data=SSPBUF;
while(!SSPIF);
SSPIF=0;
RA1=1;
delay(100);
RA1=0;
if(i>=8)
{
ACKDT=1;
}
else
{
ACKDT=0;
}
ACKEN=1;
while(!SSPIF);
SSPIF=0;
}
PEN=1;
while(!SSPIF);
SSPIF=0;
}
|