使用下面的IIC程序调试24LC02时,写byte数据0-255,读出来只有128-255是对的,写0-127读出来都是127,到底哪里有问题?在线等高人帮看下!
使用的下面这两个函数:
unsigned char ReadByte( unsigned char addr )
void WriteByte( unsigned char addr, unsigned char data )
#define I2C_Speed 200
#define I2C1_SLAVE_ADDRESS7 0xA0
#define I2C_PageSize 256
#define SCL_H PT01AD0_PT1AD03 = 1
#define SCL_L PT01AD0_PT1AD03 = 0
#define SCL_OUT DDR01AD0_DDR0AD03 = 1
#define SDA_H PTP_PTP3 = 1
#define SDA_L PTP_PTP3 = 0
#define SDA_OUT DDRP_DDRP3 = 1
#define SDA_IN DDRP_DDRP3 = 0
#define SDA_read PTP_PTP3
unsigned char TestA=0;
/************************************************************************
函数原型: void I2C_delay(void)
参数说明: 无
返回值: 无
功能说明: IIC延时函数
************************************************************************/
void I2C_delay( void )
{
unsigned int i = I2C_Speed;
while( i )
{
i--;
}
}
/************************************************************************
函数原型: unsigned char I2C_Start(void)
参数说明: 无
返回值: 无
功能说明: IIC启动
************************************************************************/
void I2C_Start( void )
{
SCL_OUT;
SDA_OUT;
SDA_H;
SCL_H;
I2C_delay();
SDA_L;
I2C_delay();
SCL_L;
I2C_delay();
}
/************************************************************************
函数原型: void I2C_Stop(void)
参数说明: 无
返回值: 无
功能说明: IIC停止
************************************************************************/
void I2C_Stop( void )
{
SCL_OUT;
SDA_OUT;
SCL_L;
I2C_delay();
SDA_L;
I2C_delay();
SCL_H;
I2C_delay();
SDA_H;
I2C_delay();
}
/************************************************************************
函数原型: void I2C_Ack(void)
参数说明: 无
返回值: 无
功能说明: IIC应答
************************************************************************/
void I2C_Ack( void )
{
SCL_OUT;
SDA_OUT;
SCL_L;
I2C_delay();
SDA_L;
I2C_delay();
SCL_H;
I2C_delay();
SCL_L;
I2C_delay();
SDA_IN;
}
/************************************************************************
函数原型: void I2C_NoAck(void)
参数说明: 无
返回值: 无
功能说明: IIC不应答
************************************************************************/
void I2C_NoAck( void )
{
SCL_OUT;
SDA_OUT;
SCL_L;
I2C_delay();
SDA_H;
I2C_delay();
SCL_H;
I2C_delay();
SCL_L;
I2C_delay();
}
/************************************************************************
函数原型: void I2C_WaitAck(void)
参数说明: 无
返回值: 无
功能说明: IIC等待应答
************************************************************************/
unsigned char I2C_WaitAck( void ) //返回为:=1有ACK,=0无ACK
{
SCL_OUT;
/* SDA_OUT;
SCL_L;
I2C_delay();
SDA_H;
I2C_delay();
*/
SDA_IN;
SCL_H;
I2C_delay();
if(SDA_read)
{
SCL_L;
return FALSE;
}
SCL_L;
return TRUE;
}
/************************************************************************
函数原型: void I2C_SendByte(unsigned char SendByte)
参数说明: 无
返回值: 无
功能说明: IIC写一个byte CR
************************************************************************/
void I2C_SendByte( unsigned char SendByte )
{
unsigned char i=8;
SCL_OUT;
SDA_OUT;
while(i--)
{
SCL_L;
I2C_delay();
if(SendByte&0x80)
SDA_H;
else
SDA_L;
SendByte<<=1;
I2C_delay();
SCL_H;
I2C_delay();
}
SCL_L;
}
/************************************************************************
函数原型: unsigned char I2C_ReceiveByte(void)
参数说明: 无
返回值: 无
功能说明: IIC读一个byte CR
************************************************************************/
unsigned char I2C_ReceiveByte( void )
{
unsigned char i=8;
unsigned char ReceiveByte=0;
SCL_OUT;
SDA_OUT;
while(i--)
{
ReceiveByte<<=1;
SCL_L;
I2C_delay();
SCL_H;
I2C_delay();
SDA_IN;
if(SDA_read)
{
ReceiveByte|=0x01;
}
}
SCL_L;
return ReceiveByte;
}
void WriteByte( unsigned char addr, unsigned char data )
{
I2C_Start();
I2C_SendByte(I2C1_SLAVE_ADDRESS7);
TestA = I2C_WaitAck();
I2C_SendByte(addr);
TestA = I2C_WaitAck();
I2C_SendByte(data);
TestA = I2C_WaitAck();
I2C_Stop();
}
unsigned char ReadByte( unsigned char addr )
{
unsigned char data;
I2C_Start();
I2C_SendByte(I2C1_SLAVE_ADDRESS7);
TestA = I2C_WaitAck();
I2C_SendByte(addr);
TestA = I2C_WaitAck();
I2C_Start();
I2C_SendByte(I2C1_SLAVE_ADDRESS7|0x01);
TestA = I2C_WaitAck();
data = I2C_ReceiveByte( );
// I2C_NoAck( );
I2C_Stop();
return data;
} |