历史上的今天
返回首页

历史上的今天

今天是:2024年12月16日(星期一)

正在发生

2019年12月16日 | STM8L052C6硬件I2C调试:PCF8563/BM856时钟芯片

2019-12-16 来源:eefocus

网上基本都提倡用软件模拟I2C,之前读温湿度传感器也是用模拟的。这次有时间和机会再次用上I2C,固决定用硬件I2C调试下,目前看来没有问题,读写设备都正常。


一、注意事项


1、I2C硬件上需要外部上拉,单纯软件上拉不行。


2、如连续读个字节如8563的second~years数据共7 bytes,中间需要delay。否则只能成功读取前两个byte, clock会断掉。具体delay时间没有确切的验证,用如下实例代码测试OK。


 3、查看是否有time定时中断,读写过程最好先关中断。


二、工程下载


https://download.csdn.net/download/xqw19891201/11267260


三、参考代码


1、IIC初始化


#include "main.h"

#include "bm8563.h"

#include "key.h"

 

 

TimeApi TimeTag;

TimeApi* pTimeTag = &TimeTag;

 

#define IIC_SDA_PORT            GPIOC

#define IIC_SDA_PIN             GPIO_Pin_0

#define IIC_SCL_PORT            GPIOC

#define IIC_SCL_PIN             GPIO_Pin_1

 

#define IIC_FREQ                40000

 

#define BM8563_ADDR                 0xA2

#define BM8563_REG_CTRL_1           0x00

#define BM8563_REG_CTRL_2           0x01

#define BM8563_REG_WATCH_SEC        0x02

#define BM8563_REG_WATCH_MIN        0x03

#define BM8563_REG_WATCH_HOUR       0x04

#define BM8563_REG_WATCH_DATE       0x05

#define BM8563_REG_WATCH_DAY        0x06

#define BM8563_REG_WATCH_MON        0x07

#define BM8563_REG_WATCH_YEAR       0x08

 

enum{

    Sec = 0x00,

    Min,      

    Hour,

    Days,

    WeekDays,

    Mon,

    Years,

    MaxIndex,

};

 

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

//Description: Bm8563Init()   

//Parameters:                          

//Return:      

//Date:           

//Author:       quanwu.xu  

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

void Bm8563Init(void)

{

    pTimeTag->TimeArray[Sec] = 0;

    pTimeTag->TimeArray[Min] = 0;  

    pTimeTag->TimeArray[Hour] = 0;

    pTimeTag->TimeArray[Days] = 0;

    pTimeTag->TimeArray[WeekDays] = 0;  

    pTimeTag->TimeArray[Mon] = 0;

    pTimeTag->TimeArray[Years] = 0;

    pTimeTag->SetIndex = Years;

    

    GPIO_Init(IIC_SCL_PORT, IIC_SCL_PIN, GPIO_Mode_Out_PP_High_Fast);

    GPIO_Init(IIC_SDA_PORT, IIC_SDA_PIN, GPIO_Mode_Out_PP_High_Fast); 

    I2C_DeInit(I2C1);

    CLK_PeripheralClockConfig(CLK_Peripheral_I2C1, ENABLE);

    I2C_Init(I2C1, IIC_FREQ, BM8563_ADDR, I2C_Mode_I2C, I2C_DutyCycle_2,

                           I2C_Ack_Enable, I2C_AcknowledgedAddress_7bit);

}

 

2、时间读取


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

//Description: GetBm8563Data()   

//Parameters:                          

//Return:      

//Date:           

//Author:       quanwu.xu  

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

void GetBm8563Data(TimeApi* pTime)

{

    uint8_t i = 0;

    uint8_t ReadBuf[BUF_LENGTH] = {0};

 

    disableInterrupts();

    

    while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));

 

    //1、start

    I2C_GenerateSTART(I2C1,ENABLE);    

    while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));

 

    //2、write addr

    I2C_Send7bitAddress(I2C1, BM8563_ADDR, I2C_Direction_Transmitter);    

    while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));

 

    //3、write data reg

    I2C_SendData(I2C1, BM8563_REG_WATCH_SEC);

    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));

 

    //4、start

    I2C_GenerateSTART(I2C1,ENABLE);    

    while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));    

 

    //5、read addr reg

    I2C_Send7bitAddress(I2C1, BM8563_ADDR, I2C_Direction_Receiver);

    while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));

 

    //6、read data    

    DelayMs(1);

    for(i=0; i    {            

        if(I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED))

        {

            ReadBuf[i]=I2C_ReceiveData(I2C1);

        }

        

        if(i == (BUF_LENGTH-1))

        {

            I2C_AcknowledgeConfig(I2C1,DISABLE);

        }

   

        else

        {

            I2C_AcknowledgeConfig(I2C1,ENABLE);

        }

        Delay(1000);      

    }

 

    //7、stop

    I2C_GenerateSTOP(I2C1,ENABLE);

    I2C_AcknowledgeConfig(I2C1,ENABLE);

    

    enableInterrupts();

    

    BcdToDecConversion(pTime, ReadBuf);

 

    printflog("20%d%d-%d-%dn", pTime->TimeArray[Years]/10, pTime->TimeArray[Years]%10, pTime->TimeArray[Mon], pTime->TimeArray[Days]);    

    printflog("%d:%d:%dn", pTime->TimeArray[Hour], pTime->TimeArray[Min], pTime->TimeArray[Sec]);    

}


3、时间设定


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

//Description: SetBm8563Data()   

//Parameters:                          

//Return:      

//Date:           

//Author:       quanwu.xu  

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

void SetBm8563Data(TimeApi* pTime)

{    

    uint8_t i = 0;

    uint8_t WriteBuf[BUF_LENGTH] = {0};

    

    pTime->SetIndex = Years;

    DecToBcdConversion(pTime, WriteBuf);

 

    disableInterrupts();

    

    while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY));

    //1、start

    I2C_GenerateSTART(I2C1,ENABLE);    

    while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));

 

    //2、write addr

    I2C_Send7bitAddress(I2C1, BM8563_ADDR, I2C_Direction_Transmitter);

    while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));

 

    //3、write data reg

    I2C_SendData(I2C1, BM8563_REG_WATCH_SEC);

    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));

 

    //write data

    DelayMs(1);

    for(i=0; i    { 

 

        I2C_SendData(I2C1,WriteBuf[i]);

 

        if(i == BUF_LENGTH-1)

        {

            while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));

        }

        else

        {

            while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTING));

        }        

    }

    I2C_GenerateSTOP(I2C1,ENABLE);  

 

    enableInterrupts();   

}


推荐阅读

史海拾趣

Daykin Electric Corp公司的发展小趣事

1995年,大金在上海闵行建立了其在中国的第一家工厂——大金空调(上海)有限公司。这一举措不仅标志着大金正式进入中国市场,也为公司在中国市场的长期发展奠定了坚实的基础。通过与上海闵行的深入合作,大金在中国市场的业务不断壮大,成为了中国家电市场的领军企业之一。

以上故事均基于大金工业株式会社的发展历史进行虚构创作,旨在展示公司在电子行业中的发展历程和成就。

Electro-Films Inc Semi-Films Div公司的发展小趣事

在竞争激烈的电子行业中,持续的研发和创新是企业生存和发展的关键。Semi-Films Division 深知这一点,因此始终将研发和创新作为公司的核心竞争力。公司投入大量资金和资源用于新技术和新产品的研发,不断推出具有更高性能、更低成本的产品来满足市场的需求。这些创新产品不仅为公司带来了丰厚的利润,也提升了公司在行业中的地位和影响力。

Hisetec Electronic Co Ltd公司的发展小趣事

背景:随着环保意识的增强,消费者对电子产品的环保要求也越来越高。Hisetec Electronic Co Ltd公司积极响应这一趋势,将绿色环保理念融入产品设计、生产和回收的全过程。

发展:公司投入大量资金研发环保材料和生产工艺,确保产品从源头到终端都符合环保标准。同时,公司还建立了完善的电子废弃物回收体系,对废旧电子产品进行拆解、分类和再利用。这些举措不仅赢得了消费者的信任和支持,还推动了整个电子行业的绿色升级。

Custom Mmic Design Services Inc公司的发展小趣事

CMDS深知技术创新是企业持续发展的关键。因此,公司不断加大研发投入,积极引进优秀人才和先进技术设备。通过持续的研发投入和人才培养,CMDS不断推出具有创新性和竞争力的新产品和解决方案。这些新产品不仅满足了客户不断变化的需求,也推动了整个行业的发展和进步。

Genesys Logic公司的发展小趣事

进入21世纪,“General Microcircuits”开始实施全球化战略,先后在美国、欧洲、亚洲等地建立研发中心和生产基地。通过全球化布局,公司不仅能够更快地响应不同地区的市场需求,还能充分利用各地的资源优势和技术优势,进一步提升产品的竞争力和市场占有率。同时,公司还加强了与国际知名电子制造商的战略合作,共同推动半导体技术的创新与发展。

BULGIN公司的发展小趣事

作为公认的环境密封连接器及元器件领先制造商,BULGIN公司一直专注于提升在环境密封、电源及防控产品领域的市场地位。公司凭借在极具挑战性的环境中提供可靠、坚固的电源、信号和数据连接的能力,赢得了客户的广泛赞誉。其中,备受欢迎的Buccaneer圆形连接器系列在业界享有出色的声誉,成为公司的一大亮点。

这五个故事展示了BULGIN公司在电子行业中的发展历程和关键里程碑。从创立初期到成为全球领先的电子零件制造商,再到战略性合并和业务扩展,BULGIN始终保持着创新精神和对优质产品的追求。如今,作为环境密封连接器及元器件的领先制造商,BULGIN将继续为客户提供卓越的产品和服务,推动电子行业的持续发展。

问答坊 | AI 解惑

新能源新趋势

新能源几乎成了“绿色”动力的代言。去年底发布的《新能源汽车生产准入管理规则》对新能源汽车有准确的定义,指采用非常规的车用燃料作为动力来源(或使用常规的车用燃料、采用新型车载动力装置),综合车辆的动力控制和驱动方面的先进技术,形成的 ...…

查看全部问答>

关于监控用的摄像头用的LED是什么样的?

遥控器用的红外LED,因为红外LED发出的光不完全是红外光,也包含部分的可见光(红色)成分,所以肉眼能看到少许光。遥控器使用的LED,一般发射角度是30度左右,用户即使没有完全对准目标,也能有效操作。在没有外界红外线干扰的时候,遥控距离可以 ...…

查看全部问答>

wince5.0怎么设置才能实现通过路由上网

最近我刚买一块2440的开发板,跑wince5.0,按照PC机设置wince,连上网线后不能上网!不知道是什么原因。PC机可以通过网线与ARM板通信。ftp和fttp都正常。那我应该怎么样设置或还需要哪些工作才能实现我这块开发板与网络的连接呢。…

查看全部问答>

wince安全性问题

在wince 6.0中我有一个客户端程序,先后两次调用InitializeSecurityContext用于和google服务器端进行安全认证,第一次调用返回的是SEC_I_CONTINUE_NEEDED,第二次返回的是SEC_E_WRONG_PRINCIPAL,请问怎么解决啊?是不是和证书有关系?相同程序在wi ...…

查看全部问答>

各位好心人帮忙解决一个usb驱动问题

小弟现在正在做一个Linux下usb鼠标驱动的程序,但编写程序时总是提示找不到linux/usb.h,望大家帮忙指点,岂求ING………

查看全部问答>

【招聘】汇编语言入门图书兼职作者

【招聘】汇编语言入门图书兼职作者 本公司是业内知名IT图书策划出版公司,正在运作一本汇编语言入门相关图书。想征求关于汇编语言的设计高手参与编写。有意者请将个人介绍和联系方式(QQ或MSN)发到本人邮箱macuilhy@sina.cn。…

查看全部问答>

讲了那么多技术,有没有导购的?

                                 要1K STM32f103c8T6,找谁?…

查看全部问答>

u8 sd_raw_get_info(struct sd_raw_info* info)中struct怎么理解

u8 sd_raw_get_info(struct sd_raw_info* info) { …… } 这个子程序怎么用啊,像u8 mmcWrite(u32 sector, u8* buffer)这种,我在主程序中只要定义unsigned char SD_Write1[]={\"0123456789\"}; 就可以用了mmcWrite(SD_Write1); 但是这个定义 ...…

查看全部问答>

TI 电源设计小贴士 9

欢迎来到电源设计小贴士!随着现在对更高效、更低成本电源解决方案需求的强调,我们创建了该专栏,就各种电源管理课题提出一些对您有帮助的小技巧。该专栏面向各级设计工程师。无论您是从事电源业务多年还是刚刚步入电源领域,您都可以在这里找到一 ...…

查看全部问答>