STM32-I2C_CheckEvent-標誌位自動清除理解

来源:https://www.cnblogs.com/jackis-tang/archive/2019/07/22/11224512.html
-Advertisement-
Play Games

STM32里I2C_CheckEvent函數我們應該是相當熟悉了,在每次發送數據後我們都需要檢驗相應的EVx(x = 0,1,2,,,)事件是否有發送。 函數定義如下: 該函數第一個參數是輸入需要檢查的I2Cx(x = 1,2,3,4,5)外設,第二個參數是檢查的事件,如下所示: I2C_EVENT ...


STM32里I2C_CheckEvent函數我們應該是相當熟悉了,在每次發送數據後我們都需要檢驗相應的EVx(x = 0,1,2,,,)事件是否有發送。

函數定義如下:

 1 ErrorStatus I2C_CheckEvent(I2C_TypeDef* I2Cx, uint32_t I2C_EVENT)
 2 {
 3   uint32_t lastevent = 0;
 4   uint32_t flag1 = 0, flag2 = 0;
 5   ErrorStatus status = ERROR;
 6 
 7   /* Check the parameters */
 8   assert_param(IS_I2C_ALL_PERIPH(I2Cx));
 9   assert_param(IS_I2C_EVENT(I2C_EVENT));
10 
11   /* Read the I2Cx status register */
12   flag1 = I2Cx->SR1;
13   flag2 = I2Cx->SR2;
14   flag2 = flag2 << 16;
15 
16   /* Get the last event value from I2C status register */
17   lastevent = (flag1 | flag2) & FLAG_Mask;
18 
19   /* Check whether the last event contains the I2C_EVENT */
20   if ((lastevent & I2C_EVENT) == I2C_EVENT)
21   {
22     /* SUCCESS: last event is equal to I2C_EVENT */
23     status = SUCCESS;
24   }
25   else
26   {
27     /* ERROR: last event is different from I2C_EVENT */
28     status = ERROR;
29   }
30   /* Return status */
31   return status;
32 }

該函數第一個參數是輸入需要檢查的I2Cx(x = 1,2,3,4,5)外設,第二個參數是檢查的事件,如下所示:

I2C_EVENT_SLAVE_TRANSMITTER_ADDRESS_MATCHED :       EV1
I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED :         EV1
I2C_EVENT_SLAVE_TRANSMITTER_SECONDADDRESS_MATCHED :     EV1
I2C_EVENT_SLAVE_RECEIVER_SECONDADDRESS_MATCHED :       EV1
I2C_EVENT_SLAVE_GENERALCALLADDRESS_MATCHED :         EV1
I2C_EVENT_SLAVE_BYTE_RECEIVED :                 EV2
(I2C_EVENT_SLAVE_BYTE_RECEIVED | I2C_FLAG_DUALF) :       EV2
(I2C_EVENT_SLAVE_BYTE_RECEIVED | I2C_FLAG_GENCALL) :       EV2
I2C_EVENT_SLAVE_BYTE_TRANSMITTED :               EV3
(I2C_EVENT_SLAVE_BYTE_TRANSMITTED | I2C_FLAG_DUALF) :     EV3
(I2C_EVENT_SLAVE_BYTE_TRANSMITTED | I2C_FLAG_GENCALL) :      EV3
I2C_EVENT_SLAVE_ACK_FAILURE :                   EV3_2
I2C_EVENT_SLAVE_STOP_DETECTED :                 EV4
I2C_EVENT_MASTER_MODE_SELECT :                 EV5
I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED :        EV6 
I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED :        EV6
I2C_EVENT_MASTER_BYTE_RECEIVED :              EV7
I2C_EVENT_MASTER_BYTE_TRANSMITTING :            EV8
I2C_EVENT_MASTER_BYTE_TRANSMITTED :             EV8_2
I2C_EVENT_MASTER_MODE_ADDRESS10 :               EV9

本文就舉裡面常用的一些事件為例,來分析該函數為什麼能夠自動清除標誌位。包含EV5,EV6,EV8以及EV7事件。

在使用I2C發送數據時我們會用到EV5,EV6,EV8事件,事件名稱及定義如下:

/*I2C_EVENT_MASTER_MODE_SELECT                          : EV5*/
#define  I2C_EVENT_MASTER_MODE_SELECT                      ((uint32_t)0x00030001)  /* BUSY, MSL and SB flag */

/*I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED            : EV6 */
#define  I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED        ((uint32_t)0x00070082)  /* BUSY, MSL, ADDR and TRA flags */
/*I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED               : EV6*/
#define  I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED           ((uint32_t)0x00030002)  /* BUSY, MSL and ADDR flags */


/*I2C_EVENT_MASTER_BYTE_TRANSMITTING                    : EV8*/
#define I2C_EVENT_MASTER_BYTE_TRANSMITTING                 ((uint32_t)0x00070080) /* TRA, BUSY, MSL, TXE flags */
/*I2C_EVENT_MASTER_BYTE_TRANSMITTED                     : EV8_2*/
#define  I2C_EVENT_MASTER_BYTE_TRANSMITTED                 ((uint32_t)0x00070084)  /* TRA, BUSY, MSL, TXE and BTF flags */
  • 根據I2C_CheckEvent函數的定義,事件的高16位為I2C外設的SR2寄存器,低16位為I2C外設的SR1寄存器。
  • 先來看看 I2C_EVENT_MASTER_MODE_SELECT,巨集定義為,0x00030001,對應的SR1和SR2寄存器如下所示:

其中MSL為1表為主模式,BUSY為1表匯流排忙碌,

這兩位一般都是在產生STOP信號的時候置0,其他時候都為1。

看看SB位如何清零,

我們在Check_Event函數裡面讀取了SR1寄存器,我們在發送了起始信號之後就需要發送設備地址進行訪問,在I2C_Send7bitAddress函數裡面我們訪問了數據寄存器SD,於是在下一次檢測標誌位之前SB被清除。

  • 再來看看兩個EV6事件 I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED 和 I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED,這兩者的區別就是一個用於發送模式,另一個用於接受模式,發送模式為0x00070082,

 

TRA數據單元一般產生STOP信號後清除,至於ADDR位,在I2C_CheckEvent函數裡面,我們是順序地讀取了SR1和SR2寄存器,於是ADDR位被清除。對於TxE位,我們下一步能會進行數據發送操作,也就是使用I2C_SendData函數訪問DR數據寄存器,於是TxE也被清除。

  • 還有一個EV8事件 I2C_EVENT_MASTER_BYTE_TRANSMITTED, 定義為0x00070084,

 

此處只討論BTF位的清除,

也是訪問SR1寄存器和對數據寄存器的讀或寫可以清除該位,因此BTF位也被清除。

至於I2C_CheckEvent裡面其他事件所設計的位清除,我就不一一舉例了,可以按照這個思路,參考STM32F10x-中文參考手冊自己一步步的查看。

I2C_ChencEvent比I2C_GetFlagStatus函數好的一點就是它檢測了與事件相關的所有寄存器位,而後者只檢測提供的標誌位。

 


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

-Advertisement-
Play Games
更多相關文章
  • 之前沒有使用過網易CentOS鏡像的yum源,最近由於需要,遂在一臺測試伺服器驗證、測試了一下如何配置使用網易的Cent0S的yum源。此文僅僅是筆記性質,參考了網上大量資料(文末“參考資料”的相關鏈接)。 1: 刪除RHEL 6.6原有的YUM相關包 [root@gettestlnx03 ~]# ... ...
  • 視音頻基礎知識——視音頻解碼——視音頻編碼——視音頻轉碼——視音頻播放——具體應用——其他高階內容 其實就對應於你在通信原理里學過的基本通信模型,下麵以流媒體傳輸系統為例畫個對應項示意圖,基本上除了中間通道的部分,都是編解碼生涯中要研究的東西。 下麵我針對學習路線中的各部分單獨做一下介紹 視音頻基礎 ...
  • RAM數據格式解析 Raw格式是sensor的輸出格式,是未經處理過的數據,表示sensor接受 到的各種光的強度。 Raw數據在輸出的時候是有一定的順序的,一般為以下四種: 00: GR/BG 01: RG/GB 10: BG/GR 11: GB/RG 為什麼每種情況里有兩個G分量呢?這時因為人的 ...
  • (自己的隨手筆記,記得有點亂請親噴) which:查看某個命令的完整路徑df -h:查看系統磁碟情況history:查看歷史輸入的命令 網卡配置路徑:vim /etc/sysconfig/network-scripts/ifcfg-eth0 1.systemctl reboot 重啟 *2.shut ...
  • Mac安裝kubectl brew install kubernetes-cli 找到伺服器上的apiserver.crt文件,一般在/etc/kubernetes/pki中 執行如下命令: openssl x509 -in apiserver.crt -noout -text | grep DNS ...
  • 導讀:本文翻譯自 Brendan Gregg 去年的一片博客文章 “CPU Utilization is Wrong”,從標題就能想到這篇文章將會引起爭議。文章一上來就說,我們“人人皆用、處處使用,每個性能監控工具里都在用”的 top 命令里的 “%CPU” 指標,是不對的,其並非用於衡量 CPU ...
  • win10筆記本連上WiFi,顯示“無internet,安全”,本文提供了6種解決辦法 ...
  • 本文首發於:微信公眾號「運維之美」,公眾號 ID:Hi Linux。 ​「運維之美」是一個有情懷、有態度,專註於 Linux 運維相關技術文章分享的公眾號。公眾號致力於為廣大運維工作者分享各類技術文章和發佈最前沿的科技信息。公眾號的核心理念是:分享,我們認為只有分享才能使我們的團體更強大。如果你想第 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...