我用瑞萨单片机读写24C128,读出来的一直都是0XFF,写好像也不对,但是我仔细检查了代码也没发现什么问题,代码如下,困扰我几天了,请高人纠正,谢谢!!!
#define SDA_IN prc2=1 ; pd3 = 0x7d ;prc2=0 ;
#define SDA_OUT prc2=1 ; pd3 = 0xfd ;prc2=0 ;
void IIC24_Start(void) //开始
{
SDA_OUT
SDA = TRUE ;
SCL = TRUE ;
Delay(0x08) ;
SDA = FALSE ;
Delay(0x08) ;
SCL = FALSE ;
}
void IIC24_Stop(void) //结束
{
SDA_OUT
SDA = FALSE ;
SCL = TRUE ;
Delay(0x08) ;
SDA = TRUE ;
Delay(0x08) ;
SCL = FALSE ;
}
void IIC_Clock(void) //脉冲
{
SCL = FALSE ;
Delay(0x08) ;
SCL = TRUE ;
Delay(0x02) ;
SDA_IN
Delay(0x08) ;
IICBit = SDA ;
Delay(0x02) ;
SDA_OUT
Delay(0x02) ;
SCL = FALSE ;
}
void IIC_Clock_Only(void) //脉冲
{
SCL = FALSE ;
Delay(0x08) ;
SCL = TRUE ;
Delay(0x08) ;
SCL = FALSE ;
}
/*
void IIC_nAck(void)//应答
{
unsigned char z=0;
while((SDA==1)&&(z<50))//条件判断, AT128_DAT=1,则没有应答。如果没有应答则延时:z<50,z++;后返回
{
z++;
// Disp_IICValue = 67 ;
DispValue = 78 ;
}
SCL=0;
Delay(0x08) ;//5us延时
}
*/
void IIC_Ack(void) //应答
{
SDA_OUT
SDA = FALSE ;
IIC_Clock_Only() ;
}
void IIC_nAck(void) //无应答
{
SDA_OUT
SDA = TRUE ;
IIC_Clock_Only() ;
}
unsigned char IIC_OutputByte(void) //读出一字节数据
{
unsigned char nCounts,nData ;
for(nCounts=0;nCounts<8;nCounts++)
{
nData = nData << 1 ;
IIC_Clock() ;
if(IICBit == 1)
nData = (nData | 0x01) ;
else
nData = (nData & 0xfe) ;
}
return nData ;
}
void IIC_InputByte(unsigned char nData) //写入一字节数据
{
unsigned char nCounts ;
for(nCounts=0;nCounts<8;nCounts++)
{
if((nData & 0x80) == 0x80)
SDA = 1 ;
else
SDA = 0 ;
IIC_Clock_Only() ;
nData = nData << 1 ;
}
}
void IIC_WriteByte(unsigned int nAddr,unsigned char nData) //写单字节数据
{
IIC24_Start() ;
IIC_InputByte(WRITECOM);
IIC_nAck() ;
IIC_InputByte((unsigned char)(nAddr>>8)) ;
IIC_nAck() ;
IIC_InputByte((unsigned char)nAddr) ;
IIC_nAck() ;
IIC_InputByte(nData) ;
IIC_nAck() ;
IIC24_Stop() ;
}
void IIC_WritePage(unsigned int nAddr,unsigned char nNum,unsigned char nData[]) //页写,最多写32字节,不能跨越物理页
{
unsigned char nCounts ;
IIC24_Start() ;
IIC_InputByte(WRITECOM) ;
IIC_nAck() ;
IIC_InputByte((unsigned char)((nAddr & 0xff00)>>8)) ;
IIC_nAck() ;
IIC_InputByte((unsigned char)(nAddr & 0x00ff)) ;
IIC_nAck() ;
for(nCounts=0;nCounts<nNum;nCounts++)
{
IIC_InputByte(nData[nCounts]) ;
IIC_nAck() ;
}
IIC24_Start() ;
}
_Bool IIC_Polling(void)
{
unsigned int nTemp,nCounts = 0 ;
while(nCounts<0x3ff)
{
IIC24_Start() ;
IIC_InputByte(READCOM) ;
IIC_nAck() ;
if(IICBit == 0)
{
nTemp = IIC_OutputByte() ;
IIC_nAck() ;
IIC24_Stop() ;
return TRUE ;
}
nCounts++ ;
}
return FALSE ;
}
//======随机读=====
unsigned char IIC_ReadByte(unsigned int nAddr) //读单字节数据
{
unsigned char nData ;
IIC24_Start() ;
IIC_InputByte(WRITECOM) ;
IIC_nAck() ;
IIC_InputByte((unsigned char)(nAddr>>8)) ;
IIC_nAck() ;
IIC_InputByte((unsigned char)nAddr) ;
IIC_nAck() ;
IIC24_Start() ;
IIC_InputByte(READCOM) ;
IIC_nAck() ;
nData=IIC_OutputByte() ;
Disp_IICValue = nData ;
IIC_nAck() ;
IIC24_Stop() ;
return nData ;
} |