DS1302
对于比赛给的底层,在单字节读取最后加上SD = 0;就可以正常使用了。
数据传输
For data inputs, data must be valid during the rising edge of the clock and data bits are output on the falling edge of clock. If the CE input is low, all data transfer terminates and the I/O pin goes to a high-impedance state.
对于数据输入(写DS1302),数据必须在时钟上升沿保持有效。对于数据的输出(读DS1302),数据必须在时钟下降沿保持有效。
数据低位在前
读: DS1302的OUTPUT (涉及到单片机的对SPI总线的读写操作)
先写一个字节指令,上升沿的时候DS1302锁存数据。然后DS1302会在之后的8个CLCK输出八个字节。所以就是写一个控制字节,然后在紧接着读取一个数据字节。
void Write_SPI(char dat) //上升沿写数据,在SCL = 1时更改数据
{
unsigned char i;
IO = 1;
for(i=0;i<8;i++)
{
IO = addr&0x01;
SCLK = 1;
SCLK = 0;
addr >>= 1;
}
IO = 1;
}
unsigned char Read_SPI(void)//数据会在SCLK = 0时改变,所以先采样IO口,在拉低总线
{
unsigned char temp=0,i;
for(i=0;i<8;i++)
{
temp >>= 1;
if(IO)
dat |= 0x80;
SCLK = 1;
SCLK = 0;
}
return temp;
}
void Write_DS1302(unsigned char addr,unsigned char dat)
{
RST = 1;
Write_SPI(addr);
Write_SPI(dat);
RST = 0;
}
unsigned char Read_DS1302(unsigned char addr)
{
unsigned char temp;
RST = 1;
Write_SPI(addr);
temp = Read_SPI();
RST = 0;
IO = 0; //单字节读必须加******大赛官方给的驱动加上这个就可以使用
}
在进行任何数据传输时,/RST必须被制高电平(此时允许外部读写数据)
DS1302寄存器
81h/80h:BIT7的CH:为1时时钟停止震荡,低功耗;为0时钟震荡。所以这一位要写0;
BF/BE: BURST模式的读和写
控制寄存器【8F/8E】:
BURST 模式:写:写控制领命BE 后从上到下在写七个字节
读:写控制命令BF 后从上到下读取七个字节
RST = 1;
Write_Ds1302_Byte(0xBF);
s = Read_Ds1302_Byte();
m = Read_Ds1302_Byte();
h = Read_Ds1302_Byte();
RST = 0;