历史上的今天
今天是: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);
}
上一篇:stm8及DS1302的一些操作
史海拾趣
|
(1)硬件平台的处理能力日益增强早期的智能中控器采用8位单片机作为核心处理单元,功能比较简单、纯粹。往往只具备安防、三表采集、简单文字信息发布和简单的家电控制功能。近几年很多厂家为了使自己的产品功能更全面、显示更美观,采用了处理能力更 ...… 查看全部问答> |
|
1.添加内电层: 在PCB文档中 > Design >Dayer Dtack Danager > 选中左边界面栏的DopPlayer > Add Plane > 会左边对应Toplayer下面区域突出红色显示新增的内电层InternalPlane1和InternalPlane2 选中其单击Properties 或直接双击进行属性设置 > ...… 查看全部问答> |
|
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的WIFI加载不成功的情况呀:,帮我看看SDIO的WIFI有什么问题呀?总是加载不了,SD卡内存又可以,打印信息如下: SDBusDriver: PROCESS_ATTACH SDBusDriver: PROCESS_DETACH interruptuse is not used!! SDBusDriver: PRO ...… 查看全部问答> |
|
有谁用过TI的121x系列单片机?我在用1214单片机进行ADC采样时候碰到了麻烦,ADC采样速度和精度都上不去(我要求是1000次/s),但是其adc是24位的,本应该很精确的。希望有经验的高手指教,加我qq:17646245 或者邮箱liuhailin1984@yahoo.com。不胜 ...… 查看全部问答> |
|
深圳品联通信科技有限公司 联系方式:13662299586---张先生 公司拥有多位高频及软件专业工程师,专业开发生产微功率无线数据通信模块,产品提供标准接口、抗干扰能力强、距离远、适合恶劣环境使用。主要有:无线数传模块、无线通信模块、无线通讯 ...… 查看全部问答> |
|
WHAT??!!这个家伙的帖子到底写的神马玩意,问的什么问题?帖子我们发多了,也看多了。恶心的帖子没少看,估计也写过不少让人恶心的帖子。嘿嘿,不要不好意思...让我们来聊一聊,你都是怎么发贴的,你会选择什么样的策略和方式发帖,以获取更好 ...… 查看全部问答> |
|
板卡主控芯片MPC8270 接收1000个sip用户的同时注册、此时做大话务量呼叫,设备死机且无任何任务异常信息抛出,shell彻底死掉,不能敲任何命令,被狗咬后设备重启:重启是抛出如下信息:   ...… 查看全部问答> |




