软件模拟iic实现:
//iic时序
#if 1
void IIC_Start()
{
SDA_OUT();
IIC_SCL=1;
IIC_SDA=1;
delay_ms(5);
IIC_SDA=0;
delay_ms(5);
}
void IIC_Stop(void)
{
SDA_OUT();
IIC_SCL=1;
IIC_SDA=0;
delay_ms(5);
IIC_SDA=1;
delay_ms(5);
}
void IIC_Send_Byte(u8 txd)
{
u8 t,j=0;
SDA_OUT();
IIC_SCL=0;
// delay_ms(5);
// IIC_SCL=1;
// delay_ms(5);
for(;j<8;j++)
{
IIC_SCL=0;
if(txd&0x80)
IIC_SDA=1;
else IIC_SDA= 0;
txd<<=1;
delay_ms(5);
IIC_SCL=1;
delay_ms(5);
}
IIC_SCL=0;
delay_ms(5);
}
u8 IIC_Wait_Ack()
{ u8 i=255;
SDA_IN();
IIC_SCL=1;
if(READ_SDA)
{
for(;i>0;i--)
{
return 1;
}
}
delay_ms(5);
return 0;
}
u8 IIC_Read_Byte(unsigned char ack)
{
u8 rec=0,i=0;
SDA_IN();
// IIC_SCL=0;
// delay_ms(5);
for(;i<8;i++)
{
IIC_SCL=0;
delay_ms(5);
rec<<=1; // (must there!!!)
if(READ_SDA)
rec++;
IIC_SCL=1;
delay_ms(5);
}
if(ack)
{
IIC_Ack();
}
else
{
IIC_NAck();
}
return rec;
}
void IIC_Ack(void)
{
IIC_SCL=0;
SDA_OUT();
IIC_SDA=0;
delay_us(5);
IIC_SCL=1;
delay_us(5);
IIC_SCL=0;
}
//不产生ACK应答
void IIC_NAck(void)
{
IIC_SCL=0;
SDA_OUT();
IIC_SDA=1;
delay_us(5);
IIC_SCL=1;
delay_us(5);
IIC_SCL=0;
}
#endif
主函数实现
IIC_Start();
IIC_Send_Byte(0XA0); //发送写命令
while(IIC_Wait_Ack());
IIC_Send_Byte(0X00); //addr high
while(IIC_Wait_Ack());
IIC_Send_Byte(0X00); //addr low
while(IIC_Wait_Ack());
IIC_Send_Byte(0Xa8) ;
while(IIC_Wait_Ack());
delay_ms(100);
IIC_Stop();
delay_ms(1000); //(MUST)
//write
IIC_Start();
IIC_Send_Byte(0XA0); //发送写命令
// delay_ms(10);
while(IIC_Wait_Ack());
IIC_Send_Byte(0X00); //addr high
while(IIC_Wait_Ack());
IIC_Send_Byte(0X00); //addr low
while(IIC_Wait_Ack());
IIC_Start();
IIC_Send_Byte(0XA1); //发送du命令
while(IIC_Wait_Ack());
printf("\r\nstr is :%x\r\n" ,IIC_Read_Byte(1));
IIC_Stop();
以上主函数实现了:
写操作:起市时序-----发器件地址------等从机ack---------发存储器内存地址-------等ack---发数据----等ack--stop 。
读操作 :起市时序-----发器件地址------等从机ack---------发存储器内存地址-------等ack-----发起市时序---发读指令----等ack------发读指令----读数据(带ack)-----stop 。
最后特别注意读取数据寄存器的延迟,否则读数错误。