找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1000|回复: 4
打印 上一主题 下一主题
收起左侧

MCU+RX8010SJ显示时间不对,求解答如何找错误

[复制链接]
跳转到指定楼层
楼主
#include "bsp_rx8010sj.h"
#include "stdio.h"

#define RX8010_Write_Address                                0x64
#define RX8010_Read_Address                                        0x65

Calendar_OBJ calendar;    //日历结构体

u16 BCD2HEX(u8 val)                //BCD转10进制
{
        return (val-(val>>4)*6);
}

u16 B_BCD(u8 val)                        //十进制转BCD
{
        return (val+(val/10)*6);
}


void RX8010_Init(void)
{
        uint8_t temp;
        IIC_Init();
        delay_ms(40);
        
        Write_Data(0x1F,0);                //使用时钟模块前要把TEST位清0 并且一直为0
        Read_Data(0x1E,temp);//读0x1E的电压
        if(temp&0x02)                //低电压检测
        {
                printf("vlf=1");
                Write_Data(0x1E,0);
                delay_us(10);
                if((temp&0x02)==0)
                {
                        printf("ture");
                }
                else
                {
                        printf("false");
                }
        }
        else
        {
                printf("vlf=0");
        }
        Write_Data(0x17,0xD8);
        Write_Data(0x30,0x00);
        Write_Data(0x31,0x08);
        
    Write_Data(0x1E,0);
    Write_Data(0x1F,0x40);
        Set_RX8010SJ_Time(0x22,0x10,0x22,0x30,0x31,0x00,0x03);
        Write_Data(0x1F,0);

}

void Set_RX8010SJ_Time(u8 yea,u8 mon,u8 da,u8 hou,u8 min,u8 sec,u8 week)
{
    u8 temp=0;
    temp=B_BCD(yea);
    Write_Data(0x16,temp);

    temp=B_BCD(mon);
    Write_Data(0x15,temp);

    temp=B_BCD(da);
    Write_Data(0x14,temp);

    temp=hou;
    Write_Data(0x12,temp);

    temp=B_BCD(min);
    Write_Data(0x11,temp);

    temp=B_BCD(sec);
    Write_Data(0x10,temp);

    temp=B_BCD(week);
    Write_Data(0x13,temp);

}

void Get_RX8010SJ_Time(void)
{
        uint8_t temp;
    Read_Data(0x16,temp);  
        calendar.w_year = temp;
    calendar.w_year=BCD2HEX(calendar.w_year);

    Read_Data(0x15,temp);
        calendar.w_month=temp;
    calendar.w_month=BCD2HEX(calendar.w_month);

    Read_Data(0x14,temp);  
        calendar.w_date=temp;
    calendar.w_date=BCD2HEX(calendar.w_date);

    Read_Data(0x12,temp);
        calendar.hour=temp;
    calendar.hour&=0x3f;                  
    calendar.hour=BCD2HEX(calendar.hour);

    Read_Data(0x11,temp);
        calendar.min=temp;
    calendar.min=BCD2HEX(calendar.min);

    Read_Data(0x10,temp);
        calendar.sec=temp;
    calendar.sec=BCD2HEX(calendar.sec);

    Read_Data(0x13,temp);
        calendar.week=temp;
    calendar.week=BCD2HEX(calendar.week);

//   I2C2_ByteWrite(0x0e,0x20);
//   calendar.temper_H=I2C2_ByteRead(0x11);
//   calendar.temper_L=(I2C2_ByteRead(0x12)>>6)*25;
}
下面是I2C的驱动程序
#include "i2c.h"


#define RX8010_Write_Address                                0x64
#define RX8010_Read_Address                                        0x65



static void I2C_Delay(void)
{
//        uint8_t i;

        /* 
                可用逻辑分析仪测量I2C通讯时的频率
    工作条件:CPU主频168MHz ,MDK编译环境,1级优化

                经测试,循环次数为20~250时都能通讯正常

        */
        delay_us(2);
//        for (i = 0; i < 40; i++);
}
//初始化IIC
void IIC_Init(void)
{                                             
        GPIO_InitTypeDef GPIO_initStructure;

        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);

        GPIO_initStructure.GPIO_Mode = GPIO_Mode_OUT;
        GPIO_initStructure.GPIO_OType = GPIO_OType_OD;
        GPIO_initStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;
        GPIO_initStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
        GPIO_initStructure.GPIO_Speed = GPIO_Speed_100MHz;
        GPIO_Init(GPIOH,&GPIO_initStructure);
/* 给一个停止信号, 复位I2C总线上的所有设备到待机模式 */
        IIC_Stop();    //总线空闲

}
//产生IIC起始信号
void IIC_Start(void)
{
        /* 当SCL高电平时,SDA出现一个下跳沿表示I2C总线启动信号 */
        I2C_SDA_HIGH();
        I2C_SCL_HIGH();
        I2C_Delay();
        I2C_SDA_LOW();
        I2C_Delay();
        I2C_SCL_LOW();
        I2C_Delay();        //钳住I2C总线,准备发送或接收数据
}         
//产生IIC停止信号
void IIC_Stop(void)
{
        I2C_SCL_LOW();
        
        I2C_SDA_LOW();
        I2C_Delay();
        I2C_SCL_HIGH();//STOP:when CLK is high DATA change form low to high
         I2C_Delay();
        I2C_SDA_HIGH();                                                                    
}
//等待应答信号到来
//返回值:1,接收应答失败
//        0,接收应答成功
uint8_t IIC_Wait_Ack(void)
{
        uint8_t re;
        
        I2C_SDA_HIGH();      //SDA设置为输入  
        I2C_Delay();
        I2C_SCL_HIGH();
        I2C_Delay();           
        if(I2C_SDA_READ())
        {
                re = 1;
        }
        else
        {
                re = 0;
        }
        I2C_SCL_LOW();
        I2C_Delay();
        return re;
}
//产生一个ACK信号
void IIC_Ack(void)
{
        I2C_SDA_LOW();
        I2C_Delay();
        I2C_SCL_HIGH();
        I2C_Delay();
        I2C_SCL_LOW();
        I2C_Delay();
        I2C_SDA_HIGH();                //CPU释放SDA总线
}
//产生一个NACK信号                    
void IIC_NAck(void)
{
        I2C_SDA_HIGH();        
        I2C_Delay();
        I2C_SCL_HIGH();
        I2C_Delay();
        I2C_SCL_LOW();
        I2C_Delay();;
}                                                                              
//IIC发送一个字节
//返回从机有无应答
//1,有应答
//0,无应答                          
uint8_t IIC_Send_Byte(uint8_t _ucByte)
{                        
    int8_t i;

        /* 先发送字节的高位bit7 */
        for (i = 0; i < 8; i++)
        {               
                I2C_SCL_LOW();
                I2C_Delay();
                if (_ucByte & 0x80)
                {
                        I2C_SDA_HIGH();
                }
                else
                {
                        I2C_SDA_LOW();
                }
                I2C_Delay();
                I2C_SCL_HIGH();
                _ucByte<<=1;
        }
        I2C_SCL_LOW();
        I2C_Delay();        
        I2C_SCL_HIGH();
        i=0;
        while(I2C_SDA_READ())
        {
                if(++i>12)
                {
                        I2C_SCL_LOW();
                        return 0;
                }
        }
        I2C_SCL_LOW();
        return 1;         
}            
//读1个字节,ack=1时,发送ACK,ack=0,发送nACK   
uint8_t IIC_Read_Byte(void)
{
        uint8_t i;
        uint8_t value;
   /* 读到第1个bit为数据的bit7 */
        value = 0;
        I2C_SCL_LOW();
        I2C_SDA_HIGH();
        for (i = 0; i < 8; i++)
        {
                I2C_SCL_HIGH();
                I2C_Delay();
                value <<= 1;
                if (I2C_SDA_READ())
                {
                        value|=1;
                }
                I2C_Delay();
                I2C_SCL_HIGH();
                I2C_Delay();
               
               
                I2C_SCL_LOW();
                I2C_Delay();
        }
        I2C_Delay();
        I2C_SCL_LOW();
        I2C_SDA_LOW();
        return value;
}
/*
*********************************************************************************************************
*        函 数 名: i2c_CheckDevice
*        功能说明: 检测I2C总线设备,CPU向发送设备地址,然后读取设备应答来判断该设备是否存在
*        形    参:_Address:设备的I2C总线地址
*        返 回 值: 返回值 0 表示正确, 返回1表示未探测到
*********************************************************************************************************
*/
uint8_t i2c_CheckDevice(uint8_t _Address)
{
        uint8_t ucAck;

        IIC_Init();                /* 配置GPIO */

        
        IIC_Start();                /* 发送启动信号 */

        /* 发送设备地址+读写控制bit(0 = w, 1 = r) bit7 先传 */
        IIC_Send_Byte(_Address | RX8010_Write_Address);
        ucAck = IIC_Wait_Ack();        /* 检测设备的ACK应答 */

        IIC_Stop();                        /* 发送停止信号 */

        return ucAck;
}

/*
向一个地址发送内容函数
*/
uint8_t Write_Data(u8 addr, u8 buf)
{
        IIC_Start();
        IIC_Send_Byte(0x64); //写操作指令
        if(IIC_Wait_Ack())   //检测ACK信号
        {
                IIC_Stop();         //发送IIC停止信号
                return 1;        
        }
        IIC_Send_Byte(addr); //写寄存器存储地址
        if(IIC_Wait_Ack())
        {
                IIC_Stop();
                return 1;        
        }        
        IIC_Send_Byte(buf);
        if(IIC_Wait_Ack())
        {
                IIC_Stop();
                return 1;
        }
        
        IIC_Stop();
        return 0;
}

/*
        读一个单元的内容,返回值: 1=操作失败,0=操作成功
*/
uint8_t Read_Data(u8 addr,u8 buf)
{
        IIC_Start();
        IIC_Send_Byte(0x64);  //写操作指令
        if(IIC_Wait_Ack())
        {
                IIC_Stop();
                return 1;        
        }        
        IIC_Send_Byte(addr);  //发送寄存器地址
        if(IIC_Wait_Ack())
        {
                IIC_Stop();
                return 1;        
        }               
        IIC_Start();          //Sr条件,RESTART
        IIC_Send_Byte(0x65);  //读操作指令
        if(IIC_Wait_Ack())
        {
                IIC_Stop();
                return 1;        
        }        
                buf = IIC_Read_Byte();  //读取数据并发送ACK信号
                if(IIC_Wait_Ack())
                {
                        IIC_Stop();
                        return 1;
                }
        
        
        IIC_Stop();
        return 0;

}
通过串口调试助手打印显示出的时间在图片上,现在不知道是程序哪的问题改不对时间,希望大哥们解答一下

51hei截图_20221023163424.png (25.31 KB, 下载次数: 16)

51hei截图_20221023163424.png
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:624769 发表于 2022-10-23 19:09 | 只看该作者


也许我学艺不精, 这种新发明创造出来的,
那么个性的 传参方法,我还真不敢随意评论。
回复

使用道具 举报

板凳
ID:1036723 发表于 2022-10-23 19:19 来自触屏版 | 只看该作者
188610329 发表于 2022-10-23 19:09
也许我学艺不精, 这种新发明创造出来的,
那么个性的 传参方法,我还真不敢随意评论。

这个是我学艺不精,刚开始接手项目
回复

使用道具 举报

地板
ID:1036723 发表于 2022-10-23 19:20 来自触屏版 | 只看该作者
188610329 发表于 2022-10-23 19:09
也许我学艺不精, 这种新发明创造出来的,
那么个性的 传参方法,我还真不敢随意评论。

老哥,你有什么见解
回复

使用道具 举报

5#
ID:1036723 发表于 2022-10-24 10:35 | 只看该作者
目前找出来是模拟的GPIO引脚没办法拉低SDA和SCL引脚,上电后一直是3.3v
回复

使用道具 举报

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

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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