STM32F103C8T6使用MLX90614模塊

首先說明:

1.SMBus和I2C的區別

? ? ? ? 我曾嘗試用江科大的I2C底層去直接讀取該模塊,但是無法成功,之后AI生成的的代碼也無法成功。

? ? ? ? 思來想去最大的可能就是SMBus這個協議的問題,根據百度得到的結果如下:

SMBus和I2C的區別

鏈接:

smbus協議_百度百科https://baike.baidu.com/item/smbus%E5%8D%8F%E8%AE%AE/56360572.個人見解(希望有知道的可以補充說明或糾錯):

? ? ? ? ①SMBus協議是I2C的pro版本,對時序要求更加嚴格。

? ? ? ? ②特別是在超時方面,I2C可能是在SCL的對應電平下改變SDA的電平,那就能正常操作,不在意時間多久;但SMBus則是要求了SCL在對應電平下,SDA應該在什么時候做出改變,否則超時。

? ? ? ? ? ? ? ?

代碼:

以下是我用STM32F103C8T6能讀取到我認為正常數據的代碼,若不滿足讀者要求,請自行微調。

若對你有幫助,請點贊收藏~

#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"//************** 宏定義 **************
#define I2C_SCL_PIN    GPIO_Pin_6
#define I2C_SDA_PIN    GPIO_Pin_7
#define I2C_GPIO_PORT  GPIOB#define Nack_counter   10
#define uint           unsigned int
#define uchar          unsigned char//************** 全局變量 **************
volatile uchar DataH, DataL, Pecreg;
volatile uint temp;
//************** 函數聲明 **************
void I2C_GPIO_Init(void);
void start_bit(void);
void stop_bit(void);
void send_bit(uchar bit_val);
uchar rx_byte(void);
uchar tx_byte(uchar dat_byte);
void delay_us(uint us);
uint memread(void);//************** GPIO初始化 **************
void I2C_GPIO_Init(void) {GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);  // 使能GPIOB時鐘// SCL和SDA配置為開漏輸出GPIO_InitStructure.GPIO_Pin = I2C_SCL_PIN | I2C_SDA_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;  // 開漏輸出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(I2C_GPIO_PORT, &GPIO_InitStructure);// 初始狀態拉高GPIO_SetBits(I2C_GPIO_PORT, I2C_SCL_PIN | I2C_SDA_PIN);
}//************** 延時函數(72MHz主頻)**************
void delay_us(uint us) {us *= 72/5;  // 72MHz下1us需要72個周期(實測需校準)while(us--) {__NOP();}
}//************** I2C起始信號 **************
void start_bit(void) {GPIO_SetBits(I2C_GPIO_PORT, I2C_SDA_PIN);GPIO_SetBits(I2C_GPIO_PORT, I2C_SCL_PIN);delay_us(5);  // 保持時間≥4.7usGPIO_ResetBits(I2C_GPIO_PORT, I2C_SDA_PIN);delay_us(5);GPIO_ResetBits(I2C_GPIO_PORT, I2C_SCL_PIN);
}//************** I2C停止信號 **************
void stop_bit(void) {GPIO_ResetBits(I2C_GPIO_PORT, I2C_SCL_PIN);GPIO_ResetBits(I2C_GPIO_PORT, I2C_SDA_PIN);delay_us(5);GPIO_SetBits(I2C_GPIO_PORT, I2C_SCL_PIN);delay_us(5);GPIO_SetBits(I2C_GPIO_PORT, I2C_SDA_PIN);
}//************** 發送單bit **************
void send_bit(uchar bit_val) {if(bit_val) {GPIO_SetBits(I2C_GPIO_PORT, I2C_SDA_PIN);} else {GPIO_ResetBits(I2C_GPIO_PORT, I2C_SDA_PIN);}delay_us(2);GPIO_SetBits(I2C_GPIO_PORT, I2C_SCL_PIN);delay_us(5);  // SCL高電平≥4.0usGPIO_ResetBits(I2C_GPIO_PORT, I2C_SCL_PIN);delay_us(2);
}//************** 接收單bit **************
uchar receive_bit(void) {uchar bit_val;GPIO_SetBits(I2C_GPIO_PORT, I2C_SDA_PIN);  // 釋放SDA線delay_us(2);GPIO_SetBits(I2C_GPIO_PORT, I2C_SCL_PIN);delay_us(5);bit_val = GPIO_ReadInputDataBit(I2C_GPIO_PORT, I2C_SDA_PIN);GPIO_ResetBits(I2C_GPIO_PORT, I2C_SCL_PIN);delay_us(2);return bit_val;
}//************** 發送單字節 **************
//void tx_byte(uchar dat_byte) {
//    uchar i, n = Nack_counter;
//    
//TX_again:
//    for(i = 0; i < 8; i++) {
//        send_bit((dat_byte & 0x80) ? 1 : 0);
//        dat_byte <<= 1;
//    }
//    
//    if(receive_bit()) {  // 檢測NACK
//        stop_bit();
//        if(n--) {
//            start_bit();
//            goto TX_again;
//        }
//    }
//}uchar tx_byte(uchar dat_byte)
{for(uchar i = 0; i < 8; i++) {send_bit((dat_byte & 0x80) ? 1 : 0);dat_byte <<= 1;}return !receive_bit();  // 返回1=ACK, 0=NACK
}//************** 接收單字節 **************
uchar rx_byte(void) {uchar i, dat = 0;for(i = 0; i < 8; i++) {dat <<= 1;if(receive_bit()) dat |= 0x01;}send_bit(0);  // 發送ACKreturn dat;
}//************** 讀取溫度數據 **************
//uint memread(void) {
//    start_bit();
//    tx_byte(0x00);  // MLX90614地址+寫
//    tx_byte(0x07);  // 讀取RAM命令
//    
//    start_bit();
//    tx_byte(0xB5);  // MLX90614地址+讀
//    
//    DataL = rx_byte();
//    DataH = rx_byte();
//    Pecreg = rx_byte();
//    
//    stop_bit();
//    return (DataH << 8) | DataL;
//}
uint memread(void) {start_bit();if (!tx_byte(0xB4)) {  // 發送地址+寫stop_bit();return 0xFFFF;}if (!tx_byte(0x07)) {  // 發送命令(讀取RAM)stop_bit();return 0xFFFF;}start_bit();if (!tx_byte(0xB5)) {  // 發送地址+讀stop_bit();return 0xFFFF;}DataL = rx_byte();  // 低字節DataH = rx_byte();  // 高字節Pecreg = rx_byte(); // PEC(可選)stop_bit();return ((DataH << 8) | DataL)*0.02 - 273.15;
}//************** 主函數 **************
int main(void) {SystemInit();  // 系統時鐘配置為72MHzI2C_GPIO_Init();while(1) {temp = memread();// 此處添加溫度處理代碼delay_us(20000);  // 延時20ms}
}

使用方法:

①直接copy到自己的main.c

②下載到STM32F103C8T6板子上,并保持連接。根據下面代碼接線,供電3.3V

#define I2C_SCL_PIN ? ?GPIO_Pin_6
#define I2C_SDA_PIN ? ?GPIO_Pin_7
#define I2C_GPIO_PORT ?GPIOB

③使用debug模式查看數據,具體如下:

若點擊運行后temp數據不變,則需要進行下面這一步:

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

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

相關文章

tp5 php獲取農歷年月日干支甲午

# 切換為國內鏡像源 composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/# 再次嘗試安裝 composer require overtrue/chinese-calendar核心寫法一個農歷轉公歷&#xff0c;一個公歷轉農歷 農歷閏月可能被錯誤標記&#xff08;例如 閏四月 應表示…

Ubuntu搭建Conda+Python開發環境

目錄 一、環境說明 1、測試環境為ubuntu24.04.1 2、更新系統環境 3、安裝wget工具 4、下載miniconda安裝腳本 二、安裝步驟 1、安裝miniconda 2、source conda 3、驗證版本 4、配置pip源 三、conda用法 1、常用指令 一、環境說明 1、測試環境為ubuntu24.04.1 2、更…

Vscode+git筆記

1.U是untracked m是modify modified修改了的。 2.check out 查看觀察 3 status changed 暫存區 4.fetch v 取來拿來 5.orangion 起源代表遠程分支 git checkout就是可以理解為進入的意思。

模擬SIP終端向Freeswitch注冊用戶

1、簡介 使用go語言編寫一個程序&#xff0c;模擬SIP-T58終端在Freeswitch上注冊用戶 2、思路 以客戶端向服務端Freeswitch發起REGISTER請求&#xff0c;告知服務器當前的聯系地址構造SIP REGISTER請求 創建UDP連接&#xff0c;連接到Freeswitch的5060端口發送初始的REGISTER請…

DeepSeek實戰--LLM微調

1.為什么是微調 &#xff1f; 微調LLM&#xff08;Fine-tuning Large Language Models&#xff09; 是指基于預訓練好的大型語言模型&#xff08;如GPT、LLaMA、PaLM等&#xff09;&#xff0c;通過特定領域或任務的數據進一步訓練&#xff0c;使其適應具體需求的過程。它是將…

Docker與WSL2如何清理

文章目錄 Docker與WSL2如何清理一、docker占據磁盤空間核心原因分析1. WSL2 虛擬磁盤的動態擴展特性2. Docker 鏡像分層緩存與未清理資源 二、解決方案步驟 1&#xff1a;清理 Docker 未使用的資源步驟 2&#xff1a;手動壓縮 WSL2 虛擬磁盤1. 關閉 WSL2 和 Docker Desktop2. 定…

在 IDEA 中寫 Spark 程序:從入門到實踐

在大數據處理領域&#xff0c;Apache Spark 憑借其出色的性能和豐富的功能受到廣泛歡迎。而 IntelliJ IDEA 作為一款功能強大的 Java 集成開發環境&#xff0c;為編寫 Spark 程序提供了極大的便利。本文將詳細介紹如何在 IDEA 中搭建 Spark 開發環境并編寫運行 Spark 程序&…

Unity 使用 ADB 實時查看手機運行性能

Unity 使用 ADB 實時查看手機運行性能 前言操作步驟ADB工具下載ADB工具配置手機進入開發者模式并開啟USB調試使用ADB連接手機Unity打包設置使用Profiler實時查看性能情況優化建議 常見問題 前言 通過 ADB&#xff08;Android Debug Bridge&#xff09;連接安卓設備&#xff0c…

深入理解 HttpExchange_Java 中構建 HTTP 服務的基礎組件

1. 引言 1.1 Java 中的輕量級 HTTP 服務需求 隨著微服務、工具類應用和嵌入式系統的興起,開發者對輕量級 HTTP 服務的需求日益增長。相比引入龐大的框架(如 Spring Boot),使用 JDK 原生 API 構建 HTTP 服務成為一種快速、低依賴的替代方案。 JDK 提供了 com.sun.net.htt…

【RocketMQ NameServer】- NameServer 啟動源碼

文章目錄 1. 前言2. RocketMQ 通信架構3. NameServer 啟動流程3.1 創建 NameServerController3.2 啟動 NameServerController3.3 NamesrvController#initialize3.3.1 Netty 通信的整體流程3.3.2 創建 NettyRemotingServer 3.4 this.remotingServer.start()3.4.1 this.remotingS…

【算法題】荷蘭國旗問題[力扣75題顏色分類] - JAVA

一、題目 二、文字解釋 1.1 前言 本題是經典的「荷蘭國旗問題」&#xff0c;由計算機科學家 Edsger W. Dijkstra 首先提出。如同圖中所示的荷蘭國旗&#xff0c;其由紅、白、藍三色水平排列組成。在算法領域&#xff0c;該問題可類比為將一個由特定的三種元素&#xff08;可抽…

MySQL數據操作全攻略:DML增刪改與DQL高級查詢實戰指南

知識點4【MySQL的DDL】 DDL&#xff1a;主要管理數據庫、表、列等操作。 庫→表&#xff08;二維&#xff09;→列&#xff08;一維&#xff09; 數據表的第一行是 列名稱 數據庫是由一張或多張表組成 我們先學習在數據庫中創建數據表 0、常見的數據類型&#xff1a; 1、…

AtCoder AT_abc404_g [ABC404G] Specified Range Sums

前言 賽時想到了差分約束&#xff0c;隨手寫了個 SPFA 結果掛的很慘……還是太菜了&#xff0c;賽后 Bellman-Ford 又調了半天。 題目大意 給定整數 N , M N,M N,M 和長度為 M M M 的三個整數序列 L ( L 1 , L 2 , … , L M ) , R ( R 1 , R 2 , … , R M ) , S ( S 1…

如何基于HAL庫進行STM32開發

一、初識HAL庫 STM32 開發中常說的 HAL 庫開發&#xff0c;指的是利用 HAL 庫固件包里封裝好的 C 語言編寫的驅動文件&#xff0c;來實現對 STM32 內部和外圍設備的控制。但只有 HAL 庫還不能直接驅動一個 STM32 的芯片&#xff0c;其它的組件已經由 ARM 與眾多芯片硬件、軟件廠…

Qt:(創建項目)

目錄 1. 使?QtCreator新建項? 1.1 新建項? 1.2 選擇項?模板 1.3 選擇項?路徑 1.4 選擇構建系統 1.5 填寫類信息設置界? ?編輯 1.6 選擇語?和翻譯?件 1.6 選擇Qt套件 1.7 選擇版本控制系統 1.8 最終效果 1. 使?QtCreator新建項? 1.1 新建項? 打開Qt…

WPF之Slider控件詳解

文章目錄 1. 概述2. 基本屬性2.1 值范圍屬性2.2 滑動步長屬性2.3 刻度顯示屬性2.4 方向屬性2.5 選擇范圍屬性 3. 事件處理3.1 值變化事件3.2 滑塊拖動事件 4. 樣式和模板自定義4.1 基本樣式設置4.2 控件模板自定義 5. 數據綁定5.1 綁定到ViewModel5.2 同步多個控件 6. 實際應用…

mysql索引及數據庫引擎

順序io&#xff08;不需要每次都磁盤尋址&#xff0c;效率高&#xff09;&#xff0c;隨機io&#xff08;需要每次都磁盤尋址&#xff0c;效率低&#xff09; 如何正確的創建合適的索引&#xff1f; 索引是一種分散存儲的數據結構 磁盤io特性&#xff1a;每次交互是以頁為單位&…

網絡安全:sql注入練習靶場——sqli_labs安裝保姆級教程

網絡安全&#xff1a;sql注入練習靶場——sqli_labs安裝保姆級教程 前言 sqli-labs靶場是一個開源的sql注入練習的綜合靶場&#xff0c;包含大部分sql注入漏洞以及注入方式 網絡安全學習者可以通過在sqli-labs靶場練習提升對sql注入的理解&#xff0c;以及學習各種繞過姿勢。…

平臺介紹-開放API接口-鑒權

平臺的理念是一個組織內部只建一套系統。但是現實情況是&#xff0c;組織內部已經建立了很多系統&#xff0c;是不能一次性替代的&#xff0c;只能先搭起平臺&#xff0c;然后逐步開始替換。這樣就不可避免的存在其他系統和平臺進行交互的問題。 平臺為此設計了開放API接口。其…

多端定制系統開發:打造高效全平臺覆蓋的APP解決方案

在移動互聯網時代&#xff0c;用戶需求日益多樣化&#xff0c;企業若想觸達更廣泛的受眾&#xff0c;僅靠單一平臺的應用已遠遠不夠。無論是iOS、Android、Web端&#xff0c;還是智能手表、車載設備等新興終端&#xff0c;多端適配已成為企業數字化轉型的剛需。多端定制系統開發…