利用開漏輸出模式模擬IIC

/************************************************************
利用IO口模擬IIC時序,需要使用2個IO口(SDA和SCL)

?? ?SCL時鐘線只能由主器件進行控制,所以SCL引腳必須為輸出模式
SDA數據線,在主器件發送數據時,SDA引腳為輸出模式
SDA數據線,在主器件接收數據時,SDA引腳為輸入模式

************************************************************/

//配置SCL——》PB6,PB7的引腳設置
#define ?SDA_SET(n) ?(n)?(GPIO_SetBits(GPIOB,GPIO_Pin_7)):(GPIO_ResetBits(GPIOB,GPIO_Pin_7))?
#define ?SCL_SET(n) ?(n)?(GPIO_SetBits(GPIOB,GPIO_Pin_6)) : (GPIO_ResetBits(GPIOB,GPIO_Pin_6))?
#define ?SDA_READ ? ?GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7)
void IIC_SCLConfig(void)
{
//打開GPIOA時鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitTypeDef GPIO_InitStructure = {0};//定義結構體GPIO外設結構體變量

?? ??? ?GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7; //配置引腳
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;?
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; //推挽模式
GPIO_Init(GPIOB, &GPIO_InitStructure);
}?

//配置IIC_Config初始化
void IIC_Config(void)
{
IIC_SCLConfig();

?? ?//開始期間SDA 與SCL都空閑狀態是高電平
SDA_SET(1);
SCL_SET(1);
Delay_nus(5);
}

//IIC的開始信號
void IIC_Start(void)
{
//2.確保SDA與SCL空閑處于高電平
SDA_SET(1);
SCL_SET(1);
Delay_nus(5);
//3.SDA電平拉低
SDA_SET(0);
Delay_nus(5);
//4.把SCL引腳電平拉底此時,此時準備數據
SCL_SET(0);
Delay_nus(5);
}

//IIC的發送字節 ?
//由于:開始-->發送字節-->等待應答-->發送字節所以第一步不能少
void IIC_SendByte(uint8_t Byte)
{
//2.把SCL引腳電平拉底此時,此時準備數據
SCL_SET(0);
Delay_nus(5);
//3.此時準備數據
for(uint8_t i = 0;i < 8;i++)
{
//4.判斷最高位是0或者是1
if(Byte & 0x80)
{
SDA_SET(1);
}
else
{
SDA_SET(0);
}
Byte <<= 1;
Delay_nus(5);
//5.此時SCL引腳電平拉高,從機接收數據
SCL_SET(1);
Delay_nus(5);
//6.把SCL引腳電平拉底此時,此時準備數據
SCL_SET(0);
Delay_nus(5);
}
}
//判斷是否從機應答
uint8_t IIC_SlaveACK(void)
{
uint8_t data = 0;
SDA_SET(1);//主機釋放SDA,讓從機對SDA進行控制
//2.把SCL引腳電平拉低,此時第九個脈沖的低電平,此時從機準備Bit
SCL_SET(0);
Delay_nus(5);
//3.把SCL引腳電平拉高,此時第九個脈沖高電平到來
SCL_SET(1);
Delay_nus(5);
//4.主機讀取狀態 1:表示未應答 ? 0:表示已應答
if(SDA_READ)
{
data = 1;
}
else
{
data = 0;
}
//5.把SCL引腳電平拉低,此時第九個脈沖的結束
SCL_SET(0);
Delay_nus(5);
return data;
}
//IIC讀取數據
uint8_t IIC_ReadData(void)
{
uint8_t data = 0;?
SCL_SET(0);
//主機釋放SDA,讓從機對SDA進行控制
SDA_SET(1);
//3.主機循環八次讀取數據
for(uint8_t i = 0;i < 8;i++)
{
//2.把SCL引腳拉低,此時從機準備數據
SCL_SET(0);
Delay_nus(5);
//4.把SCL電平拉高8bit,此時主機讀取bit
SCL_SET(1);
Delay_nus(5);
//5.主機讀取bit
data <<= 1;
data |= SDA_READ;
//Delay_nus(5);

}
//?? ?//6.把SCL引腳電平拉低,此時準備數據
//?? ?SCL_SET(0);
//?? ?Delay_nus(5);
return data;
}

//主機應答 ?ACK = 1 表示不應答 ? ACK = 0表示應答
void IIC_MasterACK(uint8_t Ack)
{

?? ?//2.把SCL引腳電平拉低,此時主機準備應答
SCL_SET(0);
Delay_nus(5);
//3.判斷主機是否應答 1:表示未應答 ? 0:表示已應答
if(Ack)
{
SDA_SET(1);
}
else
{
SDA_SET(0);
}

?? ?//4.把SCL引腳電平拉高,從機讀取應答
SCL_SET(1);
Delay_nus(5);
//5.把SCL引腳電平拉低
SCL_SET(0);
Delay_nus(5);

}
//停止位

void IIC_Stop(void)
{
//1.SDA配置為輸出模式
//?? ?IIC_SDAConfig(GPIO_Mode_Out_OD);
//2.確保SDA與SCL都為低電平
SDA_SET(0);
SCL_SET(0);
Delay_nus(5);
//3.SCL電平拉高
SCL_SET(1);
Delay_nus(5);
//4.SDA電平拉高
SDA_SET(1);
Delay_nus(5);
}

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

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

相關文章

閘機控制系統從設計到實現全解析:第 5 篇:RabbitMQ 消息隊列與閘機通信設計

第 5 篇&#xff1a;RabbitMQ 消息隊列與閘機通信設計RabbitMQ 是一款開源的消息隊列中間件&#xff08;Message Queue&#xff0c;MQ&#xff09;&#xff0c;基于 Erlang 語言開發&#xff0c;遵循 AMQP&#xff08;Advanced Message Queuing Protocol&#xff0c;高級消息隊…

Linux 常用命令大全:覆蓋日常 99% 操作需求

1、基本命令 pwd&#xff1a;顯示當前工作目錄的絕對路徑&#xff0c;例如在復雜目錄結構中快速確認位置&#xff0c;執行后會輸出類似/home/user/documents的結果。 cd&#xff1a;切換目錄&#xff0c;cd 目錄路徑可進入指定目錄&#xff0c;cd ~回到當前用戶的家目錄&…

普通電腦與云電腦的區別有哪些?全面科普

近年來&#xff0c;越來越多的人不再購置升級自己的電腦&#xff0c;轉而選擇云電腦&#xff0c;云端產品正在變得越來越普及易用。那么它究竟跟我們的普通本地設備有什么區別吶&#xff1f;或許很多人并不知悉&#xff0c;對此&#xff0c;本篇內容小編就為大家簡要科普一下普…

【Python】支持向量機SVM

示例代碼&#xff1a;import numpy as np import matplotlib.pyplot as plt from sklearn import svm from sklearn.datasets import make_blobs from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score, classification_report# 設…

當AI學會“抄近路”:殘差網絡如何突破深度學習的極限

**——解讀《Deep Residual Learning for Image Recognition》**今天我想帶大家回到2015年&#xff0c;見證人工智能領域的一場“捷徑革命”——由何愷明等人提出的**深度殘差學習框架&#xff08;ResNet&#xff09;**。這篇論文解決了困擾AI界多年的“深度詛咒”&#xff0c;…

HCIP--BGP綜合實驗

目錄 BGP綜合實驗報告 一、實驗拓撲 二、實驗要求 三、實驗思路 &#xff08;一&#xff09;IP地址規劃 &#xff08;二&#xff09;整體思路 四、實驗步驟 &#xff08;一&#xff09; IP地址配置 &#xff08;二&#xff09; AS2內部配置OSPF協議 &#xff08;三&a…

Java 基礎編程案例:從輸入交互到邏輯處理

在Java編程學習中&#xff0c;輸入輸出、循環控制和邏輯判斷是核心基礎。本文整理了10個經典案例&#xff0c;涵蓋Scanner輸入處理、斐波那契數列、成績統計、登錄驗證等場景&#xff0c;幫助初學者掌握編程邏輯與實用技巧。 一、Scanner輸入交互&#xff1a;獲取用戶輸入并處理…

LeetCode 面試經典 150_數組/字符串_整數轉羅馬數字(18_12_C++_中等)(模擬)(對各位進行拆解)

LeetCode 面試經典 150_數組/字符串_整數轉羅馬數字&#xff08;18_12_C_中等&#xff09;題目描述&#xff1a;輸入輸出樣例&#xff1a;題解&#xff1a;解題思路&#xff1a;思路一&#xff08;模擬&#xff09;&#xff1a;思路二&#xff08;對各位進行拆解&#xff09;&a…

計算機網絡摘星題庫800題筆記 第6章 應用層

第6章 應用層 6.1 網絡應用的架構 考點 1 CS 架構 題組闖關 1.DNS 是基于 ( ) 模式的分布式系統。 A. C/S B. B/S C. P2P D. 以上均不正確 1.【參考答案】A 【解析】本題考查網絡應用模型。 DNS 作為分布式應用&#xff0c;是一種典型的 C/S 模式&#xff0c;是隨著 Internet 技…

BLUCK電路的輸入電容應該怎么選取

借用TI的BULK芯片討論一下輸入電容怎么選取的問題&#xff0c;BULK電源是我們常用的電源&#xff0c;它的原理請看之前的文章&#xff1a; 高壓差為何不用LDO&#xff1f;DCDC效率更高&#xff01;-CSDN博客 本文我們探討一下輸入電容&#xff0c;輸入電容是控制紋波的關鍵&a…

CAN仲裁機制的原理

我們來詳細講 CAN 仲裁機制 的原理和工作方式,這是 CAN 總線最核心的特性之一。 1?? 基本概念 CAN 總線是 多主機、多節點的串行總線,所有節點共享一根差分信號線(CAN_H / CAN_L)。 每個節點都可以隨時發送消息(多主機機制) 總線只能同時有一個節點成功發送 仲裁 用…

【GPT入門】第46課 vllm安裝、部署與使用

【GPT入門】第46課 vllm安裝、部署與使用 1.準備服務器 2. 安裝 conda環境,隔離base環境 3. vllm使用 3.1 在線推理, openai兼容服務器 3.2 模型離線調用 4. 沒有使用GPU問題分析 1.準備服務器 cuda 版本選12.1 vllm官網介紹: https://vllm.hyper.ai/docs/getting-started/…

【從網絡基礎到實戰】理解TCP/IP協議體系的核心要點(包含ARP協議等其他協議介紹)

前言&#xff1a; 學習計算機網絡不僅是軟件開發的基礎功&#xff0c;更是成為一名合格后端工程師、網絡工程師的重要門檻。本文將基于 TCP/IP 協議體系&#xff0c;系統梳理網絡層、數據鏈路層、以及相關協議的核心知識&#xff0c;并結合實際案例與代碼示例幫助理解。一、網絡…

Python 元類基礎:從理解到應用的深度解析

在 Python 的高級編程中&#xff0c;元類&#xff08;metaclass&#xff09; 無疑是最神秘又最強大的特性之一。它不僅是構建類的“工廠”&#xff0c;更是 Python 靈活對象模型的體現。本文將帶你從基礎概念入手&#xff0c;深入理解元類的本質、工作機制以及實際應用&#xf…

Nginx 配置代理服務器的詳細方法

一、什么是代理服務器&#xff1f; 類型說明正向代理客戶端通過代理訪問目標服務器&#xff08;隱藏客戶端身份&#xff09;反向代理客戶端訪問代理服務器&#xff0c;由代理服務器請求后端服務器&#xff08;隱藏后端服務器&#xff09; 二、Nginx 反向代理配置方法&#xff…

Lombok插件介紹及安裝(Eclipse)

一、Lombok 的用途 Lombok是一個 Java 庫&#xff0c;通過注解的方式簡化 Java 代碼的編寫。它能夠自動生成常見的代碼&#xff0c;如getter、setter、toString、equals、hashCode等方法&#xff0c;從而減少樣板代碼&#xff0c;使代碼更加簡潔、易讀。 Lombok 通過添加**Dat…

硬核操作!Go 語言生成 “會爬墻的清潔機器人”,玻璃外墻自己擦

本文聚焦于利用 Go 語言開發 “會爬墻的清潔機器人” 這一硬核技術&#xff0c;圍繞該機器人如何實現玻璃外墻自主清潔展開。首先介紹開發背景與需求&#xff0c;接著闡述 Go 語言在其中的優勢&#xff0c;詳細講解機器人的核心技術&#xff0c;包括吸附系統、運動控制、清潔機…

Qt——實現”Hello World“、認識對象樹與Qt坐標系

在創建項目時&#xff0c;使用的基類Base Class為QWidget 1. 使用圖形化界面的方式實現“Hello World” 雙擊文件&#xff1a;widget.ui&#xff0c;進入designer模式&#xff1a;在“控件盒子”的“Display Widgets”中找到“Label”&#xff0c;并拖放到白板中雙擊剛剛拖放到…

智能合約開發全流程實戰指南

目錄 靈感探索與概念驗證合約開發常見問題 Hardhat 初始化項目問題合約編譯錯誤處理智能合約設計缺陷 合約測試最佳實踐 單元測試環境配置測試用例編寫技巧測試覆蓋率和策略常見測試失敗原因 合約部署實戰指南 部署到不同網絡部署前準備事項部署后驗證方法部署費用和Gas優化 合…

IPA1299至為芯替代TI ADS1299的腦機接口芯片

在腦機接口、神經科學研究和醫療電子設備領域&#xff0c;腦電信號采集芯片是連接生物電信號與數字世界的重要組件。目前&#xff0c;TI等國際廠商憑借技術優勢占據市場主要份額&#xff0c;國內廠商在成本控制、供貨周期和技術自主性方面面臨挑戰。英集芯推出的IPA1299低噪聲多…