历史上的今天
返回首页

历史上的今天

今天是:2025年04月06日(星期日)

2020年04月06日 | stm8的ds1302时钟传输总为1的问题整合

2020-04-06 来源:eefocus

具体ds1302的原理可以查阅相关中文资料:

ds1302使用的流程具体为:


向ds1302写入命令及初始时间,初始化ds1302。

向ds1302写入命令并读取ds1302寄存器中的时间。

将读取的时间保存到数组,或传输到电脑,oled等。

检测ds1302是否正常使用一般使用uart通讯,将结果传输到电脑上,用电脑串口助手检测。


但使用网上的代码经常会出现的问题就是传输值总为1,总结了一下有这么几种情况:


读取数据时要新建一个都为0的数组保存,或是用结构体指针来保存。

stm8内在读取gpio口电平库函数出现问题。

接线没有接到对应设定的gpio口上。

写入命令,数据函数有问题。

读取函数数组干扰。

数据保存问题:

unsigned char READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d};

unsigned char WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};

unsigned char WTIME[7] = {0X00, 0X30, 0X20, 0X25, 0X07, 0X03, 0X18};

unsigned char RTime[7] = {0,0,0,0,0,0,0};`

第一个数组为读取时间时需要写入的命令;

第二个数组为写入初始值时需要写入的命令;

第三个数组为初始时间;

第四个数组为读取后保存时间的数组。

或是:


typedef struct _DS1302_TIME

{

    unsigned char year;

    unsigned char month;

    unsigned char day;

    unsigned char week;

    unsigned char hour;

    unsigned char minute;

    unsigned char second;

}DS1302_TIME;


读取端口电平函数问题:

在stm8自带的库函数中,找到stm8s_gpio.c这个文件,找到:


BitStatus GPIO_ReadInputPin(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef GPIO_Pin)

{

    return ((BitStatus)(GPIOx->IDR & (uint8_t)GPIO_Pin));

}


将这段代码改为:


BitStatus GPIO_ReadInputPin(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef GPIO_Pin)

{

   return ((GPIOx->IDR & (uint8_t)GPIO_Pin) ? SET : RESET);

}


就可以正常读取电平。`


写入函数问题:

一般51,32中的读写函数为:


void Ds1302Write( unsigned char addr, unsigned char dat)

{

  unsigned char n;

  DS1302_DSIO_OUT();

  DS1302_DSIO_0();

  DS1302_RST_0();

  DS1302_SCLK_0();

  DS1302_RST_1();


  for (n=0; n<8; n++)

  {

    if(addr & 0x01)

    {

      DS1302_DSIO_1();

    }

    else 

    {

      DS1302_DSIO_0();

    }     

    DS1302_SCLK_1();

    asm("nop");

    DS1302_SCLK_0();

    asm("nop");

    addr >>= 1;

  }

  for (n=0; n<8; n++)

  {   

    if(dat & 0x01)

    {

      DS1302_DSIO_1();

    }

    else 

    {

      DS1302_DSIO_0();

    }

    asm("nop");

    DS1302_SCLK_0();

    asm("nop");

    dat >>= 1;

  }          

  DS1302_RST_0();

  asm("nop");

}


其中DS1302_DSIO_1();是设置连接ds1302的DSIO口的端口为高电平,0为设置低电平。

将其改为:


/*******************************************************************************

*****函数名:DS1302_Write_Byte

*****函数功能:写入动作数据

*****输入:想要写入的数据

*****输出:无

*****说明:无

*******************************************************************************/

void DS1302_Write_Byte(unsigned char temp)

{

    unsigned char i;

    for (i = 0; i < 8; i++) {

                Delay_us(50);

        GPIO_LOW(DS1302_PORT, DS1302_CLK_PIN);

        if (temp & 0X01) {

               GPIO_HIGH(DS1302_PORT, DS1302_IO_PIN);

        }

        else {

            GPIO_LOW(DS1302_PORT, DS1302_IO_PIN);

        }

        temp >>= 1;

                Delay_us(50);

        GPIO_HIGH(DS1302_PORT, DS1302_CLK_PIN);

    }


}


/*******************************************************************************

*****函数名:DS1302_Read_Byte

*****函数功能:读出动作数据

*****输入:无

*****输出:读出的数据

*****说明:返回一个八位的二进制数

*******************************************************************************/

unsigned char DS1302_Read_Byte(void)

{

    unsigned char i, temp = 0;

    for (i = 0; i < 8; i++) {

                Delay_us(50);

        GPIO_LOW(DS1302_PORT, DS1302_CLK_PIN);

        temp >>= 1;

        if (GPIO_ReadInputPin(DS1302_PORT, DS1302_IO_PIN))

        {

            temp|=0X80;

        }

                Delay_us(50);

        GPIO_HIGH(DS1302_PORT, DS1302_CLK_PIN);

    }

    return temp;

}


/*******************************************************************************

*****函数名:DS1302_Write

*****函数功能:写入数据

*****输入:地址 写入的数据

*****输出:无

*****说明:无

*******************************************************************************/

void DS1302_Write(u8 address, u8 dat)

{

    Write_IO();

    GPIO_LOW(DS1302_PORT,  DS1302_CS_PIN);

    GPIO_LOW(DS1302_PORT, DS1302_CLK_PIN);

    GPIO_HIGH(DS1302_PORT, DS1302_CS_PIN);

    Delay_us(10);

    DS1302_Write_Byte(address);

    DS1302_Write_Byte(dat);

    Delay_us(10);

    GPIO_LOW(DS1302_PORT, DS1302_CS_PIN);

}


/*******************************************************************************

*****函数名:DS1302_Read

*****函数功能:读出数据

*****输入:地址

*****输出:读出的数据

*****说明:返回一个八位的二进制数

*******************************************************************************/

unsigned char DS1302_Read(u8 address)

{

    u8 ret;

    Write_IO();

    GPIO_LOW(DS1302_PORT,  DS1302_CS_PIN);

    GPIO_LOW(DS1302_PORT, DS1302_CLK_PIN);

    GPIO_HIGH(DS1302_PORT, DS1302_CS_PIN);

        Delay_us(10);

    DS1302_Write_Byte(address | 0X01);

    Read_IO();

    ret = DS1302_Read_Byte();

        Delay_us(10);

    GPIO_LOW(DS1302_PORT,  DS1302_CS_PIN);

    return ret;

}


GPIO_HIGH等就是stm8库函数的基本使用,DS1302_PORT,DS1302_CS_PIN是端口定义。


数组干扰问题:

有时候会有一种情况就是,在读取的时候,读取完年,保存年的数组是正确的,但读取月时,年的数据也会被改变(这个我也还没搞清楚为什么),这个时候要读取一次输出一次,就可以保存正确的数据。


/*******************************************************************************

*****函数名:DS1302_Read_TIME系列

*****函数功能:读当前的时间

*****输入:结构指针类型time

*****输出:无

*****说明:无

*******************************************************************************/

void DS1302_Read_Year(DS1302_TIME* time)

{

        time->year = DS1302_Read( DS1302_YEAR_REG);

}   

void DS1302_Read_Month(DS1302_TIME* time)

{

        time->month = DS1302_Read(DS1302_MONTH_REG);

}

void DS1302_Read_Day(DS1302_TIME* time)

{

        time->day = DS1302_Read(DS1302_DATE_REG);

}

void DS1302_Read_Week(DS1302_TIME* time)

{

        time->week = DS1302_Read(DS1302_DAY_REG);

}

void DS1302_Read_Hour(DS1302_TIME* time)

{

        time->hour = DS1302_Read(DS1302_HR_REG);

}

void DS1302_Read_Minute(DS1302_TIME* time)

{

        time->minute = DS1302_Read(DS1302_MIN_REG);

}

void DS1302_Read_Second(DS1302_TIME* time)

{

        time->second = DS1302_Read(DS1302_SEC_REG);

}

推荐阅读

史海拾趣

Bals Elektrotechnik GmbH & Co KG公司的发展小趣事

随着公司业务的不断扩展,Bals Elektrotechnik开始寻求国际化的发展道路。1990年代,公司决定在中国昆山设立工厂,以便更好地服务亚洲市场。这一决策不仅提高了公司的生产效率和市场竞争力,也为其在全球范围内的业务拓展提供了有力支持。

Barry Industries Inc公司的发展小趣事

Barry Industries Inc深知品质是企业生存和发展的关键。因此,公司始终将品质管理放在首位,从原材料采购到生产流程控制,再到产品出厂检验,每一个环节都严格把控品质。同时,公司还注重品牌建设,通过提升产品形象和服务水平,逐渐树立了良好的品牌形象。

Active-Semi公司的发展小趣事

随着电子行业的快速发展,Barry Industries Inc意识到只有不断创新才能在市场中立足。公司加大了对研发的投入,引进了一批高素质的研发人才,并建立了完善的研发体系。经过多年的努力,Barry成功突破了微波半导体封装技术的多项关键技术,推出了多款性能卓越、具有创新性的产品。这些产品不仅广泛应用于军事、航天、通信等领域,还为公司赢得了市场的广泛认可。

E-Z-HOOK公司的发展小趣事

在1956年的一个晴朗午后,E-Z-HOOK的创始人阿尔伯特·史密斯(化名)在实验室里遇到了一个棘手的问题。他正在测试一个复杂的电子系统,但发现现有的测试工具无法满足他的需求。于是,他动手设计并制造出了第一个E-Z-HOOK测试钩,这个简单但实用的工具极大地方便了他的工作。史密斯看到了这个产品的巨大潜力,于是决定成立一家公司来专门生产这种测试钩。这就是E-Z-HOOK公司的起源。

ARBOR公司的发展小趣事

面对日益激烈的市场竞争,ARBOR公司始终坚持创新驱动的发展策略。公司不断加大研发投入,引进高素质的研发人才,加强与国内外科研机构的合作。通过不断创新,ARBOR公司成功推出了一系列具有自主知识产权的新产品和技术。这些创新成果不仅提升了公司的核心竞争力,也为公司的未来发展注入了新的动力。

虽然这些故事是虚构的,但它们反映了电子行业公司可能面临的挑战和机遇。通过不断的技术创新、市场拓展和合作共赢,ARBOR公司或类似的电子企业可以不断壮大并引领行业的发展。

HB公司的发展小趣事

服务:Hartmann Codier GmbH深知客户是企业发展的基石。因此,公司始终将客户服务放在首位,致力于为客户提供优质的产品和服务。公司建立了完善的客户服务体系,包括售前咨询、售中支持和售后服务等环节。

成果:通过不断优化客户服务流程和提高服务质量,Hartmann Codier GmbH赢得了广大客户的信赖和支持。公司与客户之间建立了长期稳定的合作关系,共同推动了电子行业的繁荣发展。同时,公司也根据客户的反馈和需求,不断改进产品和服务,以满足市场的不断变化和升级。

问答坊 | AI 解惑

智能家居平台系统的技术发展趋势

(1)硬件平台的处理能力日益增强早期的智能中控器采用8位单片机作为核心处理单元,功能比较简单、纯粹。往往只具备安防、三表采集、简单文字信息发布和简单的家电控制功能。近几年很多厂家为了使自己的产品功能更全面、显示更美观,采用了处理能力更 ...…

查看全部问答>

快捷直观的增加内电层网络以及电源网络的分割

1.添加内电层: 在PCB文档中 > Design >Dayer Dtack Danager > 选中左边界面栏的DopPlayer > Add Plane > 会左边对应Toplayer下面区域突出红色显示新增的内电层InternalPlane1和InternalPlane2 选中其单击Properties 或直接双击进行属性设置 > ...…

查看全部问答>

最简单的12个proteus仿真

最简单的12个proteus仿真…

查看全部问答>

旁路电容去耦电容

关于旁路电容和去耦电容的概念理解…

查看全部问答>

ICCAVR_mega8_Proteus LCD1602显示

//ICC-AVR application builder : 2009-3-12 16:02:34 // Http://www.oa-only.com // Target : M8 // Crystal: 8.0000Mhz #include #include void port_init(void) { PORTB = 0x00; DDRB  = 0x00; PORTC = 0x00; //m103 o ...…

查看全部问答>

SDIO设备驱动的问题!

有没有人碰到过SDIO的WIFI加载不成功的情况呀:,帮我看看SDIO的WIFI有什么问题呀?总是加载不了,SD卡内存又可以,打印信息如下: SDBusDriver: PROCESS_ATTACH SDBusDriver: PROCESS_DETACH interruptuse is not used!! SDBusDriver: PRO ...…

查看全部问答>

有谁用过TI的121x系列单片机?

有谁用过TI的121x系列单片机?我在用1214单片机进行ADC采样时候碰到了麻烦,ADC采样速度和精度都上不去(我要求是1000次/s),但是其adc是24位的,本应该很精确的。希望有经验的高手指教,加我qq:17646245 或者邮箱liuhailin1984@yahoo.com。不胜 ...…

查看全部问答>

开发无线模块--深圳品联通信科技有限公司

深圳品联通信科技有限公司 联系方式:13662299586---张先生 公司拥有多位高频及软件专业工程师,专业开发生产微功率无线数据通信模块,产品提供标准接口、抗干扰能力强、距离远、适合恶劣环境使用。主要有:无线数传模块、无线通信模块、无线通讯 ...…

查看全部问答>

这个家伙发的帖到底在写什么

WHAT??!!这个家伙的帖子到底写的神马玩意,问的什么问题?帖子我们发多了,也看多了。恶心的帖子没少看,估计也写过不少让人恶心的帖子。嘿嘿,不要不好意思...让我们来聊一聊,你都是怎么发贴的,你会选择什么样的策略和方式发帖,以获取更好 ...…

查看全部问答>

vxworks死机问题,在线等高手解答!

板卡主控芯片MPC8270 接收1000个sip用户的同时注册、此时做大话务量呼叫,设备死机且无任何任务异常信息抛出,shell彻底死掉,不能敲任何命令,被狗咬后设备重启:重启是抛出如下信息:               ...…

查看全部问答>