某个时间码定时装置需要精准的时间,因此选择了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
}
总结来说美信的时钟片子是很好用的,应用环境很多,而且种类也很多,如果用在工程项目上,简易一定要采用美信的片子,并且最好是原厂的片子,这样那个最稳定好用