久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1012|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩网| 在线成人 | 中文字幕日韩一区 | 日韩欧美国产一区二区 | 日韩欧美电影在线 | 影音先锋欧美资源 | 日韩视频免费看 | 99精品欧美一区二区蜜桃免费 | 天天操操| 人人干在线视频 | 亚洲免费视频一区 | 国产综合视频 | 暖暖日本在线视频 | 久久久久久国产精品免费免费狐狸 | 国产精品成人在线观看 | 欧美一区二区免费 | 精品久久久久国产 | 91久久夜色精品国产网站 | 蜜臀av日日欢夜夜爽一区 | 色综合99 | 欧美精品福利视频 | 一区二区三区四区在线 | 一区二区三区福利视频 | 国产乡下妇女做爰 | 国产精品国产三级国产aⅴ中文 | 午夜天堂精品久久久久 | 亚洲美乳中文字幕 | 欧美成人一区二区三区片免费 | 国产亚洲一区二区三区 | 四虎最新 | 在线一区二区三区 | 97精品国产97久久久久久免费 | 黄色一级网 | 麻豆精品国产91久久久久久 | 91视频网 | 国产精品区二区三区日本 | 久久成人精品视频 | 欧美一区二区三区在线播放 | av电影手机在线看 | 天天干天天干 | 成人小视频在线免费观看 |