基于RT-Thread的STM32F4開發第五講——軟件模擬I2C

文章目錄

  • 前言
  • 一、RT-Thread工程創建
  • 二、AT24C02
  • 三、函數編寫
    • 1.I2C_soft.c
    • 2.I2C_soft.h
    • 3.main.h
  • 四、效果展示
  • 五、資源分享
  • 總結


前言


本章是基于RT-Thread studio實現軟件模擬I2C,開發板是正點原子的STM32F4探索者,使用的RT-Thread驅動是5.1.0,使用的I2C通訊芯片是存儲芯片AT24C02,本章和前面文章不同在于I2C是軟件模擬,與設備無關,所以驅動文件不會有問題,但是對于代碼開發官方文檔有些重要內容沒有提到,本文將進行補充。

一、RT-Thread工程創建

這里只需要按前文得到一個不報錯的基礎工程,因為是軟件模擬I2C,所以不需要去cubemx進行硬件配置。
然后去board.h找到I2C的定義區間,使能一個I2C型號,將SCL和SDA按你的使用的開發板引腳定義。我這里使能了I2C1,SCL接入的引腳是PB8,SDA接入的引腳是PB9,如下。
在這里插入圖片描述
然后去設置中打開軟件模擬I2C開關,Use GPIO to soft simulate I2C感覺重復了,開不開對工程沒有影響,對于debug message開啟的話可以看到I2C通訊的工作流程。
在這里插入圖片描述
到此,I2C工程配置完成

二、AT24C02

AT24C02是接下來用到的I2C通訊芯片,我簡單說明一下。
AT24C02 是一款由 低功耗串行電可擦除只讀存儲器(EEPROM),通過 I2C 總線進行通信。支持標準模式(100kHz)和快速模式(400kHz)。
2K 位(256 字節)存儲空間,分為 32 頁,每頁 8 字節。地址范圍:0x00~0xFF(地址低3位為頁內地址,高5位為頁面地址)。一個頁面
只能寫入8字節,超過的數據將寫入下一個頁面。
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

三、函數編寫

1.I2C_soft.c

先看代碼,再看講解

#include "I2C_soft.h"
#define DBG_TAG "I2C_soft"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>#define     I2C1_NAME   "i2c1"
#define     SLAVE_ADDR  0xa0>>1//data[0]為數據地址,后面開始是寫入數據
int write_i2c1reg(rt_uint8_t *data,rt_uint8_t data_byte)
{rt_uint8_t i2c1_flag = 0;struct rt_i2c_bus_device *i2c1_bus;i2c1_bus = (struct rt_i2c_bus_device *)rt_device_find(I2C1_NAME);if(i2c1_bus == RT_NULL){LOG_D("failed to i2c1 bus find");return -1;}i2c1_flag = (rt_uint8_t)rt_i2c_master_send(i2c1_bus, SLAVE_ADDR, RT_NULL, data, data_byte);if(i2c1_flag != data_byte){LOG_D("failed to i2c1 send");return -1;}return 0;
}
//data_add為讀數據地址
int read_i2c1reg(rt_uint8_t data_add,rt_uint8_t *data,rt_uint8_t data_byte)
{rt_uint8_t i2c1_flag = 0;struct rt_i2c_bus_device *i2c1_bus;i2c1_bus = (struct rt_i2c_bus_device *)rt_device_find(I2C1_NAME);if(i2c1_bus == RT_NULL){LOG_D("failed to i2c1 bus find");return -1;}rt_i2c_master_send(i2c1_bus, SLAVE_ADDR, RT_NULL, &data_add, 1);i2c1_flag = (rt_uint8_t)rt_i2c_master_recv(i2c1_bus, SLAVE_ADDR, RT_NULL, data, data_byte);if(i2c1_flag != data_byte){LOG_D("failed to i2c1 recv");return -1;}return 0;
}

按照圖1,器件地址應該是0xa0(W)或0xa1?,最后一位為讀寫位,但是官方手冊明確說明了不包含讀寫位。如下
在這里插入圖片描述
所以,后面的函數默認傳入的地址是不帶最后一位的7位地址,然后根據flags標志形成8位地址作為器件地址,具體操作是將輸入的地址左移1位,然后或上讀寫位成為最終地址,那么為了保證最終地址不出錯,所以我們傳入的地址就要先右移一位。
我這里使用rt_i2c_master_sendrt_i2c_master_recv寫入和讀出數據,代碼上更簡介,這兩個函數就是把rt_i2c_transfer和傳輸的消息數組指針封裝了一下。
在這里插入圖片描述
另外對于rt_i2c_transfer函數第三個參數我覺得官網解釋有誤,num只能是1,否則就會出錯。要符合官方文檔的定義,你每次用rt_i2c_transfer只能寫入一個字節,那就效率太低了。所以最好不要用這個函數,用上面兩個函數,如果實在要用,那就記住num只能是1,和你數組元素個數無關。
在這里插入圖片描述
當我們使用rt_i2c_master_send傳輸數據時,如果標志位flag不寫入RT_I2C_NO_START /* 無開始條件 */,那么自動一開始發送一個起始位和一個器件地址字節和應答,后面就是一個數據字節一個應答,達到發送的數據個數后一個停止位,剛好符合圖2中AT24C02的寫入格式,所以我的寫入函數沒有問題。就是注意數組第一位是數據字節地址,后面才是寫入的數據內容。

提示
如果分開操作,把數據地址獨立出來應該如下操作。

//data_add為數據地址,data為寫入數據數組
rt_i2c_master_send(i2c1_bus, SLAVE_ADDR, RT_I2C_NO_STOP, &data_add, 1);
rt_i2c_master_send(i2c1_bus, SLAVE_ADDR, RT_I2C_NO_START, data, data_byte);

可見RT_I2C_NO_STOP會去除停止位,RT_I2C_NO_START會去除起始位和器件地址字節

對于接收函數,按照圖3的數據格式,先采用rt_i2c_master_send(i2c1_bus, SLAVE_ADDR, RT_NULL, &data_add, 1);發送一個讀數據地址,然后使用rt_i2c_master_recv(i2c1_bus, SLAVE_ADDR, RT_NULL, data, data_byte);將讀到的數據存入數組data中,data_byte是讀取數據字節數,rt_i2c_master_recv的flag同理。

弄清了以上這些,遇見了其他的I2C通訊芯片,只要按照它的讀寫格式,就能利用rt_i2c_master_sendrt_i2c_master_recv配置出需要的格式。

2.I2C_soft.h

#ifndef APP_I2C_SOFT_H_
#define APP_I2C_SOFT_H_#include <board.h>
//data[0]為數據地址,后面開始是寫入數據
int write_i2c1reg(rt_uint8_t *data,rt_uint8_t data_byte);
int read_i2c1reg(rt_uint8_t data_add,rt_uint8_t *data,rt_uint8_t data_byte);#endif /* APP_I2C_SOFT_H_ */

3.main.h

#include <rtthread.h>#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>
#include "I2C_soft.h"int main(void)
{rt_uint8_t i2c1_wd[] = {0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x10};rt_uint8_t i2c1_rd[8] = {0};write_i2c1reg(i2c1_wd, 10);rt_thread_mdelay(100);read_i2c1reg(0x00,i2c1_rd, 9);rt_thread_mdelay(100);for(int i = 0;i<9;i++){rt_kprintf("i2c1 read data id 0x%x\n",i2c1_rd[i]);}read_i2c1reg(0x08,i2c1_rd, 9);rt_thread_mdelay(100);for(int i = 0;i<9;i++){rt_kprintf("i2c1 read data id 0x%x\n",i2c1_rd[i]);}while (1){rt_thread_mdelay(1000);}return RT_EOK;
}

四、效果展示

在這里插入圖片描述
為什么是這樣效果我就不解釋了,如果你看懂了這篇文章你就知道為什么是這樣了(AT24C02默認無數據寫入空間值為0xff)

五、資源分享

通過網盤分享的文件:I2C_soft.zip
鏈接: https://pan.baidu.com/s/1k1P0mUaXDR7jJ6dwgJJ7QQ?pwd=iims 提取碼: iims


總結

對于軟件模擬的I2C好處是兼容性好,移植容易,對硬件設計要求不高,缺點就是傳輸速率很低,效率不高,占用系統資源過大。我看了一下,好像RT-Thread并沒有設計硬件I2C驅動。另外RT-Thread可以安裝AT24C02的軟件包,可以嘗試使用一下。

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

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

相關文章

49、c# 能?foreach 遍歷訪問的對象需滿足什么條件?

在 C# 中&#xff0c;要使用 foreach 循環遍歷一個對象&#xff0c;該對象必須滿足以下條件之一&#xff1a; 1. 實現 IEnumerable 或 IEnumerable 接口 非泛型版本&#xff1a;System.Collections.IEnumerable public class MyCollection : IEnumerable {private int[] _da…

推客小程序系統開發:全棧式技術解決方案與行業賦能實踐?

? 在數字化營銷深度滲透各行業的當下&#xff0c;傳統推廣模式已難以滿足企業精細化運營與高效獲客的需求。專業的推客小程序系統憑借其強大的裂變傳播能力與靈活的推廣機制&#xff0c;成為企業構建私域流量池、提升推廣效能的核心工具。我們基于多年技術沉淀與行業洞察&…

WPF布局系統詳解:掌握界面設計的核心藝術

掌握界面設計的核心藝術 1. WPF布局系統概述2. Grid布局詳解2.1 基本行列定義2.2 單元格定位與跨行跨列 3. StackPanel布局4. DockPanel布局5. WrapPanel與Canvas5.1 WrapPanel自動換行布局 5. Canvas絕對定位6. 布局嵌套與綜合應用7. 布局性能優化8. 響應式布局技巧9. 實戰&am…

labview實現LED流水燈的第一種方法

目的&#xff1a;寫一個跑馬燈程序&#xff0c;7個燈從左到右不停的輪流點亮&#xff0c;閃爍間隔由滑動條調節。 一、方法1&#xff1a;使用順序結構 使用順序結構&#xff0c;平鋪式順序結構與創建局部變量實現LED流水燈 具體步驟如下&#xff1a; 第一步&#xff0c;選擇…

uniapp如何設置uni.request可變請求ip地址

文章目錄 簡介方法一&#xff1a;直接在請求URL中嵌入變量方法二&#xff1a;使用全局變量方法三&#xff1a;使用環境變量方法四&#xff1a;服務端配置方法五&#xff1a;使用配置文件&#xff08;如config.js&#xff09;:總結 簡介 在uni-app中&#xff0c;uni.request 用…

深度學習篇---LSTMADF軌跡預測

文章目錄 前言LSTM 軌跡預測原理應用在行人軌跡預測方面在自動駕駛車輛的軌跡預測中優點缺點APF 軌跡預測原理應用在船舶運動規劃在無人駕駛車輛避障軌跡跟蹤優點缺點示例代碼前言 本文簡單介紹LSTM(長短期記憶網絡)和ADF(人工勢場法)這兩種不同的軌跡預測方法。 LSTM 軌跡…

python實現Web請求與響應

目錄 一&#xff1a;什么是Web請求與響應&#xff1f; 1&#xff1a;Web請求 2&#xff1a;Web響應 3&#xff1a;HTTP協議概述 4&#xff1a;常見的HTTP狀態碼包括&#xff1a; 二&#xff1a;python的requests庫 1&#xff1a;安裝requests庫 2&#xff1a;發送GET請…

Unity使用sherpa-onnx實現說話人識別

網友軟綿綿的面包人推薦&#xff0c;模型3dspeaker_speech_eres2net_base_200k_sv_zh-cn_16k-common.onnx的效果比3dspeaker_speech_eres2net_base_sv_zh-cn_3dspeaker_16k.onnx要好 具體代碼 using System; using System.Collections.Generic; using System.IO; using Sherpa…

ElasticSearch-集群

本篇文章依據ElasticSearch權威指南進行實操和記錄 1&#xff0c;空集群 即不包含任何節點的集群 集群大多數分為兩類&#xff0c;主節點和數據節點 主節點 職責&#xff1a;主節點負責管理集群的狀態&#xff0c;例如分配分片、添加和刪除節點、監控節點故障等。它們不直接…

LG P9844 [ICPC 2021 Nanjing R] Paimon Segment Tree Solution

Description 給定序列 a ( a 1 , a 2 , ? , a n ) a(a_1,a_2,\cdots,a_n) a(a1?,a2?,?,an?)&#xff0c;有 m m m 次修改 ( l , r , v ) (l,r,v) (l,r,v)&#xff1a; 對每個 i ∈ [ l , r ] i\in[l,r] i∈[l,r]&#xff0c;令 a i ← a i v a_i\gets a_iv ai?←…

Google Prompt Tuning:文本嵌入優化揭秘

Google Research Prompt Tunin :from_embedded_string 在 Google Research 的 Prompt Tuning 項目代碼庫 中,from_embedded_string 函數主要用于基于字符串文本初始化提示詞的嵌入向量,其調用場景通常與提示詞優化或任務適配相關。 1. 核心代碼位置 from_embedded_string …

網頁 H5 微應用接入釘釘自動登錄

??關于云審批 云審批&#xff08;cloud approve&#xff09; &#xff0c;一款專為小微企業打造&#xff0c;支持多租戶的在線審批神器。它簡化了申請和審批流程&#xff0c;讓您隨時隨地通過手機或電腦完成請款操作。員工一鍵提交申請&#xff0c;審批者即時響應&#xff0c…

idea無法識別Maven項目

把.mvn相關都刪除了 導致Idea無法識別maven項目 或者 添加導入各個模塊 最后把父模塊也要導入

飛槳paddle import fluid報錯【已解決】

跟著飛槳的安裝指南安裝了paddle之后 pip install paddlepaddle有一個驗證&#xff1a; import paddle.fluid as fluid fluid.install check.run check()報錯情況如下&#xff0c;但是我在pip list中&#xff0c;確實看到了paddle安裝上了 我import paddle別的包&#xff0c…

現代化SQLite的構建之旅——解析開源項目Limbo

現代化SQLite的構建之旅——解析開源項目Limbo 在當今飛速發展的技術世界中,輕量級且功能強大的數據庫已成為開發者的得力助手。當我們談論輕量級數據庫時,SQLite無疑是一個舉足輕重的名字。然而,隨著技術的進步,我們對數據庫的需求也變得更加多樣化。這正是Limbo項目誕生…

MinIO:從入門到精通,解鎖云原生存儲的奧秘

一、引言&#xff1a;為什么 MinIO 正在重塑存儲世界&#xff1f; 在云計算和大數據時代&#xff0c;傳統存儲系統面臨擴展性差、成本高、兼容性不足等挑戰。MinIO 憑借其 S3 兼容性、分布式架構、高性能存儲 等特性&#xff0c;成為企業構建現代化存儲基礎設施的首選。 本文…

vscode怎么關閉自動定位文件

關閉自動定位文件功能 方式1 在設置中搜索: explorer.autoReveal 方式2 直接在settings.json中增加"explorer.autoReveal": false 添加類似jetbrains IDE的文件定位功能 可以直接安裝插件市場搜索niushuaibing.vs-location, 安裝后會有文件定位按鈕, 點擊后即可…

學習路之uniapp--unipush2.0推送功能--給自己發通知

學習路之uniapp--unipush2.0推送功能--給自己發通知 一、綁定云空間及創建云函數二、編寫發送界面三、效果后期展望&#xff1a; 一、綁定云空間及創建云函數 package.json {"name": "server-push","dependencies": {},"main": "…

什么是VR展示?VR展示的用途

隨著科技的迅猛發展&#xff0c;我們步入一個全新的數字時代。在這個時代&#xff0c;虛擬現實&#xff08;VR&#xff09;技術嶄露頭角&#xff0c;逐步改變我們對世界的認知。全景展示廳作為VR技術與傳統展覽藝術的完美結合&#xff0c;以獨特的全景視角&#xff0c;引領我們…

抖音IP屬地跟無線網有關嗎?如何更改

IP屬地顯示功能讓許多用戶感到好奇——為什么自己的位置信息有時準確&#xff0c;有時卻顯示在其他城市&#xff1f;這時&#xff0c;用戶會疑惑&#xff1a;抖音IP屬地跟無線網有關系嗎&#xff1f;抖音的IP屬地顯示與其所使用的網絡類型&#xff08;包括無線網&#xff09;密…