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

    浏览量

    23840
  • 时钟芯片
    +关注

    关注

    2

    文章

    249

    浏览量

    39884
收藏 人收藏

    评论

    相关推荐

    怎么通过I2C或SPI读写AIC3254的寄存器?

    我看了AIC3254的数据手册,没有看没明白怎么通过I2C或SPI读写AIC3254的寄存器,求大侠指点
    发表于 11-05 08:22

    RISC V的I2C操作

    system_i2c_0_io_scl_writeEnable = !system_i2c_0_io_scl_write;Interface配置示例I2C寄存器设置在I2C的设置中第
    的头像 发表于 11-01 11:06 205次阅读

    TLV320AIC3263 i2c无法进行通信,通过i2c读写函数读写寄存器失败怎么解决?

    麻烦帮忙分析下以下问题的原因 1、i2c无法进行通信,通过i2c读写函数(系统提供),读写寄存器失败: 写寄存器,返回-5: 读寄存
    发表于 10-28 07:32

    具有兼容 SMBus 和 I2C 接口的 TMP116 高精度、低功耗数字温度传感器数据表

    电子发烧友网站提供《具有兼容 SMBus 和 I2C 接口的 TMP116 高精度、低功耗数字温度传感器数据表.pdf》资料免费下载
    发表于 08-13 09:47 0次下载
    具有兼容 SMBus 和 <b class='flag-5'>I2C</b> 接口的 TMP116 <b class='flag-5'>高精度</b>、低功耗数字温度传感器数据表

    TMP117 具有 SMBus™ 和I2C兼容接口的高精度、低功耗数字温度传感器数据表

    电子发烧友网站提供《TMP117 具有 SMBus™ 和I2C兼容接口的高精度、低功耗数字温度传感器数据表.pdf》资料免费下载
    发表于 08-12 10:50 0次下载
    TMP117 具有 SMBus™ 和<b class='flag-5'>I2C</b>兼容接口的<b class='flag-5'>高精度</b>、低功耗数字温度传感器数据表

    TMAG5173-Q1具有I2C接口的高精度3D霍尔效应传感器数据表

    电子发烧友网站提供《TMAG5173-Q1具有I2C接口的高精度3D霍尔效应传感器数据表.pdf》资料免费下载
    发表于 08-09 10:47 0次下载
    TMAG5173-Q1具有<b class='flag-5'>I2C</b>接口的<b class='flag-5'>高精度</b>3D霍尔效应传感器数据表

    DS3231 RTC模块的I2C通信失败的原因?怎么解决?

    ;< 1)); if (!i2c_master_checkAck()) { os_printf(\"在 i2C 上写入 DS3231 时出错rn\"
    发表于 07-11 06:12

    ESP32C3 I2C no ack无应答怎么解决?

    (一)现象 我使用idf开发esp32c3,使用i2c外设时出现问题。I2C正常发送了出去,但从机没有应答。 我此前使用过nxp的lpc55s69进行过测试,并将这两次的波形使用逻辑分析仪采集出来
    发表于 06-14 07:31

    几款高精度时钟芯片的规格选型分析

    几款高精度时钟芯片,几乎很多应用都需要精确的计时例如银行系统,安全系统和电能表等。获得高精度实时时钟芯片
    发表于 05-13 11:50 0次下载

    请问使用HAL库硬件I2C时如何设置器件地址?

    我使用的模块是包含了DS1307的AT24C32两个I2C通讯的芯片,开始准备启用硬件I2C,但
    发表于 04-17 07:31

    如何根据时序图编写高效IO模拟I2C程序

    I2C读写字节是这么定义的:当时钟线为低电平的时候,允许修改数据线的电平状态,在时钟线为高电平的时候读取数据线的状态。
    的头像 发表于 04-06 03:05 3923次阅读
    如何根据时序图编写高效IO模拟<b class='flag-5'>I2C</b>程序

    STM32F103利用软件模拟I2C读写EEPROM,超过385个字节就读写不了的原因?

    在STM32F103的芯片中,利用软件模拟I2C读写EEPROM,在使用页写入的方式进行读写时,能够读写385个字节,(EEPROM
    发表于 03-19 07:45

    什么是I2C协议 I2C总线的控制逻辑

    在实际使用过程中,I2C比较容易出现的一个问题就是死锁 ,死锁在I2C中主要表现为:I2C死锁时表现为SCL为高,SDA一直为低。
    发表于 03-12 09:17 1072次阅读
    什么是<b class='flag-5'>I2C</b>协议 <b class='flag-5'>I2C</b>总线的控制逻辑

    I2C接口称重采集单元

    本周带来的是一款称重采集变送器单元WeightI2CUnit。该传感器内部采用”STM32+HX711芯片”的方案,通过I2C通讯方式实现24位精度的重量测量。同时支持并联多个设备到同
    的头像 发表于 02-24 08:28 456次阅读
    <b class='flag-5'>I2C</b>接口称重采集单元

    GD32 MCU硬件I2C不可靠不如软件I2C?来看看红枫派开发版的硬件I2C驱动如何做到稳得一批

    在一个评论中,看到网友对硬件I2C的讨论,硬件I2C Busy找不到原因、软件I2C稳得一批。
    的头像 发表于 02-23 09:37 2793次阅读
    GD32 MCU<b class='flag-5'>硬件</b><b class='flag-5'>I2C</b>不可靠不如软件<b class='flag-5'>I2C</b>?来看看红枫派开发版的<b class='flag-5'>硬件</b><b class='flag-5'>I2C</b>驱动如何做到稳得一批