DS3231的使用(二) (附IIC源碼)

来源:https://www.cnblogs.com/wxz1995/archive/2018/01/30/8378688.html
-Advertisement-
Play Games

本節主要講述IIC的使用及源碼實現。 IIC數據有效性:只有在SCL線為低時,SDA線才允許改變電平。 初始巨集定義如下: IIC時序圖(取自DS3231數據手冊): 先看前一部分(開始與結束): 從時序圖可以看出來,開始信號為SCL為高時,SDA由高變低;結束信號為SCL為低時,SDA由低變高。 發 ...


本節主要講述IIC的使用及源碼實現。

IIC數據有效性:只有在SCL線為低時,SDA線才允許改變電平。

初始巨集定義如下:

 1 /**************巨集定義***************/
 2 #define DS_SCL  BIT6        //DS_SCL = P1.6
 3 #define DS_SDA  BIT5        //DS_SDA = P1.5
 4 #define DS_SCL_IN           P1DIR &= ~DS_SCL
 5 #define DS_SCL_OUT        P1DIR |= DS_SCL
 6 #define DS_SCL_L             P1OUT &= ~DS_SCL
 7 #define DS_SCL_H            P1OUT |= DS_SCL
 8 #define DS_SDA_IN          P1DIR &= ~DS_SDA
 9 #define DS_SDA_OUT       P1DIR |= DS_SDA
10 #define DS_SDA_L            P1OUT &= ~DS_SDA
11 #define DS_SDA_H           P1OUT |= DS_SDA
12 #define DS_SDA_BIT        P1IN & DS_SDA
13 #define DS_SDA_IN_H      P1REN |= DS_SDA

 

IIC時序圖(取自DS3231數據手冊):

先看前一部分(開始與結束):

從時序圖可以看出來,開始信號為SCL為高時,SDA由高變低;結束信號為SCL為低時,SDA由低變高。

 1 /*******************************************
 2 函數名稱:DS_Start
 3 功    能:I2C起始數據
 4 參    數:無
 5 返回值  :無
 6 ********************************************/
 7 void DS_Start(void)
 8 {
 9 DS_SDA_OUT;          //設置IO口方向
10 DS_SCL_OUT;
11 DS_SCL_H;            //SCL、SDA先拉高
12 Delay_us(5);         //delay應該有個最小時間要求
13 DS_SDA_H;
14 Delay_us(5);
15 DS_SDA_L;            //SDA拉低表明開始
16 Delay_us(5);
17 DS_SCL_L;            //SCL拉低,數據傳輸準備就緒
18 Delay_us(5);
19 }
 1 /*******************************************
 2 函數名稱:DS_Stop
 3 功    能:I2C終止數據
 4 參    數:無
 5 返回值  :無
 6 ********************************************/
 7 void DS_Stop(void)
 8 {
 9 DS_SDA_OUT;          //設置IO口方向
10 DS_SCL_OUT;
11 DS_SCL_L;            //先把SCL、SDA拉低,給結束信號做準備
12 Delay_us(5);
13 DS_SDA_L;
14 Delay_us(5);
15 DS_SCL_H;            //SCL拉高
16 Delay_us(5);
17 DS_SDA_H;            //當SCL為高,SDA由低變高為結束信號
18 Delay_us(1);
19 }

發送數據與讀數據:

由圖可知,開始信號後,應把SCL拉低,準備數據傳輸,SDA電平變化後,再拉高SCL,發送數據(最高位先發送),迴圈8次(一個位元組)。

讀取函數同理,只不過過程是反的,SDA是輸入,主機做接收端。

 1 /*******************************************
 2 函數名稱:DS_Send_Byte
 3 功    能:I2C發送數據
 4 參    數:data
 5 返回值  :data
 6 ********************************************/
 7 void DS_Send_Byte(u8 data)
 8 {
 9 DS_SDA_OUT;           //設置IO口輸出方向
10 DS_SCL_OUT;
11 DS_SCL_L;             //SCL為低時,允許SDA改變電平
12 unsigned char temp;
13 for(temp=0x80;temp!=0;temp>>=1)
14     {
15      if(temp&data==0) //高位先發
16      {
17        DS_SDA_L;
18      }
19      else
20      {
21        DS_SDA_H;
22      }
23       Delay_us(5);
24        DS_SCL_H;      //SCL拉高 發送數據
25       Delay_us(5);
26        DS_SCL_L;
27     }
28 }
 1 /*******************************************
 2 函數名稱:DS_Read
 3 功    能:I2C接收數據
 4 參    數:data
 5 返回值  :data
 6 ********************************************/
 7 unsigned char DS_Read(void)
 8 {
 9    unsigned char temp;
10    unsigned char data;
11 
12    DS_SDA_IN;              //主機做接收,SDA線為輸入
13    DS_SDA_IN_H ; 
14    for(temp=0x80;temp!=0;temp>>=1)
15    {
16     DS_SCL_H;              //SCL拉高,保證接收數據時SDA不改變
17     Delay_us(5);
18     if(DS_SDA_BIT==1)
19     {
20      data|=temp;           //高電平保留
21     }
22      else
23     {
24      data&=~temp;
25     }
26     DS_SCL_L;              //SCL拉低,數據準備
27     }
28     return data;
29 }

主機應答信號與非應答信號:

主機接收完從機數據後,要發送應答或者非應答信號。

 1 /*******************************************
 2 函數名稱:DS_Ack
 3 功    能:I2C發送應答信號
 4 參    數:無
 5 返回值  :無
 6 ********************************************/
 7 void DS_Ack(void)
 8 {
 9 DS_SDA_OUT;    //主機為接收端   發送應答信號
10 DS_SCL_L;        //SCL拉低,允許SDA改變電平
11 DS_SDA_L;       //SDA低電平為應答
12 DS_SCL_H;
13 Delay_us(5);
14 DS_SCL_L;
15 }
 1 /*******************************************
 2 函數名稱:DS_NAck
 3 功    能:I2C發送非應答信號
 4 參    數:無
 5 返回值  :無
 6 ********************************************/
 7 void DS_NAck(void)
 8 {
 9 DS_SDA_OUT;   //此時,相當於主機在接收數據,是被動方
10 DS_SCL_L;     //SCL拉低,允許SDA改變電平
11 DS_SDA_H;     //SDA高電平為非應答
12 DS_SCL_H;
13 Delay_us(5);
14 DS_SCL_L;
15 }

主機接收從機應答信號:

從機在接收主機數據後,從機要發送一個應答信號,主機判斷此應答信號為應答信號或者非應答信號,做下一步處理。

/*******************************************
函數名稱:DS_Get_Ack
功    能:I2C接收應答信號
參    數:無
返回值  :ack
********************************************/
uchar DS_Get_Ack(void)
{
    unsigned char ack;
    DS_SDA_IN;         //釋放數據線,準備接收應答
    DS_SDA_IN_H ;      //SDA線輸入上拉
    DS_SCL_H;          //SCL線拉高
    if(DS_SDA_BIT==1)
    {
     ack=0;//無應答信號
    }
    else
    {
     ack=1;//有應答信號
    }
    DS_SCL_L;
    Delay_us(5);
}

下麵是DS3231傳輸時序圖:

由圖可知,在發送開始信號後,DS3231接收的第一個位元組的前7位是從機地址,即DS3231地址,第八位為讀/寫操作。

  

從DS3231的數據手冊中可以看出來,DS3231的地址為1101000,所以主機操作的寫地址為0XD1,讀地址為0XD0。(不要寫反)讀寄存器指針的方式是開始信號-寫器件地址-寫寄存器地址-開始信號-接收數據-停止。

 1 /*******************************************
 2 函數名稱:DS3231_WriteByte
 3 功    能:I2C匯流排給DS3231發送單位元組
 4 參    數:WriteAddr DataToWrite
 5 返回值  :無
 6 ********************************************/
 7 void DS3231_WriteByte(u8 WriteAddr,u8 DataToWrite)
 8 {
 9 DS_Start();
10 DS_Send_Byte(0XD1);       //發送器件地址    
11 DS_Get_Ack();
12 DS_Send_Byte(WriteAddr);  //發送首地址
13 DS_Get_Ack();
14 DS_Send_Byte(DataToWrite);//發送數據
15 DS_Get_Ack();
16 DS_Stop();
17 Delay_ms(1);
18 }

 

 1 /*******************************************
 2 函數名稱:DS3231_ReadByte
 3 功    能:I2C匯流排從DS3231接收單位元組
 4 參    數:ReadAddr DataToRead
 5 返回值  :Data
 6 ********************************************/
 7 uchar DS3231_ReadByte(u8 ReadAddr)
 8 {
 9   uchar R_Data=0;
10   DS_Start();
11   DS_Send_Byte(0XD0);//讀地址
12   DS_Ack();
13   DS_Send_Byte(ReadAddr);
14   DS_Ack();
15   DS_Start();
16   DS_Send_Byte(0XD1);
17   R_Data=DS_Read();
18   Delay_us(5);
19   DS_NAck();
20   DS_Stop();
21   return R_Data;
22 }
 1 /*******************************************
 2 函數名稱:Readtime
 3 功    能:讀取DS3231時間
 4 參    數:R_tmpdate
 5 返回值  :無
 6 ********************************************/
 7 void Read_RTC()
 8 {   unsigned char rtc_address[6]={0x00,0x01,0x02,0x04,0x05,0x06};
 9     unsigned char R_tmpdate[6];
10     unsigned char i,*p;
11      p=rtc_address;             //地址傳遞
12     for(i=0;i<6;i++)            //分6次讀取 秒分時日月年
13     {
14       R_tmpdate[i]=DS3231_ReadByte(*p); 
15       p++;
16     }
17 }
 1 void ModifyTime(uchar yea,uchar mon,uchar da,uchar hou,uchar min,uchar sec)
 2 {
 3   uchar temp=0;
 4 
 5   DS3231_WriteByte(0x06,temp);//修改年
 6 
 7   DS3231_WriteByte(0x05,temp);//修改月
 8 
 9   DS3231_WriteByte(0x04,temp);//修改日
10 
11   DS3231_WriteByte(0x02,temp);//修改時
12 
13   DS3231_WriteByte(0x01,temp);//修改分
14 
15   DS3231_WriteByte(0x00,temp);//修改秒
16 }

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • suging 的註冊中心支持consul跟zookeeper。因為consul跟zookeeper的配置都差不多,所以只是consul的配置 consul下載地址:https://www.consul.io/downloads.html consul agent 命令的常用選項,如下: -data- ...
  • 制定了一個通訊協議,然後其數據部分有如下格式。 第三列代表的是位元組數,第4列是數據類型。 當傳輸或者收到一個byte數組的時候(下麵Hex數據),按照對應格式進行解析,解析方法有很多種,網上看到了一種方式是以結構體的方式來解析的,類似C/C++方式。 Hex數據:01 01 00 00 10 44 ...
  • 需求描述 項目中有一個通知公告的功能,在後臺管理員添加公告後需要推送消息給所有註冊用戶,讓其查看消息。消息推送移動端採用極光推送,但是消息在何時發送是個問題,比如說有一個重要的會議通知,可能希望在會議開始前半天進行提醒,僅僅使用後臺代碼處理起來可能比較麻煩,這時就需要考慮到使用作業來處理這種定時執行... ...
  • 前言 大家好,我依舊是你們的老朋友Rector,很高興又在周五的時候準時和大家見面。 Rector的系列文章【一步一步創建ASP.NET MVC5程式[Repository+Autofac+Automapper+SqlSugar]】從寫作以來,已經出了六期了,其中受到了很多朋友的喜歡,在此非常感謝大 ...
  • 題目輸入輸出 "this is a sentence" => [t, h, i, s, i, s, a, s, e, n, t, e, n, c, e]"thiis iss a senntencee" => [i, s, n, e]"thiisss iss a senntttenceee" => [ ...
  • 演示產品源碼下載地址:http://www.jinhusns.com/Products/Download ...
  • 邏輯捲管理 邏輯捲管理器(LVM) LVM 介紹 LVM 更改文件系統的容量 pv 管理工具 vg 管理工具 lv 管理工具 擴展和縮減邏輯捲 遷移捲組到新系統 創建邏輯捲示例 邏輯捲管理器快照 使用LVM 快照 ...
  • 軟RAID管理 軟RAID 軟RAID的實現 軟RAID 配置示例 軟RAID 測試和修複 軟RAID 管理 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...