您的位置:首页 > 其它

stm32操作时钟芯片ds1390

2015-07-18 13:02 381 查看
某个时间码定时装置需要精准的时间,因此选择了DS1390作为时钟芯片,因为他支持毫秒级别的时间校准。

平台:STM32F103T8u6+DS1390

以下是其源程序:

void SPI_init()
{
GPIO_InitTypeDef GPIO_InitStructure;
SPI_InitTypeDef  SPI_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_SPI1, ENABLE);

//GPIO_PinRemapConfig(GPIO_Remap_SPI1,ENABLE);
/* Configure SPI1 pins: SCK, MISO and MOSI */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);

/* SPI1 configuration */
SPI_Cmd(SPI1, DISABLE); //????????MODE
SPI_InitStructure.SPI_Direction=SPI_Direction_2Lines_FullDuplex;//??SPI???????????:SPI??????????
SPI_InitStructure.SPI_Mode=SPI_Mode_Master;//??SPI????:????SPI
SPI_InitStructure.SPI_DataSize=SPI_DataSize_8b;//??SPI?????:SPI????8????
SPI_InitStructure.SPI_CPOL=SPI_CPOL_High;//??????????:?????
SPI_InitStructure.SPI_CPHA=SPI_CPHA_2Edge;//???????????
SPI_InitStructure.SPI_NSS=SPI_NSS_Soft;//NSS?????(NSS??)????(??SSI?)??:??NSS???SSI???
SPI_InitStructure.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_4;//??????????:????????256
SPI_InitStructure.SPI_FirstBit=SPI_FirstBit_MSB;//???????MSB???LSB???:?????MSB???
SPI_Init(SPI1,&SPI_InitStructure);//??SPI_InitStruct???????????SPIx???

/* Enable SPI1  */
SPI_Cmd(SPI1, ENABLE);

}


以上是初始化部分的,还有一个CE的初始化,没有写在上面。

以下是基本的操作函数

#define SE_CS GPIO_SetBits(GPIOB,GPIO_Pin_1)
#define CL_CS GPIO_ResetBits(GPIOB,GPIO_Pin_1)

u8 datanow[4];

unsigned char SPIx_ReadWriteByte(unsigned char TxData)//SPIx ??????//TxData:??????//???:??????
{
unsigned char retry=0;
while (SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE) == RESET) //?????SPI???????:????????
{
retry++;
if(retry>200)
return 0;
}

SPI_I2S_SendData(SPI1,TxData);//????SPIx??????

retry=0;

while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_RXNE) == RESET)//?????SPI???????:?????????
{
retry++;
if(retry>200)
return 0;
}
return SPI_I2S_ReceiveData(SPI1);//????SPIx???????
}

void Writeds1930(u8 add,u8 dat)
{
CL_CS;
SPIx_ReadWriteByte(add);
SPIx_ReadWriteByte(dat);
SE_CS;

}
u8 Readds1930(u8 add)
{
u8 re;
CL_CS;
SPIx_ReadWriteByte(add);
re=SPIx_ReadWriteByte(0xff);
SE_CS;
return re;
}
以下是Init函数以及读时间函数和些时间函数,初始化函数中因为此处我是使用了DS1390的精准的定时功能,这里开启了闹钟,同时闹钟是1s产生一次的。

void InitDS1390()
{
//while(1)
if(Readds1930(0x08)!=0x00)
Writeds1930(0x88,0x00);//0
if(Readds1930(0x09)!=0x80)
Writeds1930(0x89,0x80);//am1
if(Readds1930(0x0a)!=0x80)
Writeds1930(0x8a,0x80);//am2
if(Readds1930(0x0b)!=0x80)
Writeds1930(0x8b,0x80);//am3
if(Readds1930(0x0c)!=0x80)
Writeds1930(0x8c,0x80);//am4
if(Readds1930(0x0d)!=0x05)
Writeds1930(0x8d,0x05);//0
if(Readds1930(0x0e)!=0x00)
Writeds1930(0x8e,0x00);//清零中断

}

void readtime()
{
datanow[0]=Readds1930(3);			//小时
datanow[1]=Readds1930(2);			//分钟
datanow[2]=Readds1930(1);			//秒
datanow[3]=Readds1930(0);			//ms
//datanow[0]=0x9;

}
void Settime(u8 hour,u8 min,u8 sec,u8 ms)
{

Writeds1930(0x80,0x00);//ms
Writeds1930(0x81,sec);//s
Writeds1930(0x82,min);//min
Writeds1930(0x83,hour);//hour

}


总结来说美信的时钟片子是很好用的,应用环境很多,而且种类也很多,如果用在工程项目上,简易一定要采用美信的片子,并且最好是原厂的片子,这样那个最稳定好用
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: