找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2202|回復(fù): 4
打印 上一主題 下一主題
收起左側(cè)

關(guān)于M41T81實(shí)時(shí)時(shí)鐘芯片代碼調(diào)試問題,沒有返回值

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:83626 發(fā)表于 2021-9-22 10:25 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
各位大神,誰有調(diào)試成功的M41T81程序 ,我的怎么讀不出來值呢?沒有返回值,M41T81初始化程序死機(jī)

程序如下:(其它程序略)
/////////////////////////////////////M41T81初始化程序//////////////////////////////////////////////////////
        //----------  RTC M41T81S-------------
                Rtc_Write_Nbyte(0xD0, 0x00, time_wr_buf,8 );        // 寫入時(shí)間日期
                Rtc_Write_1byte(0xD0, 0x01, 0x00);                        //
                Rtc_Write_1byte(0xD0, 0x0c, 0x00);                        // 清除HT位,當(dāng)?shù)綦姲l(fā)生時(shí),允許更新當(dāng)前時(shí)鐘
        //-------------------//讀取M41T81時(shí)間-----------
                Rtc_Read_Nbyte(0xD1,0x00);                   //讀取M41T81時(shí)間
/////////////////////////////////////////////////////////////////////////////////////////



/*-----------------------------------

    MCU:STC12LE5A60S2 @22.1184M晶振【原程序】【改成STC12C5608AD,11.0592晶振,延時(shí)也縮小一半,其它未變動(dòng)】
    RTC:M41T81S
    外部中斷0(P3.2)啟動(dòng)按鍵腳
----------------------------------------*/
/*
#include "STC12C5410AD.H "                //
#include "INTRINS.H "        
//#include "stc12c5a60s2.h"
#include<intrins.h>
*/

#ifndef _M41T81RTC_H
#define _M41T81RTC_H

sbit  RTC_SDA = P1^7;        //時(shí)鐘芯片 SDA控制
sbit  RTC_SCL = P1^6;        //時(shí)鐘芯片 SCL控制


        /*=====年月日周時(shí)分秒 0.1秒=====
        time_wr_buf[7]=year,time_wr_buf[6]=month,time_wr_buf[5]=day,time_wr_buf[4]=week,
        time_wr_buf[3]=hour,time_wr_buf[2]=minute,time_wr_buf[1]=second,time_wr_buf[0]=tenth
        */


unsigned char time_wr_buf[8]        =        {        20,00,10,20,2,21,9,21        };                                                         // 時(shí)鐘初始值2021年9月21日,星期二,20點(diǎn)10分00秒20分秒
unsigned char time_rd_buf[8]        =        {        0x00,0x00,0x00,0x00,0x00,0x00,0X00,0x00};        //
unsigned char F_Flag=0;        //數(shù)據(jù)應(yīng)答標(biāo)志

// #define  BUF_LENTH  128                //定義串口接收緩沖長(zhǎng)度
// unsigned char  uart0_wr;                           //寫指針
// unsigned char  uart0_rd;                           //讀指針
// unsigned char  xdata         RX0_Buffer[BUF_LENTH];        //接收緩沖
// bit  B_TI;

/*=====函數(shù)定義=====*/
//void Uart0_init(void);                                   //串口初始化
void DelayNus(unsigned int delay1us);         //us級(jí)延時(shí)
void Delay1ms(unsigned int mDelay1);          //ms級(jí)延時(shí)
//void SendByte(unsigned char dat);     //串口發(fā)送單個(gè)數(shù)據(jù)


//====時(shí)鐘芯片相關(guān)操作函數(shù)=============
void Start(void);
void Stop(void);
void Ack(void);
void Nack(void);
void Check_Ack(void);
void Write_Bit0(void);
void Write_Bit1(void);
void Write_Byte(unsigned char Data);

unsigned char Read_Byte(void);
unsigned int  HEX2BCD(unsigned int hex_data);
unsigned char BCD2HEX(unsigned char bcd_data);

void Rtc_Read_Nbyte(unsigned char Slave,unsigned char Address);
                        //void Rtc_Read_Nbyte(unsigned char Slave,unsigned char Address,unsigned char *Array,unsigned char n);
void Rtc_Write_1byte(unsigned char Slave,unsigned char Address,unsigned char Data);
void Rtc_Write_Nbyte(unsigned char Slave,unsigned char Address,unsigned char *Array,unsigned char Number);


//============================================================================
//================== 延時(shí)函數(shù) us級(jí)別延時(shí)函數(shù),不準(zhǔn)==============================
/*
                        22.1184MHz晶振下實(shí)測(cè):
DelayNus(1)時(shí):2.4us        DelayNus(2)時(shí):3.2us        DelayNus(3)時(shí):3.8us        DelayNus(4)時(shí):4.5us
DelayNus(5)時(shí):5.3us        DelayNus(6)時(shí):6.0us        DelayNus(7)時(shí):6.7us        DelayNus(8)時(shí):7.4us        */
//----------------------------
void DelayNus(unsigned int delay1us)
{
        while(delay1us--);
}

//============================================================================
//============================================================================

void Delay1ms(unsigned int mDelay1)        //1ms延時(shí),22.1184M晶振
{
        unsigned int mDelay2;
        for(;mDelay1>0;mDelay1--)
        {      
           for(mDelay2=0;mDelay2<2000;mDelay2++)   {;;}
        }
}


//============================================================================
//============================================================================

/************************************************************
*   函數(shù)名稱:void Start(void)
*   功    能:IIC總線開始信號(hào)
*   入口參數(shù):無
*   出口參數(shù):無
************************************************************/
void Start(void)      
{
        RTC_SDA=1;                 /*發(fā)送起始條件的數(shù)據(jù)信號(hào)*/
                                        DelayNus(1);
        RTC_SCL=1;
                                        DelayNus(5);                 /*起始條件建立時(shí)間大于4.7us,延時(shí)*/
        RTC_SDA=0;                 /*發(fā)送起始信號(hào)*/
                                        DelayNus(5);                 /* 起始條件鎖定時(shí)間大于4μs*/
        RTC_SCL=0;                 /*鉗住I2C總線,準(zhǔn)備發(fā)送或接收數(shù)據(jù) */
                                        DelayNus(1);
}


//=====================================================================================
/************************************************************
*   函數(shù)名稱:void Stop(void)  
*   功    能:IIC總線停止信號(hào)
*   入口參數(shù):無
*   出口參數(shù):無
************************************************************/
void Stop(void)
{
        RTC_SDA=0;        /*發(fā)送結(jié)束條件的數(shù)據(jù)信號(hào)*/
                                        DelayNus(1);
        RTC_SCL=1;
                                        DelayNus(5);
        RTC_SDA=1;                         /*發(fā)送I2C總線結(jié)束信號(hào)*/
                                        DelayNus(1);
}

//=======================================================================================
/************************************************************
*   函數(shù)名稱:void Ack(void)  
*   功    能:主器件為接收方,從器件為發(fā)送方時(shí),從器件等待主器件的應(yīng)答信號(hào)(單片機(jī)發(fā)送應(yīng)答信號(hào))
*   入口參數(shù):無
*   出口參數(shù):無
************************************************************/
void Ack(void)
{
        RTC_SDA=0;          //數(shù)據(jù)線保持低,時(shí)鐘線發(fā)生一次從高低的跳變,發(fā)送一個(gè)應(yīng)答信號(hào)
                                        DelayNus(3);
        RTC_SCL=1;
                                        DelayNus(5);                  //>4us
        RTC_SCL=0;
                                        DelayNus(3);
}

//============================================================================================
/************************************************************
*   函數(shù)名稱:void Nack(void)  
*   功    能:主器件為接收方,從器件為發(fā)送方時(shí),非應(yīng)答信號(hào)(單片機(jī)發(fā)送非應(yīng)答信號(hào))
*   入口參數(shù):無
*   出口參數(shù):無
************************************************************/
void Nack(void)
{
        RTC_SDA=1;        //數(shù)據(jù)線保持低,時(shí)鐘線發(fā)生一次從高低的跳變,沒有應(yīng)答
                                        DelayNus(3);
        RTC_SCL=1;         
                                        DelayNus(5);  //>4us
        RTC_SCL=0;
                                        DelayNus(2);
}


//==========================================================================================
/************************************************************
*   函數(shù)名稱:void Check_Ack(void)  
*   功    能:IIC器件應(yīng)答信號(hào)檢查
*   入口參數(shù):無
*   出口參數(shù):無 111111
************************************************************/
void Check_Ack(void)                        
{
        F_Flag=0;
        RTC_SDA=0;   
        RTC_SCL=1;
                                        DelayNus(3);
        if(RTC_SDA==0)
        {
            RTC_SCL=0;
                                                        DelayNus(3);
        }
        else
        {
                 F_Flag=1;
            RTC_SCL=0;
                                                        DelayNus(3);
        }
        RTC_SDA=1;
}


//============================================================================================
/************************************************************
*   函數(shù)名稱:void Write_Bit0(void)  
*   功    能:向IIC總線寫0
*   入口參數(shù):無
*   出口參數(shù):無
************************************************************/
void Write_Bit0(void)                       
{
        RTC_SDA=0;
                                        DelayNus(1);
        RTC_SCL=1;
                                        DelayNus(5);
        RTC_SCL=0;
                                        DelayNus(2);
}


//============================================================================================
/************************************************************
*   函數(shù)名稱:void Write_Bit1(void)  
*   功    能:向IIC總線寫1
*   入口參數(shù):無
*   出口參數(shù):無
************************************************************/
void Write_Bit1(void)                     
{
        RTC_SDA=1;
                                        DelayNus(1);
        RTC_SCL=1;
                                        DelayNus(5);
        RTC_SCL=0;
                                        DelayNus(2);
}


//==============================================================================================
/************************************************************
*   函數(shù)名稱:void Write_Byte(unsigned char Data)  
*   功    能:IIC寫一個(gè)字節(jié)子程序
*   入口參數(shù):uchar Data
*   出口參數(shù):無
************************************************************/
void Write_Byte(unsigned char Data)            
{
        unsigned char i;
        for(i=0;i<8;i++)
        {
                                        if((Data&0x80)>0) Write_Bit1();           
                                        else  Write_Bit0();         
          Data=Data<<1;                        
        }
}


//==============================================================================================
/************************************************************
*   函數(shù)名稱:uchar Read_Byte(void)  
*   功    能:從IIC總線讀一字節(jié)數(shù)據(jù)
*   入口參數(shù):無
*   出口參數(shù):無 111111
************************************************************/
unsigned char Read_Byte(void)  
{                     
    unsigned char nn=0xff;              
    unsigned char j;

                RTC_SDA = 1;                 /*置數(shù)據(jù)線為輸入方式*/

                for(j=0;j<8;j++)
     {
            RTC_SCL = 0;
                                                        DelayNus(10);  

                                                if(RTC_SDA==0)
              {
                nn<<=1;
                nn=(nn&0xfe);                  
                RTC_SCL=0;
                                                                        DelayNus(5);
                }
            else  
              {
                nn<<=1;
                nn=(nn|0x01);                  
                RTC_SCL=0;
                 DelayNus(5);
              }
     }

                 RTC_SCL=0;
      DelayNus(1);

                 return(nn);               
}


//===============================================================================================
/************************************************************
*   函數(shù)名稱:uint HEX2BCD(unsigned int hex_data)  
*   功    能:HEX轉(zhuǎn)為BCD子程序
*   入口參數(shù):uint hex_data
*   出口參數(shù):bcd_data
************************************************************/
unsigned int HEX2BCD(unsigned int hex_data)     
{            
        unsigned int bcd_data,temp;

        temp = hex_data%100;
        bcd_data = ((unsigned int)hex_data)/100<<8;
        bcd_data = bcd_data|temp/10<<4;
        bcd_data = bcd_data|temp%10;   

        return(bcd_data);

}

//=================================================================================================
/************************************************************
*   函數(shù)名稱:uchar BCD2HEX(unsigned char bcd_data)
*   功    能:BCD轉(zhuǎn)為HEX子程序
*   入口參數(shù):uchar bcd_data
*   出口參數(shù):uchar hex_data
************************************************************/
unsigned char BCD2HEX(unsigned char bcd_data)      
{
        unsigned char hex_data;

        hex_data = ((bcd_data>>4)*10+(bcd_data & 0x0f));

        return(hex_data);

}


//=================================================================================================
/************************************************************
*   函數(shù)名稱:void Rtc_Read_Nbyte(unsigned char Slave,unsigned char Address,unsigned char *Array,unsigned char n)
*   功    能:RTC讀N個(gè)字節(jié)子程序
*   入口參數(shù):Slave(IIC器件地址),Address(起始地址),Array(讀數(shù)據(jù)存放的數(shù)組),Number(讀取的字節(jié)數(shù))
*   出口參數(shù):無
************************************************************/
void Rtc_Read_Nbyte(unsigned char Slave,unsigned char Address)                //unsigned char *Array,unsigned char n
{
        unsigned char data0=0, i=0;
        
        do{        Start();        Write_Byte(Slave);        Check_Ack(); }                while(F_Flag==1);
        do{                                                Write_Byte(Address);Check_Ack(); }                while(F_Flag==1);
        do{        Start();        Write_Byte(Slave+1);Check_Ack(); }                while(F_Flag==1);

        
        time_rd_buf[0] =         Read_Byte();        Ack();                                //讀RTC 0.1秒
        time_rd_buf[1] =         Read_Byte();        Ack();                                //讀RTC 秒
        time_rd_buf[2] =         Read_Byte();        Ack();                                //讀RTC 分
        time_rd_buf[3] =         Read_Byte();        Ack();                                //讀RTC 時(shí)
        time_rd_buf[4] =         Read_Byte();        Ack();                                //讀RTC 星期
        time_rd_buf[5] =         Read_Byte();        Ack();                                //讀RTC 日
        time_rd_buf[6] =         Read_Byte();        Ack();                                //讀RTC 月
        time_rd_buf[7] =         Read_Byte();        Ack();                                //讀RTC 年
        
        
        
/*
        for(i=0;i<n;i++)
        {
                data0 = Read_Byte();                //從IIC總線讀一字節(jié)數(shù)據(jù)
                Ack();                                                                        //應(yīng)答信號(hào)
                        Array = BCD2HEX(data0);
                        time_rd_buf[n] = Array;

        }
*/

        
        Nack();                                                                          // 非應(yīng)答信號(hào)
        Stop();
}

//=================================================================================================
/************************************************************
*   函數(shù)名稱:void Rtc_Write_1byte()
*   功    能:RTC寫一字節(jié)數(shù)據(jù)
*   入口參數(shù):uchar Slave,unsigned char Address,unsigned char Data
*   出口參數(shù):無
************************************************************/
void Rtc_Write_1byte(unsigned char Slave,unsigned char Address,unsigned char Data)
{
   do{Start();Write_Byte(Slave);                Check_Ack(); }                while(F_Flag==1);         
   do{                                Write_Byte(Address);        Check_Ack(); }                while(F_Flag==1);  
   do{                           Write_Byte(Data);           Check_Ack(); }                while(F_Flag==1);              //檢查應(yīng)答位

   Stop();
}


//=======================================================================================================
/************************************************************
*   函數(shù)名稱:void Rtc_Write_Nbyte(unsigned char Slave,unsigned char Address,unsigned char *Array,unsigned char Number)
*   功    能:RTC寫N個(gè)字節(jié)子程序
*   入口參數(shù):uchar Slave,unsigned char Address,unsigned char *Array,unsigned char Number
*   出口參數(shù):無
************************************************************/
void Rtc_Write_Nbyte(unsigned char Slave,unsigned char Address,unsigned char *Array,unsigned char Number)
{
   unsigned char i;
                                                                                
   do{Start();Write_Byte(Slave);                Check_Ack();        }                while(F_Flag==1) ;  //開始->寫IIC器件地址->檢查應(yīng)答位
   do{                                Write_Byte(Address);        Check_Ack();        }                while(F_Flag==1) ;          //送起始地址->檢查應(yīng)答位  
                                                                        
   for(i=0;i<Number;i++)                //寫Number個(gè)數(shù)據(jù)  
    {
                        do{Write_Byte(HEX2BCD(*Array));        Check_Ack();}        while(F_Flag==1);  
                        Array++;
    }            

                Stop();                  
}




#endif

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:624769 發(fā)表于 2021-9-22 19:20 | 只看該作者
按要求, I2C 通訊都必須配備 <= 4.7K的上拉電阻。如果在一個(gè)I2C總線上,存在多個(gè)從機(jī),上拉電阻要酌情減小。所以檢查一下你上拉電阻有沒有到位。同時(shí)I2C傳輸上拉一般遷就從機(jī)電壓,主機(jī)采取開漏模式。
回復(fù)

使用道具 舉報(bào)

板凳
ID:83626 發(fā)表于 2021-9-23 13:52 | 只看該作者
是在3G路由器上拆下來的 M41T81模塊,接在原路由器上,電腦上能能正常顯示系統(tǒng)時(shí)間的,我用STC12C5A60S2@22.1184M晶振試了,返回值不是00,就是FF?赡苁茄訒r(shí)不對(duì),M41T81對(duì)時(shí)序有要求。
回復(fù)

使用道具 舉報(bào)

地板
ID:83626 發(fā)表于 2021-9-23 13:53 | 只看該作者
188610329 發(fā)表于 2021-9-22 19:20
按要求, I2C 通訊都必須配備

感謝回復(fù) ,要STC最小系統(tǒng)測(cè)試的, 有10K電阻上拉的。
回復(fù)

使用道具 舉報(bào)

5#
ID:401564 發(fā)表于 2021-9-23 20:55 | 只看該作者
void Check_Ack(void)  
應(yīng)答函數(shù)都是錯(cuò)誤的,應(yīng)答是等待,不是延時(shí),這兩者是不一樣的
應(yīng)答是等待從機(jī)的SDA出現(xiàn)低電平,視為應(yīng)答
但并不是延時(shí)就有低電平,延時(shí)之后不一定會(huì)有低電平的
參考一下
void Write_Byte(unsigned char byte)                        //寫入器件的應(yīng)答信號(hào)由從機(jī)給出
{
         unsigned char i,temp;
        unsigned int k;
         temp=byte;                
        SCL=0;
        Delay();
                 for(i=0;i<8;i++)
                         {
                        if(temp&0x80)SDA=1;
                        else SDA=0;
                        Delay();
                        SCL=1;
                        Delay();               
                        SCL=0;
                        Delay();
                        temp=temp<<1;
                        }
        SCL=1;                   //給出一個(gè)上升沿,用于產(chǎn)生應(yīng)答信號(hào)
        Delay();
        SDA=1;
        while((SDA==1)&&(k<1000))
                {
                k++;
                Delay();
                } //等待SDA出現(xiàn)低電平,出現(xiàn)低電平就表示器件已經(jīng)應(yīng)答
        SCL=1;
        SDA=0;
        Delay();
}
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表