void DS1302ByteWrite(unsigned char dat) //发送一个字节到 DS1302 通信总线上
{
unsigned char mask;
for (mask=0x01; mask!=0; mask<<=1) //低位在前,逐位移出
{
if ((mask&dat) != 0) //首先输出该位数据
{
DS1302_IO = 1;
}
else
{
DS1302_IO = 0;
}
DS1302_CK = 1; //然后拉高时钟
DS1302_CK = 0; //再拉低时钟,完成一个位的操作
}
DS1302_IO = 1; //最后确保释放 IO 引脚 不懂的是这句,DS1302_IO置1了,从写到读没有任何操作,再去读DS1302_IO不是一定是1了。
}
unsigned char DS1302ByteRead(void) //由 DS1302 通信总线上读取一个字节
{
unsigned char mask;
unsigned char dat = 0;
for (mask=0x01; mask!=0; mask<<=1) //低位在前,逐位读取
{
if (DS1302_IO != 0) //首先读取此时的 IO引脚,并设置 dat中的对应位
{
dat |= mask;
}
DS1302_CK = 1; //然后拉高时钟
DS1302_CK = 0; //再拉低时钟,完成一个位的操作
}
return dat; //最后返回读到的字节数据
}
unsigned char DS1302SingleRead(unsigned char reg) //用单次模式从 DS1302 的某一寄存器读
取一字节数据,寄存器地址 reg,返回值为读取到的字节数据
{
unsigned char dat;
DS1302_CE = 1; //使能片选信号
DS1302ByteWrite((reg<<1) | 0x81); //发送读寄存器指令
dat = DS1302ByteRead(); //读取字节数据
DS1302_CE = 0; //除能片选信号
return dat;
}
求大神解释下,为什么写操作最后一句DS1302_IO = 1; //最后确保释放 IO 引脚
不懂的是这句,DS1302_IO置1了,从写到读没有任何操作去改变DS1302_IO,循环的第一次直接去读DS1302_IO不是一定是1了。
其实就是低电平能把高电平拉低,所以先把它置1,当输出是1的时候不变,当输出是0的时候,高电平就被拉成低电平了!!最后输出低电平!
追问是不是这个意思:当第八位写入的时候 DS1302_CK = 1; 就已经读入了,然而记着DS1302_CK = 0; DS1302就开始输出了(时序是说下跳沿输出),我 DS1302_IO = 1; 只是对单片机这边来说,而DS1302输出的0,它还是为0的。
追答就是输出完以为数据的时候要一个脉冲才能输出下一位,DS1302_CK=1后DS1302_CK=0这个是一个脉冲,DS1302_IO这个是读取某位的电平值!!
不明白可以继续问!!