历史上的今天
返回首页

历史上的今天

今天是:2024年09月11日(星期三)

正在发生

2020年09月11日 | 基于stm8的IIC协议---DS3231时钟模块读取

2020-09-11 来源:eefocus

一、综述

上一篇协议已经详细解说了iic协议的各个函数,通过上一篇协议,相信大家已经对iic有了一定的认识。这一篇博客,我是利用了IIC协议来实现DS3231传感。刚学习的朋友可以买一块来试手,上手较为简单。


二、具体任务实现步骤


1.硬件上:

接线较为简单,保证传感接地与接上电源,由数据手册可以知道,电源要接3.3v,过大电流会烧坏传感。SDA 与 SCL两个引脚分别接自己定义的


2.软件上:


(1)官方手册


这里给出的数据手册是英文版的,可以自行提取,需要中文版的可以自己去淘宝搜索一下,看一些相关的介绍和去百度找中文资料手册。


链接:https://pan.baidu.com/s/1Oo6o68SoVr7gt8tPZIoQxw

提取码:uzih

 

(2)器件地址 


设备地址可以从数据手册上找到。


#define DS3231_Address           0xD0                           //设备地址

 

(3)寄存器地址


这里的寄存器地址有很多个,但是实际用到的时候,只要任选一个即可。


#define DS3231_Address           0xD0                           //设备地址

#define Seconds_Register         0x00                           //秒钟寄存器

#define Minutes_Register         0x01                           //分钟寄存器

#define Hour_Register            0x02                           //小时寄存器

#define Day_Register             0x03                           //星期寄存器

#define Date_Register            0x04                           //日期寄存器

#define Month_Register           0x05                           //月份寄存器(第七位是世纪位)

#define Year_Register            0x06                           //年份寄存器


三、例程


3.1库函数添加


在进行所有调试之前,首先要确保工程已经添加了库函数,打开STM8S_StdPeriph_Lib,这是一个官方的库文件,下载IAR STM8包的时候就携带,将Libraries文件复制到你工程所在的文件下,并将有关于ADC的库文件添加到你的工程列表当中。添加完成后,就可以开始编写代码了(如果你将全部的库文件都添加进来的话,编译程序后库文件还有红点报错的话,这是因为你选的芯片上没有该功能,你需要将其删掉才能不报错。)如图。

3.2代码部分


clock.c文件的代码:


#include "Clock.h"

 

uint8_t vSen_DS3231_Read_Bytes()

{

  uint8_t uRev_Register_Data = 0x00;

   //起始信号:

  Start_Signal_IIC_();

   //发送设备地址

  Send_Data_IIC_(DS3231_Address);

    bIIC_ReadACK();

   //发送寄存器

  Send_Data_IIC_(Hour_Register);

   //主动相应

  vIIC_Ack();

   //起始信号:

  Start_Signal_IIC_();

   //发送设备地址

  Send_Data_IIC_(DS3231_Address+1);

   //主动相应

  vIIC_Ack();

   //读取寄存器地址.

  uRev_Register_Data=uIIC_RecvByte();

   //主动不应答

  vIIC_NAck();

   //结束信号

  End_Data_IIC_();  

  return uRev_Register_Data;

}


uint8_t vSen_DS3231_Write_Bytes(void)

{

   //起始信号:

  Start_Signal_IIC_();

  //发送设备地址

  Send_Data_IIC_(DS3231_Address);

  //判断是否有应答

 bIIC_ReadACK();

  //4.发送寄存器

  Send_Data_IIC_(Hour_Register);

  //5.等待响应

  bIIC_ReadACK();

  //6.发送数据到寄存器中

  Send_Data_IIC_(0x10);

  //7.等待应答

  bIIC_ReadACK();

  //8.结束信号

  End_Data_IIC_();

  return 1;

}


u8 read_Bytes(u8 ReadAddr)
{

   uint8_t uRev_Register_Data = 0x00;

   //起始信号:

   Start_Signal_IIC_();

   //发送设备地址

   Send_Data_IIC_(DS3231_Address);

   bIIC_ReadACK();

   //4.发送寄存器

   Send_Data_IIC_(ReadAddr);

   //5.主动相应

   vIIC_Ack();

   //起始信号:

   Start_Signal_IIC_();

   //发送设备地址

   Send_Data_IIC_(DS3231_Address+1);

   //主动相应

   vIIC_Ack();

   //读取寄存器地址.

   uRev_Register_Data=uIIC_RecvByte();

   //主动不应答

   vIIC_NAck();

   //结束信号

   End_Data_IIC_(); 

   return uRev_Register_Data;      

}


void DS3231_WriteByte(u8 WriteAddr,u8 DataToWrite)

{

  Start_Signal_IIC_();

  Send_Data_IIC_(DS3231_Address);

  bIIC_ReadACK();

   

  Send_Data_IIC_(WriteAddr);

  bIIC_ReadACK();

   

  Send_Data_IIC_(DataToWrite);

  bIIC_ReadACK();

   

  End_Data_IIC_();

  delay_ms(10000);

   

}


//************************modify time********************************************

void ModifyTime(u8 yea,u8 mon,u8 da,u8 hou,u8 min,u8 sec)
{
  u8 temp=0;
  DS3231_WriteByte(0x06,temp);//修改年
  DS3231_WriteByte(0x05,temp);//修改月
  DS3231_WriteByte(0x04,temp);//修改日
  DS3231_WriteByte(0x02,temp);//修改时
  DS3231_WriteByte(0x01,temp);//修改分
  DS3231_WriteByte(0x00,temp);//修改秒
}


  接下来是iic.c里面的两个函数,iic.c里面的其他函数已经在上一篇贴出来,并且贴出了部分解释。下面两个是B格式与BCD格式的相互转化:


uint8_t Byte_Transform_BCD(uint8_t uData)

{

  uint8_t i, j, uBCD_Code;

   

  i = uData / 10;

  j = uData % 10;

  uBCD_Code = j + ( i << 4 );

   

  return uBCD_Code;

   

}

 

uint8_t BCD_Transform_Byte(uint8_t uData)

{

    uint8_t uByte_Code;

 

    uByte_Code  = (uData & 0x0f);

    uData     >>= 4;

    uData      &= 0x0f;

    uData      *= 10;

    uByte_Code += uData;

 

    return uByte_Code;

     

}


3.3结局测试

代码已经po出来了,最后是进行数据测试,最直观的办法是看波形变化,如果接收或者发送不了数据,可以直接通过示波器的波形变化曲线来了解一下。最后数据也可以在串口上看到接收发送的数据。


四、总结

到这里为止,基于iic的DS3231协议就差不多了,重要的代码我已经贴出来给大家借鉴一下,应该是较为通俗易懂的了


推荐阅读

史海拾趣

蓝箭(BLUE ROCKET)公司的发展小趣事

蓝箭电子的前身是佛山市无线电四厂,创建于七十年代初。随着时代的变迁和市场的需求,该厂在1998年成功转制为有限责任公司,迈出了向现代化企业转型的重要一步。这次转型不仅为公司注入了新的活力,也为后续的发展奠定了坚实的基础。

Cal Test Electronics公司的发展小趣事

在市场竞争日益激烈的情况下,Cal Test Electronics不断拓展产品线,以满足不同客户的需求。公司研发团队致力于开发具有创新性和竞争力的新产品,同时在现有产品的基础上进行升级和优化。这些努力使得公司的产品线日益丰富,涵盖了七大连接类别中的3000多种产品。这些产品不仅在国内市场上受到欢迎,还逐渐走向国际市场。

General Instrument公司的发展小趣事
保护器的设定值或内部元件过于敏感,导致在电压稍有波动时就触发保护机制。
CMOSIS公司的发展小趣事

在追求经济效益的同时,CMOSIS公司也注重可持续发展和社会责任。公司积极采用环保材料和工艺,减少生产过程中的能源消耗和废弃物排放。同时,公司还积极参与社会公益活动,为推动社会进步和可持续发展贡献自己的力量。这些举措不仅提升了公司的社会形象,也为公司的长期发展奠定了坚实的基础。

请注意,以上故事是基于一般性的电子行业发展趋势和CMOS图像传感器市场的特点构建的,并未涉及CMOSIS公司的具体内部情况。如果需要更详细和准确的信息,建议直接查阅CMOSIS公司的官方资料或相关新闻报道。

Exar [Exar Corporation]公司的发展小趣事

Exar始终注重通过收购和合并来增强自身的技术实力和市场竞争力。例如,2012年Exar收购了Integrated Memory Logic Limited(iML),这一举措加强了其在存储和数据管理领域的地位。通过收购iML,Exar获得了更多的技术资源和市场份额,为其后续的发展提供了有力支持。

Alpha & Omega Semiconductor(万国半导体)公司的发展小趣事

2017年,Exar被MaxLinear公司收购,这是Exar发展历程中的一个重要里程碑。通过合并,Exar和MaxLinear的产品和技术得到了有效整合,两家公司在模拟和混合信号领域的优势得到了进一步加强。合并后的公司继续在通信、视频处理、存储、电源管理和时钟管理等多个领域发挥重要作用。

问答坊 | AI 解惑

单片机 C语言函数速查

非常好用的C 语言速查手册。大家可以下载看看,给自己单片机编程语言绝对是个提高…

查看全部问答>

数码管动态扫描原理及其编程方法

数码管动态扫描原理及其编程方法…

查看全部问答>

SRAM IDT71V124SA程序编写问题

单片机外扩一个IDT71V124SA用于存储数据,但是数据手册中IDT71V124SA读和写都有两个时序,请教下这两个时序之用其中一个还是有先后顺序的关系? 顺便求个范例程序:$ :$…

查看全部问答>

电源线和地线的布线规则(很经典)

在PCB板布线中,整个PCB板中的布线完成得都很好,但如果电源、 地线的布置考虑不周到而引起干扰,使产品的性能下降,严重时会降低产品的成功率。要把电源线和地线处理好,将电源线和地线所产生的噪音干扰降到最低限度,以保证产品的质量。 一、电 ...…

查看全部问答>

我的设备信息:usb\VID_19D2&PID_0017&MI_03\6&227C3C0A&0003,请问后面6&227C3C0A&0003这个是干什么用的?

我的设备信息:usb\\VID_19D2&PID_0017&MI_03\\6&227C3C0A&0003,请问后面6&227C3C0A&0003这个是干什么用的?…

查看全部问答>

【信号处理】:基于Xilinx+FPGA的小波滤波器设计与仿真

  [ 本帖最后由 liuceone 于 2011-12-10 17:31 编辑 ]…

查看全部问答>

LM3S3749程序下载出错请教

刚开始接触TI的M3系列,属于菜鸟。有一块LM3S3748的开发板,做项目用了LM3S3749,板子焊好后想尝试一下是否可以下载程序,就直接把LM3S3748的开发板中的hello.c编译出来的.bin文件透过LMFlashProgrammer进行写入,用的是串口,第一次程序正常下载成 ...…

查看全部问答>

CCS4新建工程项目路径问题

大家新建工程时,用到的一些库函数还是一直使用默认的目录吗? C:\\tidcs\\c28\\DSP2802x\\v126\\DSP2802x_headers\\include C:\\tidcs\\c28\\DSP2802x\\v126\\DSP2802x_common\\include 有修改后,没错误提示的工程吗?…

查看全部问答>

请问在分块传送中,apscMaxWindowSize常量和block number是什么含义

如题,理解的很模糊,希望有大神能给清晰的解释一下…

查看全部问答>

教你如何用proteus学习ARM---ARM7嵌入式系统设计与仿真

ARM7嵌入式系统设计与仿真:基于Proteus、Keil 与IAR     《ARM7嵌入式系统设计与仿真:基于Proteus、Keil 与IAR》结合动态仿真工具软件Proteus和编译软件IAR,以读者最容易理解的方式介绍了如何使用软件平台设计ARM7嵌入式系统。ARM ...…

查看全部问答>