历史上的今天
今天是: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协议就差不多了,重要的代码我已经贴出来给大家借鉴一下,应该是较为通俗易懂的了
史海拾趣
|
单片机外扩一个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这个是干什么用的?… 查看全部问答> |
|
刚开始接触TI的M3系列,属于菜鸟。有一块LM3S3748的开发板,做项目用了LM3S3749,板子焊好后想尝试一下是否可以下载程序,就直接把LM3S3748的开发板中的hello.c编译出来的.bin文件透过LMFlashProgrammer进行写入,用的是串口,第一次程序正常下载成 ...… 查看全部问答> |
|
大家新建工程时,用到的一些库函数还是一直使用默认的目录吗? C:\\tidcs\\c28\\DSP2802x\\v126\\DSP2802x_headers\\include C:\\tidcs\\c28\\DSP2802x\\v126\\DSP2802x_common\\include 有修改后,没错误提示的工程吗?… 查看全部问答> |
|
教你如何用proteus学习ARM---ARM7嵌入式系统设计与仿真 ARM7嵌入式系统设计与仿真:基于Proteus、Keil 与IAR 《ARM7嵌入式系统设计与仿真:基于Proteus、Keil 与IAR》结合动态仿真工具软件Proteus和编译软件IAR,以读者最容易理解的方式介绍了如何使用软件平台设计ARM7嵌入式系统。ARM ...… 查看全部问答> |




