I2C集成電路總線

(摘要:空閑時,時鐘線數據線都是高電平,主機發送數據前,要在時鐘為高電平時,把數據線從高電平拉低,數據發送采取高位先行,時鐘線低電平時可以修改數據線,時鐘線高電平時要求數據線穩定,數據為8bit,發到第九個bit時,是應答位,另一個設備應答為低電平為ack,高電平為nack,結束通信,時鐘線高電平時,把數據線從低電平拉高。)

(主設備發送完起始信號,第一個字節是設備地址8bit,最后一位為0表示主機發數據,從機收數據,反之主收從發,所以設備可以有2^7個)

?e2prom芯片

IIC(Inter-Integrated Circuit)又稱I2C,是是IICBus簡稱,所以中文應該叫集成電路總線。是飛

利浦公司在1980年代為了讓主板、嵌入式系統或手機用以連接低速周邊設備而發展而來的一種同

步串行半雙工通信總線方式。該總線允許同時連接多個設備(芯片)。每塊芯片在總線上擁有特定的

地址。自2006年10月1日起,使用I2C協議已經不需要支付專利費,但制造商仍然需要付費以獲取

IIC從屬設備地址。

上圖所示是IIC的總線的使用場景,所有掛載在IIC總線上的設備都有兩根信號線,一根是數據線SDA,另一根是時鐘線SCL。這兩個信號線都是雙向的。作為一種通信方式, IIC總線在某一時刻,總線只允許有一個設備處于發送狀態,所發生的數據被總線上所有的設備所接收。 IIC通信協議包含有設備地址,只有發送方攜帶的地址與某個接收方的地址相同時,接收方才真正執行相關的指令.

IIC總線規定,設備在空閑時,兩根總線都處于高電平狀態。為保證這種狀態,數據線SDA和時鐘線SCL都要外接上拉電阻。 對于I.MX來說,這個上拉電阻也可以在引腳電器配置中設置。

IIC總線上連接的若干設備中,每次通信前,發送方首先發送一個“起始”信號,其實信號就是在SCL為高電平時, SDA發送一個低電平。當其它設備接收到這個其實信號后,將進行一次“總線仲裁”。意思就是設備(除發送起始信號的那個設備以外的)都將處于聆聽狀態。

IIC總線進行數據傳送時,時鐘線(SCL)上的信號為高電平期間,數據線(SDA)上的數據必須保持穩定。只有在時鐘線(SCL)上的信號為低電平期間,數據線(SCL)上的高電平或低電平狀態才允許變化。同時, SCL信號由數據啟動發送的設備提供。輸出到數據線(SDA)上的每個字節必須是8位。數據傳送時,先傳送最高位(MSB),后傳送最低位(LSB)

發送器每發送一個字節(8個bit),就在時鐘脈沖 9 期間釋放數據線,由接收器反饋一個應答信號。 主機SCL拉高,讀取從機SDA的電平。對于反饋有效應答位ACK的要求是:接收器在第9個時鐘脈沖之前的低電平期間將數據線SDA拉低,并且確保在該時鐘的高電平期間為穩定的低電平。

數據線(SDA)為低電平時,規定為有效應答位(ACK,簡稱應答位),表示接收器已經成功地接收了該字節。

數據線(SDA)為高電平時,規定為非應答位(NACK),表示接收器沒有成功接收該字節。

當發送方發送完最后一個bit后,需要發送一個結束標志來終止整個通信過程。當時鐘線SCL 為高電平時,數據線SDA 由低電平向高電平跳變。

上圖就是一個完整的IIC通信時序圖。

由于I2C總線是一種總線式連接方式,意味著在同樣的兩根線上可能連接有多個不同的設備,這種總線式連接方案通常會被設計為主從應答通信方式。也就是說,對于總線上連接的所有設備來說,有一個設備是主設備,而其他設備都是從設備。設備之間的通信都是由主設備發起的,從設備被動應答主設備。這里不難看出: 1、從設備之間是無法直接完成通信的; 2、總線上的從設備必須擁有一個獨一無二的標識,這個標識被稱為設備地址。設備地址類似一個人的名字,因為在I2C總線通信過程中,無論哪個設備發送數據,其他所有設備都能夠監聽得到,所以每次通信時,主設備先發送要訪問的子設備地址,每個子設備都把監聽到的這個地址拿來跟自己進行匹配,只有匹配成功的子設備才是真正需要操作的設備。

按照I2C標準,主設備發起通信時先發送一個起始信號,之后發送的第一個字節就是子設備的設備地址。需要注意的是。設備地址本身只占7個比特,最后一個比特所代表的是之后的數據流向。 0代表主發從收,通常描述為寫, 1表示從發主收,通常描述為讀。

例如,某個設備的從機地址為0x48(二進制0100 1000b),主機在發送完起始信號之后要發送要發送的從機地址其實是1001 000x,這里x就是數據流向位。如果x為0,表示接下來主機發送數據,從機接收數據,如果x為1,表示接下要求從機發送數據,主機接收數據

I.MX6ULL本身有四路I2C控制器,但是I.MX6ULL-Mini 開發板上只在I2C2控制器上連接了一個觸控裝置,用于檢測用戶點擊了屏幕的哪個位置。關于觸摸屏的操作我們之后再加以說明。而I2C1、 3、4控制器是空置的,我們可以用杜邦線連接我們需要接入的任意傳感器。這里我們在I2C1上連接兩個傳感器AT24C02和LM75為例,作為本次I2C實驗內容。

首先是AT24C02,這是一款EEPROM,是一種非易失性存儲器。同類型的芯片還有AT24C04,AT24C08,之間的區別僅僅是存儲大小不同。既然是一種存儲器,那么對其操作無外乎有兩種操作,讀取和寫入操作。這兩種操作又同時面臨了一個問題,讀取和寫入的位置。由于AT24C02有256個字節的空間,因此無論讀取還是寫入,都必須先告訴24C02讀取或者寫入的位置,即地址。因此,我們不難總結出對24C02的兩種操作流程,我們分別加以說明:

接下來討論從24C02中讀取數據,事實上讀取數據可以通過兩種不同的方式進行,第一種方式是主機先發送設備地址,然后再發送要讀取的位置地址。需要注意的是,雖然最終的目的是要從從機那里讀取數據,但是由于我們需要先把讀取的存儲地址發送給從機,因此發送設備地址時我們把數據流向設置為寫。發送完存儲地址之后,第一種做法是發送停止位,然后重新啟動通信,這次我們把發送設備地址時的數據流向設置為讀,然后就順序讀取若干字節

第一種方式。這種讀從機方式需要兩次通信才行。大多數情況下我們并不采用這種方式,而是采用第二種方式,形式于此類似,不同之處僅在于第一次通信之后不發停止位,而是立即重新發送從機地址并標記數據流向為讀:

上圖就是完整的第二種方式的時序,可見這種方式在發送完寫入地址之后并未結束通信,而是重新發送起始信號并改變數據流量,因此這種方式效率更高。需要注意的是,大多數I2C芯片都支持兩種方式,但是在讀取到最后一個字節的時候,注意必須回復NACK,否則可能會導致從機通信異常。

I.MX6U 提供了 4 個 I2C 外設,通過這四個 I2C 外設即可完成與 I2C 從器件進行通信I.MX6U的 I2C 支持兩種模式:標準模式和快速模式,標準模式下 I2C 數據傳輸速率最高是 100Kbits/s,在快速模式下數據傳輸速率最高為 400Kbits/s。

先介紹一下跟I2C相關的寄存器,首先看一下 I2Cx_IADR(x=1~4)寄存器,這是I2C 的地址寄存器, ADR(bit7:1)位有效,用來保存 I2C 從設備地址數據。當我們要訪問某個 I2C 從設備的時候就需要將其設備地址寫入到 ADR 里面。

寄存器 I2Cx_IFDR 也只有 IC(bit5:0)這個位,用來設置 I2C 的波特率, I2C 的時鐘源可以選擇IPG_CLK_ROOT=66MHz,通過設置 IC 位既可以得到想要的 I2C 波特率。需要注意的是不像其他外設的分頻設置一樣可以隨意設置,手冊第1464頁給出了I2Cx_IFDR[bit5:0]為不同的值時的分頻值。比如現在 I2C 的時鐘源為 66MHz,我們要設置I2C 的波特率為 100KHz,那么IC 就可以設置為 0X15,也就是 640 分頻。 66000000/640=103.125KHz≈100KHz。

寄存器 I2Cx_I2CR 的各位含義如下:

? IEN(bit7): I2C 使能位,為 1 的時候使能 I2C,為 0 的時候關閉 I2C;

? IIEN(bit6): I2C 中斷使能位,為 1 的時候使能 I2C 中斷,為 0 的時候關閉 I2C 中斷;

? MSTA(bit5):主從模式選擇位,設置 IIC 工作在主模式還是從模式,為 1 的時候工作在主模式,為 0的時候工作在從模式;

? MTX(bit4):傳輸方向選擇位,用來設置是進行發送還是接收,為 0 的時候是接收,為 1 的時候是發送;

? TXAK(bit3):傳輸應答位使能,為 0 的話發送 ACK 信號,為 1 的話發送 NO ACK 信號;

? RSTA(bit2):重復開始信號,為 1 的話產生一個重新開始信號。寄存器 I2Cx_I2SR 的各位含義如下:

? ICF(bit7):數據傳輸狀態位,為 0 的時候表示數據正在傳輸,為 1 的時候表示數據傳輸完成;

? IAAS(bit6):當為 1 的時候表示 I2Cx_IADR 寄存器中的地址是從設備地址。為0表示I2Cx_IADR是自己的地址;

IBB(bit5): I2C 總線忙標志位,當為 0 的時候表示 I2C 總線空閑,為 1 的時候表示 I2C 總線忙;

? IAL(bit4):仲裁丟失位,為 1 的時候表示發生仲裁丟失。仲裁丟失在手冊第1455頁有說明,如果多個設備同時嘗試連接總線,則其中一個成為主設備。硬件會立即將仲裁失敗的設備切換到Slave

Receive模式 。那么仲裁失敗的設備就會產生仲裁丟失,導致此位置位。需要理解的是這種情況一定發生在發送起始位的時候,也就是說在發送完起始位之后應該判斷此位是否為1;

? SRW(bit2):從機讀寫狀態位,當 I2C 作為從機的時候使用,此位用來表明主機發送給從機的是讀還是寫命令。為 0 的時候表示主機要向從機寫數據,為 1 的時候表示主機要從從機讀取數據;

? IIF(bit1): I2C 中斷掛起標志位,當為 1 的時候表示有中斷掛起,此位需要軟件清零;

? RXAK(bit0):應答信號標志位,無論作為主機還是從機,為 0 的時候表示接收到 ACK 應答信號,為1 的話表示檢測到 NO ACK 信號。

最后一個寄存器就是 I2Cx_I2DR,這是 I2C 的數據寄存器,此寄存器只有低 8 位有效,當要發送數據的時候將要發送的數據寫入到此寄存器,注意此時LSB代表的是數據流向,需要按照實際情況設置為1或者0;如果要接收數據的話直接讀取此寄存器即可得到接收到的數據。

本次實驗中我們通過 I.MX6ULL 的 I2C1 來寫AT24C02,為完成這個實驗,需要大家使用杜邦線外接AT24C02,如下圖,我們需要連接4根線:電源、地、 SCL和SDA。查閱AT24C02手冊可以看出24C02的供電電壓從1.8~5.5V之間,電壓越高速度越快,由于I.MX6ULL芯片本身供電是3.3V,所以我們接3.3V電源。查閱I.MX6ULL手冊可以看出,該芯片UART4_RX是可以復用I2C1_SDA的, UART4_TX是可以復用I2C1_SCL的,因此24C02的SCL接43號針腳, SDA接SDA針腳。

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

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

相關文章

為了安全應該使用非root用戶啟動nginx

nginx基線安全,修復步驟。主要是由于使用了root用戶啟動nginx。為了安全應該使用非root用戶啟動nginx一、檢查項和問題檢查項分類檢查項名稱身份鑒別檢查是否配置Nginx賬號鎖定策略。服務配置檢查Nginx進程啟動賬號。服務配置Nginx后端服務指定的Header隱藏狀態服務…

論文解析篇 | YOLOv12:以注意力機制為核心的實時目標檢測算法

前言:Hello大家好,我是小哥談。長期以來,改進YOLO框架的網絡架構一直至關重要,但盡管注意力機制在建模能力方面已被證明具有優越性,相關改進仍主要集中在基于卷積神經網絡(CNN)的方法上。這是因…

學習C++、QT---20(C++的常用的4種信號與槽、自定義信號與槽的講解)

每日一言相信自己,你比想象中更接近成功,繼續勇往直前吧!那么我們開始用這4種方法進行信號與槽的通信第一種信號與槽的綁定方式我們將按鍵右鍵后轉到槽會自動跳轉到這個widget.h文件里面并自動生成了定義,我們要記住我們這個按鈕叫…

Anolis OS 23 架構支持家族新成員:Anolis OS 23.3 版本及 RISC-V 預覽版發布

自 Anolis OS 23 版本發布之始,龍蜥社區就一直致力于探索同源異構的發行版能力,從 Anolis OS 23.1 版本支持龍芯架構同源異構開始,社區就在持續不斷地尋找更多的異構可能性。 RISC-V 作為開放、模塊化、可擴展的指令集架構,正成為…

4萬億英偉達,憑什么?

CUDA正是英偉達所有神話的起點。它不是一個產品,而是一個生態系統。當越多的開發者使用CUDA,就會催生越多的基于CUDA的應用程序和框架;這些殺手級應用又會吸引更多的用戶和開發者投身于CUDA生態。這個正向飛輪一旦轉動起來,其產生…

Unity3D iOS閃退問題解決方案

前言 在Unity3D開發中解決iOS閃退問題需要系統性排查,以下是關鍵步驟和解決方案: 對惹,這里有一個游戲開發交流小組,希望大家可以點擊進來一起交流一下開發經驗呀! 1. 獲取崩潰日志(關鍵第一步&#xff…

嵌入式八股文之 GPIO

1. GPIO 的基本概念(1) 什么是 GPIO?GPIO 的中文意思是通用輸入輸出端口(General Purpose Input/Output),是嵌入式系統中可編程控制的通用引腳,可通過軟件配置為輸入或輸出模式。(背誦)(2) 它的…

Umi-OCR 的 Docker安裝(win制作鏡像,Linux(Ubuntu Server 22.04)離線部署)

前置博客:Ubuntu-Server 22.04.4 詳細安裝圖文教程 wget命令在windows終端下不能使用的原因及解決辦法 在 Ubuntu 22.04 LTS 上離線安裝 Docker 手把手教你在Win11下安裝docker Umi-OCR 安裝docker時報錯:workstation服務啟動報錯。錯誤1075&#…

力扣242.有效的字母異位詞

給定兩個字符串 s 和 t &#xff0c;編寫一個函數來判斷 t 是否是 s 的 字母異位詞。示例 1:輸入: s "anagram", t "nagaram" 輸出: true示例 2:輸入: s "rat", t "car" 輸出: false提示:1 < s.length, t.length < 5 * 104s…

基于Springboot+UniApp+Ai實現模擬面試小工具二:后端項目搭建

本節介紹本項目后端項目的開發工具及基礎項目的搭建&#xff0c;包括開發工具介紹及后端項目的創建和依賴框架的引入及對應配置。 源碼下載&#xff1a; 點擊下載 講解視頻&#xff1a; UniappSpringbootKimi實現模擬面試小程序-Springboot項目創建一&#xff0e;開發工具 1.…

Linux711 Mysql

模版 root192.168.235.130s password:┌──────────────────────────────────────────────────────────────────────┐│ ? MobaXterm Personal Edition v23.2 ? ││…

QT 秘鑰生成工具

該項目是注冊機和驗證機項目&#xff0c;分別是密鑰生成工具&#xff0c;和密鑰驗證demo,可以識別電腦唯一標識碼。#include "frmmain.h" #include "ui_frmmain.h" #include "qmessagebox.h" #include "qfile.h" #pragma execution_ch…

PyTorch神經網絡訓練全流程詳解:從線性層到參數優化

目錄 一、神經網絡訓練的核心組件 二、代碼逐行解析與知識點 三、核心組件詳解 3.1 線性層(nn.Linear) 3.2 損失函數(nn.MSELoss) 3.3 優化器(optim.SGD) 四、訓練流程詳解 五、實際應用建議 六、完整訓練循環示例 七、總結 在深度學習實踐中&#xff0c;理解神經網絡…

從代碼學習深度學習 - 針對序列級和詞元級應用微調BERT PyTorch版

文章目錄 前言針對序列級和詞元級應用微調BERT單文本分類文本對分類或回歸文本標注問答總結前言 在自然語言處理(NLP)的廣闊天地里,預訓練模型(Pre-trained Models)的出現無疑是一場革命。它們如同站在巨人肩膀上的探索者,使得我們能夠利用在大規模文本語料上學到的豐富…

學習筆記丨卷積神經網絡(CNN):原理剖析與多領域Github應用

本文深入剖析了卷積神經網絡&#xff08;CNN&#xff09;的核心原理&#xff0c;并探討其在計算機視覺、圖像處理及信號處理等領域的廣泛應用。下面就是本篇博客的全部內容&#xff01;&#xff08;內附相關GitHub數據庫鏈接&#xff09; 目錄 一、什么是CNN&#xff1f; 二、…

cnpm exec v.s. npx

1. 核心定位與設計目標 npx (Node Package Executor): 定位: Node.js 內置工具&#xff08;npm 5.2 起捆綁&#xff09;&#xff0c;核心目標是便捷地執行本地或遠程 npm 包中的命令&#xff0c;無需全局安裝。核心價值: 避免全局污染&#xff1a; 臨時使用某個 CLI 工具&#…

我花10個小時,寫出了小白也能看懂的數倉搭建方案

目錄 一、什么是數據倉庫 1.面向主題 2.集成 3.相對穩定 4.反映歷史變化 二、數倉搭建的優勢 1.性能 2.成本 3.效率 4.質量 三、數倉搭建要考慮的角度 1.需求 2.技術路徑 3.數據路徑 4.BI應用路徑 四、如何進行數倉搭建 1.ODS層 2.DW層 3.DM層 五、寫在最后…

OBB旋轉框檢測配置與訓練全流程(基于 DOTA8 數據集)

&#x1f680; YOLO交通標志識別實戰&#xff08;五&#xff09;&#xff1a;OBB旋轉框檢測配置與訓練全流程&#xff08;基于 DOTA8 數據集&#xff09; 在專欄前面四篇里&#xff0c;我們完成了&#xff1a; ? Kaggle交通標志數據集下載并重組標準YOLO格式 ? 訓練/驗證集拆…

uniapp制作一個視頻播放頁面

1.產品展示2.頁面功能(1)點擊上方按鈕實現頁面跳轉&#xff1b;(2)點擊相關視頻實現視頻播放。3.uniapp代碼<template><view class"container"><!-- 頂部分類文字 --><view class"categories"><navigator class"category-…

8.卷積神經網絡基礎

8.1 卷積核計算 import torch from torch import nn import matplotlib.pyplot as plt def corr2d(X,k):#計算二維互相關運算h,wk.shape#卷積核的長和寬Ytorch.zeros((X.shape[0]-h1,X.shape[1]-w1))#創建(X-H1,X-W1)的全零矩陣for i in range(Y.shape[0]):for j in range(Y.s…