OpenEdv-开源电子网

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

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
[mw_shl_code=c,true]#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
[/mw_shl_code]

iic.c
[mw_shl_code=c,true]#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;
  
}
[/mw_shl_code]




main.c
[mw_shl_code=c,true]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();
}[/mw_shl_code]

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

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 | 显示全部楼层
有人么?
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2019-9-26
在线时间
11 小时
发表于 2019-10-16 16:42:47 | 显示全部楼层
看了 一下,看不出来,这个要试试才知道。不知道楼主的问题解决了吗?
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-22 12:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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