|
发表于 2012-9-25 23:17:12
|
显示全部楼层
感谢楼主的分享,小弟菜鸟一个,有个问题不知道该如何解释希望楼主可以帮忙分享下答案,问题描述如下:
小弟现在使用的是24LC04B这款芯片,看数据手册的时候,数据手册里面说到,“接收的重器件没接收到8个bit的字符之后都需要返回一个确认信号”。
您给出的启动信号以及写8位数据和返回应答信号的代码如下:
/*============================================================
起始信号: 时钟(SCL)为高电平时, SDA 从高电平变为低电平
------------------------------------------------------------*/
void i2cStart(void)
{
SCL_H;
SDA_H;
DELAY_us;
while((SDA_IF_L) || (SCL_IF_L)) {;} //总线空闲
DELAY_us;
DELAY_us;
while((SDA_IF_L) || (SCL_IF_L)) {;}
DELAY_us;
SDA_L;
DELAY_us;
SCL_L;
DELAY_us;
}
/*============================================================
写数据u8a, 并返回应答信号,
写入成功返回1,失败返回0
------------------------------------------------------------*/
u8 i2cWrite(u8 a)
{
u8 i;
for(i=0;i<8;i++) // 发送一个字节的数据
{
if(a & 0x80)
{
SDA_H;
}
else
{
SDA_L;
}
SCL_H;
DELAY_us;
SCL_L;
a = a<<1;
DELAY_us;
}
DELAY_us;
SDA_H; //准备接受应答
DELAY_us;
SCL_H;
DELAY_us;
if(SDA_IF_L) //测试应答,有应答
{
__Gu8Ack = TRUE;
}
else //无应答
{
__Gu8Ack = FALSE;
}
SCL_L; // 钳住时钟线
DELAY_us;
return __Gu8Ack;
}
总体的时序小弟大概都理解,就是对里面的一个细节不知道该如何理解。
在i2cWrite函数中,写完8位数据之后,在for循环之内将SCL设置为低电平。在结束for循环之后,
您首先延时一段时间,然后拉高SDA_H准备接受应答,可是延时之后您又拉高了SCL。对于拉高SCL之后的代码小弟个疑问:
为什么不是在SCL为低的状态下,而是在高的状态下准备接受应答信号?
希望楼主前辈可以不吝赐教,谢谢! |
|