0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STK600之Atmega128硬件I2C 读写高精度时钟芯片DS3231函数样例

算法&编程学院 来源:网络整理 作者:佚名 2018-02-27 09:05 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

STK600 之 Atmega128硬件I2C 读写高精度时钟芯片DS3231函数

STK600 用于程序的下载 连接JTAG口至mega128目标板即可
//-----------------------------------------------------------------------------
unsigned char DS3231_DATA[19] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,};
unsigned char Date_Data[14] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00};
unsigned char Data_temp[6] = {0x00,0x00,0x00,0x00,0x00,0x00};
unsigned char Buffer_Data[20] = {0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,
0x2C,0x2D,0x2E,0x2F,0x30,0x31,0x32,0x33,0x34,};


void DS3221_initial(void)
{
DS3231_RESETH;
DS3231_RESETL;
delay_ms(300);
DS3231_RESETH;
}

void twi_start_state(void)
{
TWCR = TWCR | 0xA4;
twi_intcheck();
}

void twi_stop_state(void)
{
TWCR = TWCR | 0x94;
TWCR = TWCR | 0x84;
}


void twi_slaw(unsigned char address)
{
address = address << 1;
TWDR = address;
TWCR = TWCR & 0xDF;
TWCR = TWCR | 0x84;
}

void twi_slar(unsigned char address)
{
address = address << 1;
address = address | 0x01;
TWDR = address;
TWCR = TWCR & 0xDF;
TWCR = TWCR | 0x84;
}


void twi_wordadd_write(unsigned char address)
{
TWDR = address;
TWCR = TWCR & 0xDF;
TWCR = TWCR | 0x84;
}

void twi_datawrite(unsigned char data)
{
TWDR = data;
TWCR = TWCR | 0x84;
}

unsigned char twi_dataread(void)
{
unsigned char temp_a;

twi_intcheck();
temp_a = TWDR;
return temp_a;
}

void twi_MT(unsigned char sladdress,unsigned char wordaddress,unsigned char *ds3231data,unsigned char datalength)
{
unsigned char temp_a;
unsigned char temp_b;

twi_start_state();
twi_intcheck();
twi_slaw(sladdress);
twi_intcheck();
twi_wordadd_write(wordaddress);
twi_intcheck();

for(temp_a = 0;temp_a < datalength;temp_a++)
{
temp_b = *ds3231data;
twi_datawrite(temp_b);
++ds3231data;
twi_intcheck();
}
twi_intclear();
twi_stop_state();
}

void twi_MR(unsigned char sladdress,
unsigned char wordaddress,
unsigned char *ds3231data,
unsigned char datalength)
{
unsigned char temp_a;

twi_start_state();
twi_intcheck();
twi_slar(sladdress);
twi_intcheck();
twi_intclear();

for(temp_a = 0;temp_a < datalength;temp_a++)
{
*ds3231data = twi_dataread();
++ds3231data;
twi_intclear();
}
twi_stop_state();
}

void twi_MTR(unsigned char sladdress,
unsigned char wordaddress,
unsigned char *ds3231data,
unsigned char datalength)
{
unsigned char temp_a;

twi_start_state();
twi_intcheck();
twi_slaw(sladdress);
twi_intcheck();
twi_wordadd_write(wordaddress);
twi_intcheck();
twi_start_state();
twi_intcheck();
twi_slar(sladdress);
twi_intcheck();
twi_intclear();

for(temp_a = 0;temp_a < datalength;temp_a++)
{
*ds3231data = twi_dataread();
++ds3231data;
if(temp_a < (datalength - 1))
{
twi_intclear();
}
}
twi_intcheck();
TWCR = TWCR & 0xBF;
twi_stop_state();
TWCR = 0x44;
}


void twi_intcheck(void)
{
unsigned char temp_a;

temp_a = TWCR & 0x80;
while(temp_a == 0x00)
{
temp_a = TWCR & 0x80;
}
}


void twi_intclear(void)
{
TWCR = TWCR | 0x84;
}

void DS3231toDate(unsigned char *ds3231data,unsigned char *Datedata)
{
unsigned char temp_a;
for(temp_a = 0;temp_a < 7;temp_a++)
{
*Datedata = *ds3231data & 0x0F;
++Datedata;
*Datedata = *ds3231data >> 4;
++Datedata;
++ds3231data;
}
temp_a = 0;
}

void DS3231TD_set(unsigned char year,
unsigned char month,
unsigned char date,
unsigned char day,
unsigned char hour,
unsigned char minute,
unsigned char second,
unsigned char time_import,
unsigned char *ds3231data)
{
*ds3231data = second;
++ds3231data;
*ds3231data = minute;
++ds3231data;

if(time_import == Time12)
{
if(hour > 0x12)
{
hour = hour - 0x12;
}
else;
*ds3231data = hour | 0x40;
}
else
{
*ds3231data = hour & 0xBF;
}
++ds3231data;

*ds3231data = day;
++ds3231data;

*ds3231data = date;
++ds3231data;

*ds3231data = month;
++ds3231data;

*ds3231data = year;

twi_MT(DS3231address,0x00,&DS3231_DATA[0],7);
}

void temp_convert(unsigned char *temp_data,
unsigned char *ds3231data)
{
unsigned char temp_b;
temp_b = *ds3231data;
if((temp_b & 0x80) > 0)
{*temp_data = negative;}
else
{*temp_data = positive;}
temp_b = temp_b << 1;  
temp_b = temp_b >> 1;
++temp_data;
*temp_data = temp_b / 100;
++temp_data;
*temp_data = (temp_b % 100) / 10;
++temp_data;
*temp_data = (temp_b % 100) % 10;
++ds3231data;
temp_b = *ds3231data;
temp_b = temp_b >> 6;
temp_b = temp_b * 25;
++temp_data;
*temp_data = temp_b / 10;
++temp_data;
*temp_data = temp_b % 10;
}

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • DS3231
    +关注

    关注

    2

    文章

    51

    浏览量

    24300
  • 时钟芯片
    +关注

    关注

    2

    文章

    283

    浏览量

    41905
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    I2C死锁的问题

    在实际使用过程中,I2C比较容易出现的一个问题就是死锁 ,死锁在I2C中主要表现为:I2C死锁时表现为SCL为高,SDA一直为低。 在I2C主设备进行
    发表于 12-04 06:00

    基于CW32 MCU的I2C接口优化稳定读写EEPROM关键技术

    CW32 MCU优化I2C接口,确保在与EEPROM芯片通信时的稳定性。内容涵盖以下几个关键技术点: I2C时序与频率调整:介绍如何根据EEPROM的特性,合理设置I2C
    发表于 12-03 07:29

    STM32H7CubeMX配置硬件I2C读写失败是什么问题呀?

    STM32H7CubeMX配置硬件I2C读写失败什么问题呀,同样的操作F4和F1都能正常使用,应该不存在i2c地址错误,操作都是一的,但
    发表于 06-12 06:21

    I2C通讯的实时时钟芯片D8563

    功耗极低,有助于延长电池寿命,特别适合用于便携式设备或长时间运行的系统。此外,8563芯片还具备闹钟与定时器功能,通过I2C通信接口与外部设备进行通信,具有高速率的特点,使得数据交换更加高效。因此,它在智能家居系统中可用于控制设备
    的头像 发表于 06-11 15:11 900次阅读
    <b class='flag-5'>I2C</b>通讯的实时<b class='flag-5'>时钟</b><b class='flag-5'>芯片</b>D8563

    tpl0401的I2C读写应该follow什么个格式?

    tpl0401的I2C读写应该follow什么个格式。有没有具体的寄存器地址。 write: char tmp[2]={0x0,0x0}; tmp[1] = writevalue
    发表于 02-11 06:24

    I2C总线通信原理 如何设计I2C总线电路

    、高效的通信接口标准。I2C总线通信原理主要包括以下要点: 总线结构 : I2C总线仅使用两条信号线,即串行数据线(SDA)和串行时钟线(SCL)。 SDA线路用于传输实际的数据信息,而SCL线路则用于同步通信的
    的头像 发表于 01-31 15:01 1879次阅读

    I2C总线的优缺点分析

    I2C总线作为一种广泛使用的串行通信协议,以其简单性和高效性在嵌入式系统中占据着重要地位。 I2C总线的优点 1. 简单性和低成本 I2C总线只需要两条线(数据线SDA和时钟线SCL)
    的头像 发表于 01-17 15:50 1763次阅读

    I2C总线与Arduino的接口示例

    基础 I2C总线由两条线组成:数据线(SDA)和时钟线(SCL)。SDA用于传输数据,而SCL用于同步数据传输。I2C设备可以是主设备或从设备。主设备生成时钟信号并启动数据传输,从设备
    的头像 发表于 01-17 15:34 2359次阅读

    I2C总线的工作模式介绍

    两根线组成:数据线(SDA)和时钟线(SCL)。数据线负责传输数据,而时钟线则用于同步数据传输。I2C总线是全双工的,意味着数据可以在两个方向上传输。它支持多个主设备和从设备,但在同一时刻只能有一个主设备控制总线。
    的头像 发表于 01-17 15:32 1635次阅读

    I2C总线协议详细解析

    总线以其简单性、灵活性和低功耗而闻名,广泛应用于嵌入式系统中。 2. I2C总线的基本组成 I2C总线由两条线组成:数据线(SDA)和时钟线(SCL)。SDA用于传输数据,而SCL用于
    的头像 发表于 01-17 15:22 1571次阅读

    I2C总线故障排除技巧

    I2C总线是一种广泛使用的串行通信协议,它允许多个设备在两条线上(数据线SDA和时钟线SCL)进行通信。由于其简单性和灵活性,I2C总线在嵌入式系统中非常流行。然而,当I2C总线出现问
    的头像 发表于 01-17 15:20 3864次阅读

    I2C总线与单片机的连接

    组成:数据线(SDA)和时钟线(SCL)。SDA负责数据的传输,而SCL则用于同步数据传输。I2C协议支持多主机和多从机的通信,每个设备都有一个唯一的地址。通信过程中,主机负责生成时钟信号,从机则根据
    的头像 发表于 01-17 15:18 1969次阅读

    I2C总线设备地址设置方法

    I2C总线是一种广泛使用的串行通信协议,它允许多个设备在两条线上(数据线SDA和时钟线SCL)进行通信。每个设备都有一个唯一的地址,以确保数据能够正确地发送到目标设备。 I2C地址概述 I2C
    的头像 发表于 01-17 15:17 6964次阅读

    I2C总线应用实例分析

    I2C总线使用两条线进行通信:数据线(SDA)和时钟线(SCL)。这种双线制设计使得I2C总线能够在多个设备之间共享,而不需要为每个设备单独布线。 应用实例:温湿度传感器 假设我们正在设计一个智能家居系统,需要实时监测室内的温
    的头像 发表于 01-17 15:09 1242次阅读

    全志模块设备开发I2C编程基础介绍

    )I2C核心层: ​I2C核心提供了I2C总线驱动和设备驱动的注册、注销方法,I2C通信方法(algorithm)的上层部分,并且还提供了一系列与具体
    发表于 12-16 09:45