硬件时钟--ht1381时钟芯片驱动

ht1381时钟芯片驱动

#include "global.h"

//时钟芯片ht1381各引脚定义
#define HT1381_CS_GPIO_PORT            GPIOD
#define HT1381_CS_GPIO_PIN             GPIO_PIN_3
#define HT1381CsHigh()                 (HT1381_CS_GPIO_PORT->ODR |= (u8)(HT1381_CS_GPIO_PIN))
#define HT1381CsLow()                  (HT1381_CS_GPIO_PORT->ODR &= (u8)(~HT1381_CS_GPIO_PIN))

#define HT1381_DATA_GPIO_PORT          GPIOD
#define HT1381_DATA_GPIO_PIN           GPIO_PIN_2
#define HT1381DataHigh()               (HT1381_DATA_GPIO_PORT->ODR |= (u8)(HT1381_DATA_GPIO_PIN))
#define HT1381DataLow()                (HT1381_DATA_GPIO_PORT->ODR &= (u8)(~HT1381_DATA_GPIO_PIN))
#define HT1381DataOut()                GPIO_Init(HT1381_DATA_GPIO_PORT,HT1381_DATA_GPIO_PIN,GPIO_MODE_OUT_PP_HIGH_FAST);
#define HT1381DataIn()                 GPIO_Init(HT1381_DATA_GPIO_PORT,HT1381_DATA_GPIO_PIN,GPIO_MODE_IN_PU_NO_IT);
#define HT1381DataStatus               (HT1381_DATA_GPIO_PORT->IDR & HT1381_DATA_GPIO_PIN)

#define HT1381_CLK_GPIO_PORT           GPIOD
#define HT1381_CLK_GPIO_PIN            GPIO_PIN_0
#define HT1381ClkHigh()                (HT1381_CLK_GPIO_PORT->ODR |= (u8)(HT1381_CLK_GPIO_PIN))
#define HT1381ClkLow()                 (HT1381_CLK_GPIO_PORT->ODR &= (u8)(~HT1381_CLK_GPIO_PIN))

extern void Int_HT1381(void);

ICTimerTab_t	ICTimerTab;
ICTimerTab_t	ICTimerTabBuf;

void Delay_us(u8 data)
{
   for(u8 i = 0; i <data;i++)
   {
     nop();
   }
}
/********************************************************************
往HT1381写入1Byte数据
********************************************************************/
void Send_HT1380_1Byte(unsigned char tData)
{
   unsigned char i;
   HT1381DataOut();
   for(i=0;i<8;i++)
   {
      if((tData&0x01) != 0)
      {
         HT1381DataHigh();
      }
      else
      {
         HT1381DataLow();
      }
      tData >>= 1;
      Delay_us(8);
      HT1381ClkHigh();
      Delay_us(5);
      HT1381ClkLow();
      Delay_us(5);
   }
}
/********************************************************************
往HT1381读取1Byte数据
********************************************************************/
unsigned char Read_HT1380_1Byte(void)
{
   unsigned char i,tData;
   HT1381DataIn();
   for(i=0;i<8;i++)
   {
      HT1381ClkHigh();
      Delay_us(8);
      tData >>= 1;
      if(!HT1381DataStatus)
      {
         tData &= 0x7f;
      }
      else
      {
         tData |= 0x80;
      }
      HT1381ClkLow();
      Delay_us(5);
   }
   HT1381DataOut();
   return tData;
}
/********************************************************************
* 名称: 往HT1381写入数据
* 说明: 先写地址,后写命令/数据
* 调用: Send_HT1380_1Byte
* 输入: sAddr:HT1381地址,sData:要写的数据
********************************************************************/
void Write_HT1381Addr_1Byte(unsigned char sAddr,unsigned char sData)
{
   HT1381CsLow();
   Delay_us(5);
   HT1381ClkLow();
   Delay_us(5);
   HT1381CsHigh();
   Send_HT1380_1Byte(sAddr);	//写地址,命令
   Send_HT1380_1Byte(sData);	//写1Byte数据
   HT1381ClkHigh();
   Delay_us(5);
   HT1381CsLow();
}
/********************************************************************
* 名称: 读取HT1381某地址的数据
* 说明: 先写地址,后写命令/数据
* 调用: Send_HT1380_1Byte,Read_HT1380_1Byte
* 输入: sAddr:HT1381地址
* 返回值: sData:读取的数据
********************************************************************/
unsigned char Read_HT1381Addr_1Byte(unsigned char sAddr)
{
   unsigned char tData;
   HT1381CsLow();
   Delay_us(5);
   HT1381ClkLow();
   Delay_us(5);
   HT1381CsHigh();
   Send_HT1380_1Byte(sAddr);	//写地址,命令
   tData = Read_HT1380_1Byte();	//写1Byte数据
   HT1381ClkHigh();
   Delay_us(5);
   HT1381CsLow();
   return tData;
}
/********************************************************************
* 名称: 读取HT1381当前时间
* 调用: Read_HT1381Addr_1Byte
* 输入: 保存当前时间地址+当前时间格式为: 秒 分 时 日 月 星期 年
* 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
********************************************************************/
void Read_HT1381_NowTimer(void)
{
   unsigned char i;
   unsigned char sAddr;
   unsigned char *p;
   sAddr = 0x81;
   p =(unsigned char*)&ICTimerTabBuf;
   for(i=0;i<7;i++)
   {
      *p = Read_HT1381Addr_1Byte(sAddr);
      p++;
      sAddr += 2;
   }
}
/********************************************************************
* 名称: 初始化HT1381
* 调用: Write_HT1381Addr_1Byte
* 输入: 初始时间地址+初始时间格式为: 秒 分 时 日 月 星期 年
* 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
********************************************************************/
void Int_HT1381(void)
{
   unsigned char i;
   unsigned char sAddr;
   unsigned char *p;
   sAddr = 0x80;
   p =(unsigned char*)&ICTimerTabBuf;
   Write_HT1381Addr_1Byte(0x8e,0x00);		//控制命令,WP=0,写操作?
   for(i=0;i<7;i++)
   {
      Write_HT1381Addr_1Byte(sAddr,*p);	//秒,分,时,日,月,星期,年
      p++;
      sAddr += 2;
   }
   Write_HT1381Addr_1Byte(0x8e,0x80);		//控制命令,WP=1,写保护?
}
/********************************************************************
上电初始化日期时间
********************************************************************/
void Int_Timer(void)
{	//上电读取时钟芯片是否掉电
   Read_HT1381_NowTimer();
   if((ICTimerTabBuf.TimerSec&0x80) != 0)
   {
      Read_HT1381_NowTimer();
      if((ICTimerTabBuf.TimerSec&0x80) != 0)
      {
         ICTimerTabBuf.TimerSec = 0x20;
         ICTimerTabBuf.TimerMin = 0x57;
         ICTimerTabBuf.TimerHour = 0x18;
         ICTimerTabBuf.TimerDay = 0x11;
         ICTimerTabBuf.TimerMonth = 0x07;
         ICTimerTabBuf.TimerWeek = 0x04;
         ICTimerTabBuf.TimerYear = 0x13;
         Int_HT1381();		//初始化HT1381
      }
   }
   ICTimerTab.TimerSec = (ICTimerTabBuf.TimerSec/16) * 10 +  (ICTimerTabBuf.TimerSec%16);
   ICTimerTab.TimerMin = (ICTimerTabBuf.TimerMin/16) * 10 +  (ICTimerTabBuf.TimerMin%16);
   ICTimerTab.TimerHour = (ICTimerTabBuf.TimerHour/16) * 10 +  (ICTimerTabBuf.TimerHour%16);
   ICTimerTab.TimerDay = (ICTimerTabBuf.TimerDay/16) * 10 +  (ICTimerTabBuf.TimerDay%16);
   ICTimerTab.TimerMonth = (ICTimerTabBuf.TimerMonth/16) * 10 +  (ICTimerTabBuf.TimerMonth%16);
   ICTimerTab.TimerWeek = (ICTimerTabBuf.TimerWeek/16) * 10 +  (ICTimerTabBuf.TimerWeek%16);
   ICTimerTab.TimerYear = (ICTimerTabBuf.TimerYear/16) * 10 +  (ICTimerTabBuf.TimerYear%16);
}

硬件时钟--ht1381时钟芯片驱动

时间: 2024-12-21 07:27:44

硬件时钟--ht1381时钟芯片驱动的相关文章

硬件时钟--DS1307时钟芯片

模拟I2C通讯控制DS1307读写硬件时钟 #include "global.h" #include "drv_ds1307.h" #define I2C_CLK_PORT GPIOB #define I2C_CLK_PIN GPIO_PIN_4 #define I2C_SDA_PORT GPIOB #define I2C_SDA_PIN GPIO_PIN_5 #define SCL_High() GPIO_Init(I2C_CLK_PORT, I2C_CLK_PI

linux 实时时钟(RTC)驱动【转】

本文转载自:http://blog.csdn.net/yaozhenguo2006/article/details/6820218 这个是linux内核文档关于rtc实时时钟部分的说明,此文档主要描述了rtc实时时钟的作用和编程接口,分别介绍了老的rtc接口和新的rtc类架构.并给出了一个测试rtc驱动的程序.     linux 实时时钟(RTC)驱动                                                                        

基于335X平台Linux交换芯片驱动开发

基于335X平台Linux交换芯片驱动开发   一.软硬件平台资料 1.开发板:创龙AM3359核心板,网口采用RMII形式. 2.Kernel版本:4.4.12,采用FDT 3.交换芯片MARVELL的88E6321. 二.移植准备工作 1.熟悉88E6321的datasheet及Functional_Specification_Rev.0.05 2.熟悉设备树相关理论和用法 3.熟悉Linux网络驱动MDIO.PHY部分的软件流程 三.DTS文件修改 本工程的DTS文件以am335x-ice

基于335X平台的UBOOT中交换芯片驱动移植

基于335X平台的UBOOT中交换芯片驱动移植 一.软硬件平台资料 1.开发板:创龙AM3359核心板,网口采用RMII形式. 2.UBOOT版本:U-Boot-2016.05,采用FDT和DM. 3.交换芯片MARVELL的88E6321. 4.参考文章:本博客基于335X的UBOOT网口驱动分析. 二.移植主要步骤 1.准备工作: (1).必须熟悉U-Boot-2016.05中的网口驱动构架,熟悉其中各个网口设备结构体的意义,网口初始化流程.重点详细分析常规基于phydev的驱动初始化的过程

舌尖上的硬件:CPU/GPU芯片制造解析(高清)(组图)

一沙一世界,一树一菩提,我们这个世界的深邃全部蕴藏于一个个普通的平凡当中.小小的厨房所容纳的不仅仅是人们对味道的情感,更有推动整个世界前进的动力.要想理解我们的世界,有的时候只需要细细品味一下我们所喜爱的美食即可.正因为此,我们才规划了<舌尖上的硬件>这样一个系列栏目.通过对美食的品味和体会,我们可以更好地理解许多硬件相关的原理.内涵甚至是趣闻,我们所需要为此准备的,其实仅仅是一颗平和的心而已. 在上一期的<舌尖上的硬件>栏目中,我们第一次接触到了隐藏在食物背后的其与半导体业界的神

网页计算器 &amp;&amp; 简易网页时钟 &amp;&amp; 倒计时时钟

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-

C6455CSL芯片支持库:第五节 芯片驱动DSP程序

经过一段时间,DSP-C6455芯片上的驱动程序,终于调试成功了. 主要驱动外设有如下: 1.EDMA 2.GPIO 3.EMIFA 4.MCBSP 5.PLLC 6.SRIO 7.I2C 8.HPI 9.TIMER 10.TCP2 11.VCP2 [详细资料,DSP C语言代码.咨询qq:1279682290]

C6678CSL芯片支持库:第八节 芯片驱动DSP程序

经过一段时间,DSP-C6678芯片上的驱动程序,终于调试成功了. 主要驱动外设有如下: 0.  核间通信 1.EDMA3 2.MDIO 3.PCIE 4.HyperLink Peripheral 5.EMIF16 6.GbE 7.I2C 8.SPI 9.TIMER 10.SRIO 11.GPIO [详细资料,DSP C语言代码.咨询qq:1279682290]

分布式系统阅读笔记(二十二)-----时钟和时钟同步

时钟的基本概念 时钟 时钟在一般意义上指的是一个计算机的物理时间,每个计算机都会包括他们自己的物理时钟,不同的计算机的物理可能会不同. 时钟漂移 经过在同个地方的计算机,他们的物理也有可能会不一样,如果他们从刚刚开始相同的时间计时开始,过了1过月,1年也可能会有快又慢,这在专业名词上讲叫做时间漂移.本质的原因是每秒的时间偏移,经过日记月累之后,就会有可能达到1秒钟的差距,解决的办法很简单,就是过一段时间之后,将时间纠正回来就可以了. UTC UTC全称是Coordinated Universal