关于 DS1302的 读操作
/*** 读一个字节
*/
uint8 read_ds1302_byte(void)
{
uint8 i, dat=0;
for (i=0;i<8;i++)
{
dat >>= 1;
if (SDA)
dat |= 0x80;
SCK = 1;
SCK = 0;
}
return dat;
}
上面的读操作是正确的 但是我想 第一次循环的时候在没有出现下降沿的时候IF 语句根本判断不出来是高电平还是低电平啊,于是我换成这种写法
/**
* 读一个字节
*/
uint8 read_ds1302_byte(void)
{
uint8 i, dat=0;
for (i=0;i<8;i++)
{
dat >>= 1;
SCK = 1;
SCK = 0;
if (SDA)
dat |= 0x80;
}
return dat;
}
但是结果是错的,作为菜鸟我感觉糊涂了 望论坛里的朋友指点,还有这种写法:
/**
* 读一个字节
*/
uint8 read_ds1302_byte(void)
{
uint8 i,k,dat=0;
for (i=0;i<8;i++)
{
dat >>= 1;
k = SDA;
SCK = 1;
SCK = 0;
if (k)
dat |= 0x80;
}
return dat;
}
跟 错误的写法有什么区别吗?? 不能光看这个函数。read之前先有个write命令,结合write一起看。我觉得可能在write最后已经产生下降沿了。
最后一个程序增加了下降沿到读IO的延时,因为下降沿到数据稳定最多会有几百纳秒延时,他这么写就不用加nop延时 我觉得应该好好看看读取时序图。下降沿到来前,SDA数据已经准备好了,可以进行判断。下降沿过后就是下一个数据准备好了,判断操作过后再一个下降沿又是1bit准备好了,依次读取8bit组成了一个字节。那个错误写法就把时序弄乱了。
楼主学的是小宋老师的视频吧?
页:
[1]