原创
自带晶振温补极端精确的实时钟芯片DS3234
2013-1-16 10:12
3740
21
27
分类:
消费电子
前段时间做了一个小东西,设计要求系统精确计时且体积要小,最后选择了以前没有接触过的一款时钟芯片——DS3234SN。系统所用的MCU为ATmega8,与3234之间通过SPI总线通信。此款芯片应用极为方便。先将部分使用心得整理出来。
首先焊接电路时,一定要仔细,以防虚焊,本人当初就以为3234的DIN脚虚焊折腾了将近半个月。
————————SPI初始化
void Init_SPI(){
DDRB |= _BV(PB5) | _BV(PB3) | _BV(PB2);//单片机的PB5连芯片的SCK,PB3(MOSI) 连芯片的DIN,PB2(MISO)连芯片的CS
SPCR = _BV(SPE) | _BV(MSTR) | _BV(SPR0) | _BV(CPOL) | _BV(CPHA);
//SPI使能,主机模式,16分频,模式3(也可设置为模式1),MSB首发
}
————————发送
INT8U SPI_Send(INT8U dat){//主机向芯片发送一个字节,同时主机接收到芯片交换回来的一个字节
SPDR=dat;//启动数据传输
while(!(SPSR & _BV(SPIF)));//等待结束
SPSR |= _BV(SPIF);//清中断标志
return SPDR;//返回接收缓冲器中的数据
}
——————向3234写入一个字节
void DS3234_write_byte(INT8U addr,INT8U date){
SPDR=addr;
while(!(SPSR & _BV(SPIF)));
SPSR |= _BV(SPIF);
SPI_Send(date);
}
—————从3234读出一个字节
INT8U DS3234_read_byte(INT8U addr){
INT8U date;
SPDR=addr;
date=SPI_Send(0XFF);
return date;
}
—————设置时间
void Set_DS3234(){//需要一次依次写入所有时间位
......
SPI_EN();
SPI_Send(0X80);
SPI_Send(Time[1]);//s
SPI_Send(Time[2]);//m
SPI_Send(Time[3]);//h
SPI_Send(0X02);//dow 星期位未用到 一直设置为2
SPI_Send(Time[4]);//d
SPI_Send(Time[5]);//m
SPI_Send(Time[6]);//y
SPI_DS();
}
————读时间
void ReadTime(){//这两个函数功能相同,只是为了方便后面的操作
......
SPI_EN();
Time[1]=DS3234_read_byte(0X00);
SPI_DS();
SPI_EN();
Time[2]=DS3234_read_byte(0X01);
SPI_DS();
SPI_EN();
Time[3]=DS3234_read_byte(0X02);
SPI_DS();
SPI_EN();
Time[4]=DS3234_read_byte(0X04);
SPI_DS();
SPI_EN();
Time[5]=DS3234_read_byte(0X05);
SPI_DS();
SPI_EN();
Time[6]=DS3234_read_byte(0X06);
SPI_DS();
}
用户1826196 2016-1-23 21:14
用户1406868 2014-1-13 15:50
用户1624075 2013-4-19 18:20
用户1525219 2013-4-18 08:59
用户1116435 2013-4-10 14:48
用户1447659 2013-4-8 13:11
用户1670484 2013-4-8 13:00
用户1664440 2013-4-6 21:28
用户975682 2013-4-4 11:13
用户1406868 2013-4-1 11:27