OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7529|回复: 4

F103ZET6驱动DS3231,打印出来全是165

[复制链接]

2

主题

10

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2020-10-30
在线时间
31 小时
发表于 2021-1-15 21:05:29 | 显示全部楼层 |阅读模式
17金钱
#ifndef _MYIIC_H_
#define _MYIIC_H_
#include "sys.h"

//IO????

#define SDA2_IN()  {GPIOC->CRL&=0X0FFFFFFF;GPIOC->CRL|=(u32)8<<28;}        //PB7????
#define SDA2_OUT() {GPIOC->CRL&=0X0FFFFFFF;GPIOC->CRL|=(u32)3<<28;}         //PB7????
//IO??


#define IIC2_SCL   PCout(5) //SCL
#define IIC2_SDA   PCout(4) //SDA
#define READ_SDA2  PCin(4)  //??SDA


//IIC2??????
void IIC2_Init(void);                //???IIC?IO?                                 
void IIC2_Start(void);                                //??IIC????
void IIC2_Stop(void);                                  //??IIC????
void IIC2_Send_Byte(u8 txd);                        //IIC??????
u8 IIC2_Read_Byte(unsigned char ack);//IIC??????
u8 IIC2_Wait_Ack(void);                                 //IIC??ACK??
void IIC2_Ack(void);                                        //IIC??ACK??
void IIC2_NAck(void);                                //IIC???ACK??

void IIC2_Write_One_Byte(u8 daddr,u8 addr,u8 data);
u8 IIC2_Read_One_Byte(u8 daddr,u8 addr);       
#endif

#include "myiic.h"
#include "delay.h"

//IIC???
void IIC2_Init(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        RCC_APB2PeriphClockCmd(        RCC_APB2Periph_GPIOC, ENABLE );       
          
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;   //????
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOC, &GPIO_InitStructure);
        GPIO_SetBits(GPIOC,GPIO_Pin_4|GPIO_Pin_5);         //PB10,PB11 ???
}

//??IIC????
void IIC2_Start(void)
{
        SDA2_OUT();     //sda???
        IIC2_SDA=1;                    
        IIC2_SCL=1;
        delay_us(4);
        IIC2_SDA=0;//START:when CLK is high,DATA change form high to low
        delay_us(4);
        IIC2_SCL=0;//??I2C??,?????????
}          
//??IIC????
void IIC2_Stop(void)
{
        SDA2_OUT();//sda???
        IIC2_SCL=0;
        IIC2_SDA=0;//STOP:when CLK is high DATA change form low to high
        delay_us(4);
        IIC2_SCL=1;
        IIC2_SDA=1;//??I2C??????
        delay_us(4);                                                                  
}
//????????
//???:1,??????
//        0,??????
u8 IIC2_Wait_Ack(void)
{
        u8 ucErrTime=0;
        SDA2_IN();      //SDA?????  
        IIC2_SDA=1;delay_us(1);          
        IIC2_SCL=1;delay_us(1);         
        while(READ_SDA2)
        {
                ucErrTime++;
                if(ucErrTime>250)
                {
                        IIC2_Stop();
                        return 1;
                }
        }
        IIC2_SCL=0;//????0           
        return 0;  
}
//??ACK??
void IIC2_Ack(void)
{
        IIC2_SCL=0;
        SDA2_OUT();
        IIC2_SDA=0;
        delay_us(2);
        IIC2_SCL=1;
        delay_us(2);
        IIC2_SCL=0;
}
//???ACK??                    
void IIC2_NAck(void)
{
        IIC2_SCL=0;
        SDA2_OUT();
        IIC2_SDA=1;
        delay_us(2);
        IIC2_SCL=1;
        delay_us(2);
        IIC2_SCL=0;
}                                                                              
//IIC??????
//????????
//1,???
//0,???                          
void IIC2_Send_Byte(u8 txd)
{                        
    u8 t;   
                SDA2_OUT();             
    IIC2_SCL=0;//??????????
    for(t=0;t<8;t++)
    {              
                        IIC2_SDA=(txd&0x80)>>7;
                        txd<<=1;           
                        delay_us(2);   //?TEA5767??????????
                        IIC2_SCL=1;
                        delay_us(2);
                        IIC2_SCL=0;       
                        delay_us(2);
    }         
}             
//?1???,ack=1?,??ACK,ack=0,??nACK   
u8 IIC2_Read_Byte(unsigned char ack)
{
        unsigned char i,receive=0;
        SDA2_IN();//SDA?????
    for(i=0;i<8;i++ )
        {
                        IIC2_SCL=0;
                        delay_us(2);
                        IIC2_SCL=1;
                        receive<<=1;
                        if(READ_SDA2)receive++;   
                        delay_us(1);
   }                                         
    if (!ack)
        IIC2_NAck();//??nACK
    else
        IIC2_Ack(); //??ACK   
    return receive;
}
//////////////////////////////////////////DS3231

#include "sys.h"
#ifndef __DS3231_H__
#define __DS3231_H__


typedef struct
{
        u8 hour;
        u8 min;
        u8 sec;                       
        u32 w_year;
        u8  w_month;
        u8  w_date;
        u8  week;                 
}_calendar_obj;                                         

extern _calendar_obj calendar;        //è&#213;àú&#189;á11ì&#229;

extern u8 const mon_table[12];        //&#212;&#194;·Yè&#213;&#198;úêy&#190;Y±í

void DS3231_Init(void);
void get_show_time(void);      
//u8 RTC_Get_Week(u16 year,u8 month,u8 day);
void DS3231_Set(u8 syear,u8 smon,u8 sday,u8 hour,u8 min,u8 sec);//éè&#214;&#195;ê±&#188;&#228;       

#endif



#include "DS3231.h"
#include "myiic.h"
#include "delay.h"   
#include "sys.h"  

_calendar_obj calendar;

#define DS3231_WriteAddress 0xD0   
#define DS3231_ReadAddress  0xD1

u8 BCD2HEX(u8 val)
{
    u8 i;
    i= val&0x0f;
    val >>= 4;
    val &= 0x0f;
    val *= 10;
    i += val;

    return i;
}

u16 B_BCD(u8 val)
{
  u8 i,j,k;
  i=val/10;
  j=val%10;
  k=j+(i<<4);
  return k;
}


void I2cByteWrite(u8 addr,u8 bytedata)
{
  IIC2_Start();
  delay_us(5);
  IIC2_Send_Byte(DS3231_WriteAddress);
  IIC2_Wait_Ack();
  delay_us(5);
  IIC2_Send_Byte(addr);
  IIC2_Wait_Ack();
  delay_us(5);
  IIC2_Send_Byte(bytedata);
  IIC2_Wait_Ack();
  delay_us(5);
  IIC2_Stop();
}       


u8 I2cByteRead(u8 addr)
{
  u8 Dat=0;

  IIC2_Start();
  IIC2_Send_Byte(DS3231_WriteAddress);
  IIC2_Wait_Ack();
  delay_us(5);
  IIC2_Send_Byte(addr);
  IIC2_Wait_Ack();
  delay_us(5);
  IIC2_Start();
  IIC2_Send_Byte(DS3231_ReadAddress);
  IIC2_Wait_Ack();
  delay_us(5);
  Dat=IIC2_Read_Byte(1);
  IIC2_Stop();
  return Dat;
}



void DS3231_Init(void)
{
        IIC2_Init();
//        I2cByteWrite(0x0e,0);
//        delay_ms(2);
//  I2cByteWrite(0x0f,0x0);
//        delay_ms(2);
}

void DS3231_Get(void)
{
  calendar.w_year=I2cByteRead(0x06);  
  calendar.w_month=I2cByteRead(0x05);  
  calendar.w_date=I2cByteRead(0x04);
  calendar.hour=I2cByteRead(0x02);  
  calendar.min=I2cByteRead(0x01);
  calendar.sec=I2cByteRead(0x00);
}

void DS3231_Set(u8 yea,u8 mon,u8 da,u8 hou,u8 min,u8 sec)
{
  u8 temp=0;

  temp=B_BCD(yea);
  I2cByteWrite(0x06,temp);

  temp=B_BCD(mon);
  I2cByteWrite(0x05,temp);

  temp=B_BCD(da);
  I2cByteWrite(0x04,temp);

  temp=B_BCD(hou);
  I2cByteWrite(0x02,temp);

  temp=B_BCD(min);
  I2cByteWrite(0x01,temp);

  temp=B_BCD(sec);
  I2cByteWrite(0x00,temp);
}


void get_show_time(void)
{


calendar.w_year=I2cByteRead(0x06);  
calendar.w_year=BCD2HEX(calendar.w_year);


calendar.w_month=I2cByteRead(0x05);
calendar.w_month=BCD2HEX(calendar.w_month);


calendar.w_date=I2cByteRead(0x04);  
calendar.w_date=BCD2HEX(calendar.w_date);


calendar.hour=I2cByteRead(0x02);
calendar.hour&=0x3f;                  
calendar.hour=BCD2HEX(calendar.hour);


calendar.min=I2cByteRead(0x01);
calendar.min=BCD2HEX(calendar.min);


calendar.sec=I2cByteRead(0x00);
calendar.sec=BCD2HEX(calendar.sec);
}
////////////////////////////////////////////////main

#include "stm32f10x.h"
#include "delay.h"
#include "usart.h"
#include "DS3231.h"

int main(void)
{
        delay_init();
        DS3231_Init();
       
        NVIC_Configuration();          //éè&#214;&#195;NVIC&#214;D&#182;&#207;·&#214;×é2:2&#206;&#187;&#199;à&#213;&#188;ó&#197;&#207;è&#188;&#182;£&#172;2&#206;&#187;&#207;ìó|ó&#197;&#207;è&#188;&#182;
        uart_init(115200);         //′&#174;&#191;ú3&#245;ê&#188;&#187;ˉ&#206;a9600
       
        DS3231_Set(20,1,9,11,05,00);
        while(1)
        {
                        get_show_time();
                        printf("&#196;ê&#212;&#194;è&#213;:");
                        printf("%ld,%d,%d\r\n",calendar.w_year+2000,calendar.w_month,calendar.w_date);
                        printf("ê±·&#214;&#195;&#235;:");
                        printf("%d,%d,%d\r\n",calendar.hour,calendar.min,calendar.sec);
                        delay_ms(5000);
        }
}

打印出来的结果是

[21:00:08.246]收←◆年月日:2165,165,165
时分秒:45,165,165

[21:00:09.526]收←◆年月日:2165,165,165
时分秒:45,165,165

[21:00:10.805]收←◆年月日:2165,165,165
时分秒:45,165,165

[21:00:12.084]收←◆年月日:2165,165,165
时分秒:45,165,165

[21:00:13.363]收←◆年月日:2165,165,165
时分秒:45,165,165

[21:00:14.642]收←◆年月日:2165,165,165
时分秒:45,165,165


哪位大神给看看为什么啊




MyCode.zip

2.91 KB, 下载次数: 7

代码

最佳答案

查看完整内容[请看2#楼]

时序的问题?示波器对一下时序
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

11

主题

2149

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4926
金钱
4926
注册时间
2015-1-10
在线时间
618 小时
发表于 2021-1-15 21:05:30 | 显示全部楼层
Special 发表于 2021-6-9 09:53
我跟你一样,也是165,找不到啥原因

时序的问题?示波器对一下时序
回复

使用道具 举报

0

主题

13

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
338
金钱
338
注册时间
2018-5-27
在线时间
104 小时
发表于 2021-6-9 09:53:40 | 显示全部楼层
我跟你一样,也是165,找不到啥原因
回复

使用道具 举报

0

主题

13

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
338
金钱
338
注册时间
2018-5-27
在线时间
104 小时
发表于 2021-6-9 11:07:37 | 显示全部楼层
你用下原子哥的IIC实验,就可以成功了。然后自己再修改下
回复

使用道具 举报

2

主题

10

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2020-10-30
在线时间
31 小时
 楼主| 发表于 2021-11-22 22:34:20 | 显示全部楼层
谢谢大家我自己解决了,是时序没设置对
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-12 22:41

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表