IIC驅動OLED HAL庫+CubeMX

一.IIC傳輸數據的格式

?

1.寫操作

2.讀操作?

3.IIC信號?

二. IIC底層驅動

#define SCL_PIN         GPIO_PIN_6
#define SDA_PIN         GPIO_PIN_7#define SCL_PORT        GPIOB
#define SDA_PORT        GPIOB/********************** 函數宏定義
**********************/
#define SCL_H           HAL_GPIO_WritePin(SCL_PORT, SCL_PIN, 1)
#define SCL_L           HAL_GPIO_WritePin(SCL_PORT, SCL_PIN, 0)#define SDA_H           HAL_GPIO_WritePin(SDA_PORT, SDA_PIN, 1)
#define SDA_L           HAL_GPIO_WritePin(SDA_PORT, SDA_PIN, 0)
#define SDA_IN          HAL_GPIO_ReadPin(SDA_PORT, SDA_PIN)/**  函數名:I2C_GPIO_ReInit*  功能描述:將模擬I2C的SCL和SDA引腳進行重新初始化*  輸入參數:無*  輸出參數:無*  返回值:無
*/
extern void I2C_GPIO_ReInit(void);/**  函數名:I2C_Start*  功能描述:模擬發出I2C的開始信號-->在SCL的高電平下,SDA的電平由高到低變化*  輸入參數:無*  輸出參數:無*  返回值:無
*/
extern void I2C_Start(void);/**  函數名:I2C_Stop*  功能描述:模擬發出I2C的停止信號-->在SCL的高電平下,SDA的電平由低到高變化*  輸入參數:無*  輸出參數:無*  返回值:無
*/
extern void I2C_Stop(void);/**  函數名:I2C_GetAck*  功能描述:模擬I2C獲取從設備的響應信號-->在SCL的高電平下,從設備將SDA拉低*  輸入參數:無*  輸出參數:無*  返回值:成功得到響應返回0,否則返回-1
*/
extern int I2C_GetAck(void);/**  函數名:I2C_ACK*  功能描述:模擬I2C發出一個應答信號,在第九個時鐘將SDA拉低*  輸入參數:無*  輸出參數:無*  返回值:無
*/
extern void I2C_ACK(void);/**  函數名:I2C_NACK*  功能描述:模擬I2C發出一個非應答信號,在第九個時鐘將SDA拉高*  輸入參數:無*  輸出參數:無*  返回值:無
*/
extern void I2C_NACK(void);/**  函數名:I2C_WriteByte*  功能描述:模擬I2C發出一個字節的數據*  輸入參數:data-->要發送出去的數據,范圍0~255*  輸出參數:無*  返回值:無
*/
extern void I2C_WriteByte(uint8_t data);/**  函數名:I2C_ReadByte*  返回值:返回讀取到的數據*  輸入參數:ack-->根據此參數判斷在讀到一個字節之后是否發出應答信號*  輸出參數:無
*/
extern uint8_t I2C_ReadByte(uint8_t ack);#endif /* __DRIVER_I2C_H */
void I2C_Delay(uint32_t t)
{volatile uint32_t tmp = t;while(tmp--);
}/**  函數名:I2C_GPIO_ReInit*  功能描述:將模擬I2C的SCL和SDA引腳進行重新初始化*  輸入參數:無*  輸出參數:無*  返回值:無
*/
void I2C_GPIO_ReInit(void)
{/* 1. 使用結構體定義硬件GPIO對象 */GPIO_InitTypeDef GPIO_InitStruct = {0};/* 2. 將SCL和SDA的GPIO寄存器的值恢復為復位上電值 */HAL_GPIO_DeInit(SCL_PORT, SCL_PIN);HAL_GPIO_DeInit(SDA_PORT, SDA_PIN);/* 3. 使能SCL和SDA的GPIO的時鐘,因為他們都是GPIOF組的,所以這里只使能GPIOF的時鐘 */__HAL_RCC_GPIOF_CLK_ENABLE();/* 4. 設置GPIO的模式為開漏輸出模式,響應速度設置為快速響應 */GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;/* 5. 選擇要設置的GPIO引腳 */GPIO_InitStruct.Pin = SCL_PIN;/* 6. 調用init函數初始化GPIO */HAL_GPIO_Init(SCL_PORT, &GPIO_InitStruct);GPIO_InitStruct.Pin = SDA_PIN;HAL_GPIO_Init(SDA_PORT, &GPIO_InitStruct);
}/**  函數名:I2C_Start*  功能描述:模擬發出I2C的開始信號-->在SCL的高電平下,SDA的電平由高到低變化*  輸入參數:無*  輸出參數:無*  返回值:無
*/
void I2C_Start(void)
{SCL_H;SDA_H;I2C_Delay(100);SDA_L;I2C_Delay(100);
}/**  函數名:I2C_Stop*  功能描述:模擬發出I2C的停止信號-->在SCL的高電平下,SDA的電平由低到高變化*  輸入參數:無*  輸出參數:無*  返回值:無
*/
void I2C_Stop(void)
{SDA_L;SCL_H;I2C_Delay(100);SDA_H;I2C_Delay(100);
}/**  函數名:I2C_GetAck*  功能描述:模擬I2C獲取從設備的響應信號-->在SCL的高電平下,從設備將SDA拉低*  輸入參數:無*  輸出參數:無*  返回值:成功得到響應返回0,否則返回-1
*/
int I2C_GetAck(void)
{int i = 0;SCL_L;SDA_H;I2C_Delay(100);SCL_H;while(SDA_IN != 0){i++;if(i == 100){SCL_L;return -1;}I2C_Delay(10);}SCL_L;return 0;
}/**  函數名:I2C_ACK*  功能描述:模擬I2C發出一個應答信號,在第九個時鐘將SDA拉低*  輸入參數:無*  輸出參數:無*  返回值:無
*/
void I2C_ACK(void)
{SCL_L;SDA_L;I2C_Delay(100);SCL_H;I2C_Delay(100);
}/**  函數名:I2C_NACK*  功能描述:模擬I2C發出一個非應答信號,在第九個時鐘將SDA拉高*  輸入參數:無*  輸出參數:無*  返回值:無
*/
void I2C_NACK(void)
{SCL_L;SDA_H;I2C_Delay(100);SCL_H;I2C_Delay(100);
}/**  函數名:I2C_WriteByte*  功能描述:模擬I2C發出一個字節的數據*  輸入參數:data-->要發送出去的數據,范圍0~255*  輸出參數:無*  返回值:無
*/
void I2C_WriteByte(uint8_t data)
{uint8_t i = 0;for(i=0; i<8; i++){SCL_L;I2C_Delay(100);if(data & 0x80){SDA_H;}else{SDA_L;}data <<= 1; // 發出1bit數據后,要更新數據,將data的次高位移位到最高位SCL_H;I2C_Delay(100);}I2C_GetAck();
}/**  函數名:I2C_ReadByte*  返回值:返回讀取到的數據*  輸入參數:ack-->根據此參數判斷在讀到一個字節之后是否發出應答信號*  輸出參數:無
*/
uint8_t I2C_ReadByte(uint8_t ack)
{uint8_t i = 0;uint8_t data = 0;SDA_H;for(i=0; i<8; i++){SCL_L;I2C_Delay(100);SCL_H;I2C_Delay(100);data <<= 1; // 更新數據前,要將上一次數據左移1位用來保存接下來的這一位數據if(SDA_IN == 1)    {                 data++;}else{data = data;}}// 根據ack決定是否發出應答if(ack == 0){I2C_ACK();}else if(ack == 1){I2C_NACK();}return data;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/165716.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/165716.shtml
英文地址,請注明出處:http://en.pswp.cn/news/165716.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Navicat 技術指引 | 連接 GaussDB 主備版

Navicat Premium&#xff08;16.2.8 Windows版或以上&#xff09; 已支持對GaussDB 主備版的管理和開發功能。它不僅具備輕松、便捷的可視化數據查看和編輯功能&#xff0c;還提供強大的高階功能&#xff08;如模型、結構同步、協同合作、數據遷移等&#xff09;&#xff0c;這…

LangChain(0.0.339)官方文檔一:快速入門

LangChain官網、LangChain官方文檔 、langchain Github、langchain API文檔、llm-universe 文章目錄 一、LangChain簡介&#xff08;v0.0.338&#xff09;1.1 整體框架1.2 主要組件1.2.1 Model I/O1.2.2 Retrieval1.2.2.1 RAG1.2.2.2 Retrieval 1.2.3 Chain 1.3 其它組件1.3.1 …

STM32筆記---RTC

目錄 一、RTC簡介 二、主要特性 三、功能描述 3.1 讀RTC寄存器 3.2 配置RTC寄存器 四、BKP簡介 五、RTC_Init() 1. 函數BKP_ReadBackupRegister 2.RCC_LSEConfig設置外部低速晶振&#xff08;LSE&#xff09; 3.RTC基本結構 5.RTC_Init()實現 6.time.h 一、R…

九州未來聯合聯通智網科技發布白皮書,促進車聯網融合發展

2023年11月21日&#xff0c;由2023中國5G工業互聯網大會組委會、工業和信息化部主辦&#xff0c;聯通智網科技承辦的2023中國5G工業互聯網大會——5G車聯網與智慧交通創新發展平行會議&#xff0c;在武漢成功舉辦。 九州未來作為中國聯通車聯網創新聯合體成員單位&#xff0c;受…

【Sql】sql server還原數據庫的時候,提示:因為數據庫正在使用,所以無法獲得對數據庫的獨占訪問權。

【問題描述】 sql server 還數據庫的時候&#xff0c;提示失敗。 點擊左下角進度位置&#xff0c;可以得到詳細信息&#xff1a; 因為數據庫正在使用&#xff0c;所以無法獲得對數據庫的獨占訪問權。 【解決方法】 針對數據庫先后執行下述語句&#xff0c;獲得獨占訪問權后&a…

【Leetcode合集】2824. 統計和小于目標的下標對數目

2824. 統計和小于目標的下標對數目 2824. 統計和小于目標的下標對數目 代碼倉庫地址&#xff1a; https://github.com/slience-me/Leetcode 個人博客 &#xff1a;https://slienceme.xyz 給你一個下標從 0 開始長度為 n 的整數數組 nums 和一個整數 target &#xff0c;請你…

線性空間(也叫向量空間)、線性運算

線性空間、線性運算 線性空間&#xff0c;也稱向量空間。 假設是一個非空集合&#xff0c;是一個實數域。 在中定義了一個加法&#xff1a;即對中任何兩個元素和&#xff0c;總有中另外一個元素與它們相對應&#xff0c;稱為和的和&#xff0c;記作&#xff1a; 在定義了一個…

mac電腦系統活動監控:iStat Menus 中文 for Mac

iStat Menus是一款Mac操作系統上的系統監控工具&#xff0c;它提供了實時的系統狀態和性能數據&#xff0c;讓用戶可以方便地監控和管理自己的電腦。iStat Menus以菜單欄圖標的形式顯示各種系統指標&#xff0c;用戶可以輕松訪問和查看這些信息。 以下是iStat Menus軟件的一些…

debian 設置系統默認以命令行方式啟動,關閉x windows

debian 設置系統默認以命令行方式啟動&#xff0c;關閉x windows 2021-01-02 tech linux 設置 grub啟動設置在/etc/default/grub中&#xff0c;打開 default grub 配置: $ sudo vim /etc/default/grub修改以下配置&#xff1a; 更新grub&#xff0c;設置多用戶啟動: …

針對MySql知識的回顧

MySql雖然是一個相對簡單的關系型數據庫&#xff0c;但也是一個最常用的數據庫&#xff0c;也是一個非常經典的數據庫&#xff0c;很多云產品也是基于MySql做了二開&#xff0c;從而變得非常強大&#xff0c;其中MySql最常用的是Innodb引擎&#xff0c;因為該引擎支持事務&…

第14章 多線程三 (線程同步)

目錄 內容說明 章節內容 1、為什么需要多線程同步? 2、Java如何實現多線程同步?

CUDA學習筆記9——CUDA 共享內存 / Shared Memory

由于共享內存擁有僅次于寄存器的讀寫速度&#xff0c;比全局內存快得多。因此&#xff0c;能夠用共享內存訪問替換全局內存訪問的場景都可以考慮做對應的優化。 不利用共享內存的矩陣乘法 不利用共享內存的矩陣乘法的直接實現。每個線程讀取A的一行和B的一列&#xff0c;并計…

『Linux升級路』基礎開發工具——gcc/g++篇

&#x1f525;博客主頁&#xff1a;小王又困了 &#x1f4da;系列專欄&#xff1a;Linux &#x1f31f;人之為學&#xff0c;不日近則日退 ??感謝大家點贊&#x1f44d;收藏?評論?? 目錄 一、快速認識gcc/g 二、預處理 &#x1f4d2;1.1頭文件展開 &#x1f4d2;1…

java字符串的常見用法

java字符串的常見用法 Java中的字符串是一個非常常用的對象&#xff0c;它屬于Java的內置類String類的實例。字符串在Java中是不可變的&#xff0c;即一旦創建了一個字符串對象&#xff0c;就不能修改它的值。 下面是一些關于Java字符串的詳細用法&#xff1a; 1&#xff09;創…

從零開始,用Docker-compose打造SkyWalking、Elasticsearch和Spring Cloud的完美融合

&#x1f38f;&#xff1a;你只管努力&#xff0c;剩下的交給時間 &#x1f3e0; &#xff1a;小破站 "從零開始&#xff0c;用Docker-compose打造SkyWalking、Elasticsearch和Spring Cloud的完美融合 前言準備工作編寫docker-compose.yml文件為什么使用本機ip為什么skywa…

代碼隨想錄-刷題第六天

242. 有效的字母異位詞 題目鏈接&#xff1a;242. 有效的字母異位詞 思路&#xff1a;哈希法。利用數組來記錄出現的字母個數&#xff0c;然后判斷是否為字母異位詞。 時間復雜度&#xff1a;O(n) class Solution {public boolean isAnagram(String s, String t) {int[] co…

【云備份】第三方庫的認識與使用

文章目錄 json庫粗略認識詳細認識writer 類reader類jsoncpp序列化實現jsoncpp反序列化實現 bundle文件壓縮庫簡單認識bundle庫實現文件壓縮bundle庫實現文件解壓縮 httplib庫Request類Response類Server類Client類 json庫 粗略認識 json是一種數據交換格式&#xff0c;采用完全…

激光切割設備中模組的作用有哪些?

激光切割設備是一種高精度的自動化加工設備&#xff0c;用于對金屬、非金屬等材料進行精確切割。直線模組作為激光切割設備的重要組成部分&#xff0c;在激光切割設備中起著重要的作用&#xff0c;為設備的運動系統提供了高精度、高穩定性和高效率的運動控制。 1、高精度的位置…

excel單元格加背景顏色不生效?

如果在 Excel 中設置單元格背景顏色而發現不生效&#xff0c;可能有幾個原因。以下是一些常見的解決方法&#xff1a; 1. **單元格鎖定&#xff1a;** 檢查所在單元格是否被鎖定。如果單元格被鎖定&#xff0c;并且工作表被保護&#xff0c;你可能無法更改其背景顏色。在工作表…

mysql 優化器的AST樹是啥

from ChatGPT: MySQL中的優化器&#xff08;optimizer&#xff09;使用AST&#xff08;Abstract Syntax Tree&#xff0c;抽象語法樹&#xff09;來表示查詢的語法結構。AST是一種樹狀結構&#xff0c;它反映了查詢語句的語法層次&#xff0c;是一個抽象表示&#xff0c;用于更…