历史上的今天
今天是: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(); }
史海拾趣
|
遥控器用的红外LED,因为红外LED发出的光不完全是红外光,也包含部分的可见光(红色)成分,所以肉眼能看到少许光。遥控器使用的LED,一般发射角度是30度左右,用户即使没有完全对准目标,也能有效操作。在没有外界红外线干扰的时候,遥控距离可以 ...… 查看全部问答> |
|
最近我刚买一块2440的开发板,跑wince5.0,按照PC机设置wince,连上网线后不能上网!不知道是什么原因。PC机可以通过网线与ARM板通信。ftp和fttp都正常。那我应该怎么样设置或还需要哪些工作才能实现我这块开发板与网络的连接呢。… 查看全部问答> |
|
在wince 6.0中我有一个客户端程序,先后两次调用InitializeSecurityContext用于和google服务器端进行安全认证,第一次调用返回的是SEC_I_CONTINUE_NEEDED,第二次返回的是SEC_E_WRONG_PRINCIPAL,请问怎么解决啊?是不是和证书有关系?相同程序在wi ...… 查看全部问答> |
|
【招聘】汇编语言入门图书兼职作者 本公司是业内知名IT图书策划出版公司,正在运作一本汇编语言入门相关图书。想征求关于汇编语言的设计高手参与编写。有意者请将个人介绍和联系方式(QQ或MSN)发到本人邮箱macuilhy@sina.cn。… 查看全部问答> |
|
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); 但是这个定义 ...… 查看全部问答> |
|
欢迎来到电源设计小贴士!随着现在对更高效、更低成本电源解决方案需求的强调,我们创建了该专栏,就各种电源管理课题提出一些对您有帮助的小技巧。该专栏面向各级设计工程师。无论您是从事电源业务多年还是刚刚步入电源领域,您都可以在这里找到一 ...… 查看全部问答> |




