OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

正点原子全套STM32/FPGA开发资料,上千讲STM32视频教程,RT1052教程免费下载啦...
查看: 538|回复: 3

STM8S DS3231 有点问题

[复制链接]

  离线 

1

主题

5

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2018-1-22
在线时间
6 小时
发表于 2018-1-23 12:45:04 | 显示全部楼层 |阅读模式
本帖最后由 WwbH2 于 2018-1-23 12:47 编辑

STM8SF103  SCL接PD5  SDA接PD4,目前取时分秒老是有问题,数码管乱跳,有哪位帅哥美女帮我看一下呀。。
iic.h
[C] 纯文本查看 复制代码
#ifndef _I2C_H
#define _I2C_H

#include "stm8s.h"


#define I2C_SCL_PIN GPIO_PIN_5 
#define I2C_SDA_PIN GPIO_PIN_4  

#define I2C_PORT GPIOD  

#define I2C_SCL_L GPIO_WriteLow(I2C_PORT,I2C_SCL_PIN); 
#define I2C_SCL_H GPIO_WriteHigh(I2C_PORT,I2C_SCL_PIN); 

#define I2C_SDA_L GPIO_WriteLow(I2C_PORT,I2C_SDA_PIN); 
#define I2C_SDA_H GPIO_WriteHigh(I2C_PORT,I2C_SDA_PIN); 

#define I2C_SDA_OUT GPIO_Init(I2C_PORT, I2C_SDA_PIN, GPIO_MODE_OUT_OD_HIZ_FAST);
#define I2C_SDA_IN GPIO_Init(I2C_PORT, I2C_SDA_PIN, GPIO_MODE_IN_FL_NO_IT );

void I2C_Configuration(void);

void DS3231_ModifyTime(u32 yea,u8 mon,u8 da,u8 hou,u8 min,u8 sec);
u8 DS3231_ReadSecond(void);
u8 DS3231_ReadMiniute(void);
u8 DS3231_ReadHour(void);
#endif


iic.c
[C] 纯文本查看 复制代码
#include "pbdata.h"

void I2C_Configuration(void)
{
    GPIO_Init(I2C_PORT, I2C_SCL_PIN, GPIO_MODE_OUT_OD_HIZ_FAST);
    GPIO_Init(I2C_PORT, I2C_SDA_PIN, GPIO_MODE_OUT_OD_HIZ_FAST);
}

void I2C_Start(void)
{
    I2C_SDA_OUT;
    
    I2C_SDA_H;
    I2C_SCL_H;
    delay_us(5);
    I2C_SDA_L;
    delay_us(6);
    I2C_SCL_L;
}

void I2C_Stop(void)
{
    I2C_SDA_OUT;
    
    I2C_SCL_L;
    I2C_SDA_L;    
    I2C_SCL_H;
    delay_us(6);
    I2C_SDA_H;
    delay_us(6);
}

void I2C_Ack(void)
{    
    I2C_SDA_OUT;
    
    I2C_SCL_L;
    I2C_SDA_L;
    delay_us(2);
    I2C_SCL_H;
    delay_us(5);
    I2C_SCL_L;
}

void I2C_NAck(void)
{
    I2C_SDA_OUT;
    
    I2C_SCL_L;
    I2C_SDA_H;
    delay_us(2);
    I2C_SCL_H;
    delay_us(5);
    I2C_SCL_L;    
}
// 返回1 代表 非应答信号
// 返回0 代表 有应答信号
u8 I2C_Wait_Ack(void)
{
    u8 tempTime=0;
    
    I2C_SDA_IN;
    
    delay_us(5);
    I2C_SCL_H;
    delay_us(5);

    while(GPIO_ReadInputPin(I2C_PORT,I2C_SDA_PIN))
    {
        tempTime++;
        if(tempTime>250)
        {
            I2C_Stop();
            return 1;
        }
    }
    
    I2C_SCL_L;
    
    return 0;
}

void I2C_Send_Byte(u8 txd)
{
    u8 i=0;
      
    I2C_SDA_OUT;
    I2C_SCL_L;
    
    for(i=0;i<8;i++)
    {
        if((txd&0x80)>0)
        {
            I2C_SDA_H;
        }
        else
        {
            I2C_SDA_L;
        }
        
        txd<<=1;
        I2C_SCL_H;
        delay_us(5);
        I2C_SCL_L;
        delay_us(5);        
    }
}

//ack=0 发送非应答信号 代表接收完成
//ack=1 发送应答信号 代表接收未完成 继续接收
u8 I2C_Read_Byte(u8 ack)
{
    u8 i=0, receive=0;
    
    I2C_SDA_IN;
    
    for(i=0;i<8;i++)
    {
       I2C_SCL_L; 
       delay_us(2);
       I2C_SCL_H;
       delay_us(2);
       
       receive<<=1;
       
       if(GPIO_ReadInputPin(I2C_PORT,I2C_SDA_PIN))
         receive++;
       delay_us(1);
    }
    
    if(ack==0) 
    {
        I2C_NAck();
    }
    else
    {
        I2C_Ack();
    }
      
    return receive;
}

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

        I2C_Start();

        I2C_Send_Byte(0xD0); //器件写地址
        I2C_Wait_Ack();
        
        I2C_Send_Byte(addr);
        I2C_Wait_Ack();
        
        I2C_Start();
        I2C_Send_Byte(0xD1); //器件读地址
        I2C_Wait_Ack();
        
        Dat=I2C_Read_Byte(1);
        
        I2C_Stop();
        return Dat;
} 


void DS3231_ByteWrite(u8 addr,u8 data)
{
        I2C_Start();
        
        I2C_Send_Byte(0xD0);
        I2C_Wait_Ack();        
        
        I2C_Send_Byte(addr);
        I2C_Wait_Ack();

        I2C_Send_Byte(data);
        I2C_Wait_Ack();
        
        I2C_Stop();
}        


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

        temp=HEX_TO_BCD(yea);
        DS3231_ByteWrite(0x06,temp);

        temp=HEX_TO_BCD(mon);
        DS3231_ByteWrite(0x05,temp);

        temp=HEX_TO_BCD(da);
        DS3231_ByteWrite(0x04,temp);

        temp=HEX_TO_BCD(hou);
        DS3231_ByteWrite(0x02,temp);

        temp=HEX_TO_BCD(min);
        DS3231_ByteWrite(0x01,temp);

        temp=HEX_TO_BCD(sec);
        DS3231_ByteWrite(0x00,temp);
}



u8 DS3231_ReadSecond(void)
{
  u8 p=0;  
  p=DS3231_ByteRead(0x00);
  p= BCD_TO_HEX(p);  
  return p;
  
}

u8 DS3231_ReadMiniute(void)
{
  u8 p=0;  
  p=DS3231_ByteRead(0x01);
  p= BCD_TO_HEX(p);  
  return p;
  
}

u8 DS3231_ReadHour(void)
{
  u8 p=0;  
  p=DS3231_ByteRead(0x02);
  p&=0x3f; 
  p= BCD_TO_HEX(p);  
  return p;
  
}





main.c
[C] 纯文本查看 复制代码
void main(void)
{
  u8 tSec=0;
  u8 tMin=0;
  u8 tHour=0;
  
  RCC_Config();
  GPIO_Config();
  
  
  //DS3231_ModifyTime(2018,1,22,22,52,05);  //年,月,日,时,分,秒

  
  while (1)
  {   
    tSec = DS3231_ReadSecond(); 
    tMin = DS3231_ReadMiniute();
    tHour= DS3231_ReadHour();
    TM1618_DispalyNum(tHour/10,tHour%10 ,tMin/10,tMin%10); 
    delay_ms(1000);
  }  
}

void RCC_Config(void)
{
  CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);//时钟速度为内部16M,1分频
}


void GPIO_Config(void)
{
  TM1618_Init();
  I2C_Configuration();
}


回复

使用道具 举报

  离线 

1

主题

5

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2018-1-22
在线时间
6 小时
 楼主| 发表于 2018-1-23 12:48:51 | 显示全部楼层
我又仔细看了一下,确认没有发现问题,现在头大了
回复 支持 反对

使用道具 举报

  离线 

1

主题

5

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2018-1-22
在线时间
6 小时
 楼主| 发表于 2018-1-23 21:04:00 | 显示全部楼层
有人在么?
回复 支持 反对

使用道具 举报

  离线 

1

主题

5

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2018-1-22
在线时间
6 小时
 楼主| 发表于 2018-1-24 00:18:19 | 显示全部楼层
有人么?
回复 支持 反对

使用道具 举报

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

本版积分规则




关闭

正点原子双11大促销上一条 /1 下一条

正点原子公众号

QQ|联系我们|手机版|官方淘宝店|微信公众平台|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2018-11-17 13:04

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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