|
我从伟纳单片机论坛找了一个完整的AT24C64读写程序,光把几个关键操作函数贴出来,
这个程序已经成功的用到了我的设计当中,在此对原作者gguoqing表示感谢!
现在有些疑问想请教一下您,
1,按照IIC协议,IIC总线启动时会在SCL为高的时候将SDA拉低,然后将SCL拉低,而总线关闭的时候,会在SCL为高的时候将SDA释放, 而这个程序中,总线关闭操作函数中最后将两条线全部拉低了, 这样的话,会不会造成什么问题呢?
2,按字节发送的操作函数中,每发送一个字节后应该等待应答信号而不是发应答信号吧?
这些都和IIC协议内容不符,但程序确确实实可以用,这点很是奇怪,请指点一下吧~谢谢。
/**********************************************************
起始信号子函数
在 SCL 高电平期间,SDA 发生负跳变。
**********************************************************/
void I2C_start()
{
SDA = 1;
SCL = 1;
delayNOP();
SDA = 0;
delayNOP();
SCL = 0;
}
/**********************************************************
停止信号子函数
在 SCL 高电平期间,SDA 发生正跳变。
**********************************************************/
void I2C_stop()
{
SDA = 0;
SCL = 1;
delayNOP();
SDA = 1;
delayNOP();
SCL = 0;
SDA = 0;
}
/**********************************************************
I2C总线初始化子函数
**********************************************************/
void I2C_init()
{
SCL = 0;
I2C_stop();
}
/**********************************************************
应答信号子函数
在 SDA 低电平期间,SCL 发生一个正脉冲。
**********************************************************/
void I2C_Ack()
{
SDA = 0;
SCL = 1;
delayNOP();
SCL = 0;
SDA = 1;
}
/**********************************************************
非应答信号子函数
在 SDA 高电平期间,SCL 发生一个正脉冲。
**********************************************************/
void I2C_NAck()
{
SDA = 1;
SCL = 1;
delayNOP();
SCL = 0;
delayNOP();
SDA = 0;
}
/**********************************************************
读字节数据子函数
MCU从IIC读出数据
**********************************************************/
uchar ReadByte()
{
uchar i,read_data;
read_data=0x00;
SDA=1; //置数据线为输入方式
for(i = 0; i < 8; i++)
{
SCL = 1;
read_data <<= 1;
read_data |= SDA;
delayNOP();
SCL = 0;
delayNOP();
}
SCL = 0;
delayNOP();
return(read_data);
}
/**********************************************************
写字节数据子函数
MCU写数据到IIC,
每写完一个字节数据后,发送一次应答信号。
**********************************************************/
void WriteByte(uchar write_data)
{
uchar i;
for(i = 0; i < 8; i++) //循环移入8个位
{
SDA = (bit)(write_data & 0x80);
_nop_();
_nop_();
SCL = 1;
delayNOP();
SCL = 0;
write_data <<= 1;
}
I2C_Ack(); //应答信号
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|