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

    文章

    52

    浏览量

    24439
  • 时钟芯片
    +关注

    关注

    2

    文章

    309

    浏览量

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    深入解析 Adafruit DS3231 精密 RTC 模块:从特性到应用

    DS3231 简介 DS3231 是一款 “Extremely Accurate I²C Integrated RTC/TCXO/Crystal”(极其精确的
    的头像 发表于 05-11 09:50 326次阅读

    探索ATmega128:8位微控制器的佼佼者

    探索ATmega128:8位微控制器的佼佼者 作为电子工程师,在我们的设计生涯中,微控制器的选型至关重要。它就像是我们电子系统的“大脑”,决定着系统的性能和功能。今天,我们就来深入探讨一下Atmel
    的头像 发表于 04-06 14:40 676次阅读

    深入解析 MAX31328:高精度 I2C RTC 的卓越

    深入解析 MAX31328:高精度 I2C RTC 的卓越选 在电子设备的设计中,实时时钟(RTC)是不可或缺的一部分,它为系统提供准确的时间信息,确保设备的正常运行。今天,我们将深
    的头像 发表于 03-26 16:10 190次阅读

    高精度实时时钟DS3232M:功能特性与应用解析

    高精度实时时钟DS3232M:功能特性与应用解析 在电子设备的设计中,精确的时间管理是许多应用的基础。DS3232M作为一款低功耗、高精度
    的头像 发表于 03-24 16:05 280次阅读

    DS3231M:高精度 I2C 实时时钟的全方位解析

    DS3231M:高精度 I2C 实时时钟的全方位解析 在电子设计领域,实时时钟(RTC)是众多系统不可或缺的一部分,它为设备提供精确的时间信
    的头像 发表于 03-24 16:05 393次阅读

    深入解析DS3232:高精度I2C实时时钟的卓越

    深入解析DS3232:高精度I2C实时时钟的卓越选 在电子设计领域,实时时钟(RTC)是许多系
    的头像 发表于 03-24 16:00 241次阅读

    DS3234:高精度SPI总线实时时钟的卓越

    DS3234:高精度SPI总线实时时钟的卓越选 在电子设备中,实时时钟(RTC)是确保设备准确计时的关键组件。
    的头像 发表于 03-24 16:00 279次阅读

    探秘DS3231高精度RTC的卓越

    。下面就带大家详细了解DS3231这款高精度I²C接口、集成RTC/TCXO/晶体的器件。 文件下载: DS3231.pdf 一、
    的头像 发表于 03-24 15:45 321次阅读

    深入剖析DS1340:I2C实时时钟与涓流充电器的完美结合

    深入剖析DS1340:I2C实时时钟与涓流充电器的完美结合 在电子设备的设计中,实时时钟(RTC)是一个关键组件,它能为系统提供精确的时间和日期信息。Maxim Integrated推
    的头像 发表于 03-24 09:50 215次阅读

    探索DS1339A:低功耗I2C实时时钟的卓越

    探索DS1339A:低功耗I2C实时时钟的卓越选 在电子设计领域,实时时钟(RTC)是许多系统中不可或缺的组件,它能为设备提供精确的时间和
    的头像 发表于 03-24 09:30 403次阅读

    深入解析DS1339 I2C串行实时时钟:功能、特性与应用

    深入解析DS1339 I2C串行实时时钟:功能、特性与应用 在电子设计领域,实时时钟(RTC)是一种至关重要的组件,它能为系统提供精确的时间和日期信息。今天我们要探讨的是Maxim
    的头像 发表于 03-24 09:30 246次阅读

    深入解析DS1338:一款功能强大的I2C实时时钟芯片

    深入解析DS1338:一款功能强大的I2C实时时钟芯片 在电子设计领域,实时时钟(RTC)芯片
    的头像 发表于 03-24 09:30 316次阅读

    基于FPGA的I2C控制模块设计

    I2C_WRITE_WDATA.v模块实现I2C写时序,I2C_Controller (I2C控制器)化了
    的头像 发表于 12-26 09:48 6366次阅读
    基于FPGA的<b class='flag-5'>I2C</b>控制模块设计

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

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

    I2C通讯的实时时钟芯片D8563

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