stm32操作时钟芯片ds1390

某个时间码定时装置需要精准的时间,因此选择了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
	

}


总结来说美信的时钟片子是很好用的,应用环境很多,而且种类也很多,如果用在工程项目上,简易一定要采用美信的片子,并且最好是原厂的片子,这样那个最稳定好用


























  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值