步驟1:什么是I2C-1
I2C(內(nèi)部集成電路總線),最初是由Phillips(現(xiàn)為NXP Semiconductor)開發(fā)的,并且通常由Atmel和其他有條件的公司稱為TWI(兩線接口) 兩線式同步串行總線是我們不想涉及的商標(biāo)問題。讓我們看一下每個(gè)單詞的含義:
兩根線-這很簡(jiǎn)單,I2C使用兩根線(當(dāng)然,除了地線?。?,它們被稱為 SDA (串行數(shù)據(jù))和 SCL (串行時(shí)鐘)。它們以漏極開路配置進(jìn)行接線,這意味著所有連接設(shè)備的輸出不能直接輸出邏輯電平1(高電平),而只能拉低(接地),輸出低電平。 0)。為了使線路變高,所有設(shè)備都釋放其對(duì)線路的拉力,并在線路和正軌之間的上拉電阻器將電壓上拉。好的上拉電阻應(yīng)為 1-10K歐姆,該電阻應(yīng)足夠低,以至于所有設(shè)備都可以將信號(hào)視為高電平,但又足夠高,可以很容易地將其短路(拉低),而不會(huì)導(dǎo)致?lián)p壞或大量用電。 SDA上有一個(gè)上拉電阻,SCL上有一個(gè)上拉電阻。
同步-這意味著數(shù)據(jù)傳輸通過存在于所有連接的時(shí)鐘信號(hào)進(jìn)行同步設(shè)備。這是由主機(jī)生成的。相比之下,異步串行系統(tǒng)沒有時(shí)鐘信號(hào)。相反,它使用預(yù)定的時(shí)基或波特率。異步串行的一個(gè)示例是RS-232(許多計(jì)算機(jī)上的通用串行端口)。
串行-串行傳輸?shù)臄?shù)據(jù)表示一次通過一根電線傳輸一位數(shù)據(jù)。相比之下,并行數(shù)據(jù)傳輸有多條導(dǎo)線,每條導(dǎo)線都包含一個(gè)位,所有這些導(dǎo)線都被一次采樣以并行傳輸多個(gè)位。
總線-總線是一種允許許多設(shè)備執(zhí)行以下操作的系統(tǒng):通過單條電線相互通信。盡管可以將其稱為總線,但是USB在硬件級(jí)別上并不是真正的總線,因?yàn)檫B接多個(gè)設(shè)備需要集線器。諸如I2C之類的總線允許簡(jiǎn)單地通過將它們的SDA和SCL連接連接到現(xiàn)有線路來添加新設(shè)備??偩€(I2C,USB,PCI等)均使用尋址系統(tǒng),其中每個(gè)設(shè)備都具有唯一地址。在這種情況下,地址只是一個(gè)二進(jìn)制數(shù),到該設(shè)備的所有消息都必須使用該地址發(fā)送。
步驟2:什么是I2C-2
在I2C總線上,有主機(jī)和從機(jī)。主機(jī)啟動(dòng)連接,而從機(jī)必須等待主機(jī)尋址才能發(fā)送或接收任何內(nèi)容。 I2C具有多主機(jī)功能,這意味著可能存在多個(gè)主機(jī),并且如果兩個(gè)主機(jī)同時(shí)嘗試傳輸,則它們必須執(zhí)行仲裁以糾正問題。本教程不會(huì)介紹多主機(jī)配置,但應(yīng)注意它們確實(shí)存在。
主機(jī)可以請(qǐng)求從主機(jī)發(fā)送或接收數(shù)據(jù)。在發(fā)送期間,主機(jī)將數(shù)據(jù)寫入總線,而從機(jī)則從總線讀取數(shù)據(jù)并將其存儲(chǔ)在其內(nèi)存中。在接收期間,主機(jī)讀取總線上從機(jī)發(fā)送的數(shù)據(jù)。在這兩種情況下,主設(shè)備都會(huì)在SCK上提供時(shí)鐘信號(hào)。
在I2C總線上傳輸?shù)拿總€(gè)字節(jié)(即8位)的末尾,接收設(shè)備必須提供一個(gè)確認(rèn)(ACK)。唯一不會(huì)發(fā)生這種情況的時(shí)間是主機(jī)從從機(jī)接收數(shù)據(jù)時(shí),主機(jī)會(huì)以不確認(rèn)(NACK或NAK)結(jié)束傳輸,指示從機(jī)應(yīng)停止發(fā)送數(shù)據(jù)。 ACK由低(下拉或0)狀態(tài)表示,而NACK由高(下拉或1)狀態(tài)表示。由于總線的默認(rèn)狀態(tài)為高,因此ACK確認(rèn)存在另一個(gè)設(shè)備并已成功處理了傳輸。
除了ACK和NACK之外,I2C還具有兩個(gè)另外的成幀條件,稱為起始條件和停止條件。主機(jī)發(fā)送開始條件以指示傳輸開始。在開始轉(zhuǎn)換期間,SDA線首先從高電平轉(zhuǎn)換為低電平,然后在一段明顯的時(shí)間后,SCL執(zhí)行相同的操作。主機(jī)在傳輸結(jié)束時(shí)發(fā)出的停止條件是相反的。首先,SCL線從低變高,然后,SDA執(zhí)行相同的操作。請(qǐng)注意,當(dāng)總線不活動(dòng)時(shí),SDA和SCL線都為高電平。
I2C傳輸中的第一個(gè)字節(jié)是地址字節(jié)。這是由主機(jī)發(fā)送的,用于確定與哪個(gè)從機(jī)通信以及是否執(zhí)行發(fā)送或接收(分別稱為寫和讀)。從機(jī)地址是7位長(zhǎng),并且有幾個(gè)保留地址。這樣的保留地址之一是0x00,通常被認(rèn)為是全局寫入(寫入所有從站)。通常,您可以通過將地址選擇引腳連接到高電平或低電平來配置從設(shè)備的地址,盡管在微控制器上可以像在ATTiny2313上那樣通過編程方式設(shè)置地址。地址字節(jié)的最低有效位是“讀/寫”位,它指示執(zhí)行讀還是寫操作。如果為1,則該操作為讀取,如果為0,則為寫入。
步驟3:什么是I2C-3
基本上涵蓋了I2C協(xié)議本身,因?yàn)橹鳈C(jī)可以啟動(dòng)讀取或?qū)懭?,然后繼續(xù)傳輸,直到主機(jī)發(fā)送停止條件為止。當(dāng)主機(jī)從從機(jī)讀取數(shù)據(jù)時(shí),它將在停止條件之前在最后一個(gè)字節(jié)上發(fā)出NACK而不是ACK,以指示已完成接收。從這里開始,通過正確的實(shí)施,您可以與所需的所有設(shè)備進(jìn)行通信。但是,我還需要指出一件事,因?yàn)樗?jīng)常使用。
在某些I2C設(shè)備上(或者我應(yīng)該說最多,這很常見),訪問協(xié)議設(shè)置為注冊(cè)銀行。要從這些寄存器讀取或?qū)懭耄仨毷紫染帉懸粋€(gè)內(nèi)部地址,該地址是您希望讀取或?qū)懭氲募拇嫫鞯牡刂?。寫入?nèi)部地址后,您可以讀取或?qū)懭攵鄠€(gè)字節(jié),并且內(nèi)部地址將隨每個(gè)字節(jié)遞增。這是幾乎所有I2C存儲(chǔ)設(shè)備以及大多數(shù)傳感器和I/O擴(kuò)展器的首選協(xié)議。雖然可能有一個(gè)不遵循寄存器組協(xié)議的協(xié)議,但絕大多數(shù)設(shè)備都遵循該協(xié)議,并且圍繞它構(gòu)建了許多I2C工具。因此,值得指出。這也是我將在ATTiny2313上實(shí)現(xiàn)的協(xié)議。
如前所述,在讀取或?qū)懭肴魏渭拇嫫髦?,您必須發(fā)送設(shè)備內(nèi)部地址,這是通過執(zhí)行以下操作來完成的:一個(gè)字節(jié),其中包含內(nèi)部地址。對(duì)于寫操作,傳輸可以繼續(xù)進(jìn)行數(shù)據(jù)值,數(shù)據(jù)值中的第一個(gè)將存儲(chǔ)在所需的地址中,并且任何其他字節(jié)每次都將遞增一個(gè)。對(duì)于讀取,主機(jī)將發(fā)送停止條件,然后開始新的傳輸以進(jìn)行讀取。這是因?yàn)槟荒茉谕粋鬏斨型瑫r(shí)進(jìn)行寫操作和讀操作。在某些情況下,可以發(fā)送重復(fù)開始而不是先停止再開始。 重復(fù)開始是SCL為高時(shí)SDA上的從高到低過渡。
步驟4:ATTiny USI I2C代碼實(shí)現(xiàn)-概述
在本教程的這一點(diǎn)上,您至少應(yīng)該基本熟悉I2C協(xié)議?,F(xiàn)在,我將詳細(xì)介紹ATTiny USI硬件的實(shí)際I2C協(xié)議實(shí)現(xiàn)。
為此,本步驟主要圖片中顯示的板是定制的單極步進(jìn)電機(jī)控制器,我將其設(shè)計(jì)為自己的一部分。今年春季的高級(jí)項(xiàng)目。該板能夠以PWM,可變速度和三種不同的步進(jìn)模式(單步,功率步進(jìn)和半步)驅(qū)動(dòng)單個(gè)單極步進(jìn)電機(jī)。它也可以突發(fā)運(yùn)行,因?yàn)榭刂破鲗H以給定的步數(shù)運(yùn)行電動(dòng)機(jī)。對(duì)于連續(xù)操作,步進(jìn)計(jì)數(shù)器必須在其達(dá)到零之前通過驅(qū)動(dòng)板的任何東西重新加載。這對(duì)本教程來說都不重要。
這里的重要部分是這些板提供動(dòng)力的機(jī)器人具有三個(gè)輪子(全向輪子,以三角形模式排列)。我想構(gòu)建三個(gè)相同的板,但僅使用機(jī)器人主計(jì)算機(jī)(筆記本電腦)中的單個(gè)RS-232串行接口來控制全部三個(gè)。我想到的想法是使用串行端口連接計(jì)算機(jī)接口和I2C總線來連接所有三個(gè)板。在此設(shè)置中,連接到PC的板除了充當(dāng)從節(jié)點(diǎn)之外,還承擔(dān)著主角色。然后,PC將I2C格式的消息發(fā)送到總線上,以使這三塊板得以運(yùn)行。
對(duì)于此任務(wù),我的板將必須支持兩種 I2C模式,并且必須能夠同時(shí)使用 slave 和 master ,具體取決于串行端口的操作。一般而言,我對(duì)USI硬件了解甚少,而對(duì)I2C協(xié)議了解甚少,因此我著手掌握I2C協(xié)議,使其成為我的從屬設(shè)備并命令它進(jìn)行數(shù)據(jù)傳輸。而且我做到了,并且在該項(xiàng)目中效果很好。
直到我至少擁有Raspberry Pi為止,因?yàn)楫?dāng)我終于開始玩Pi時(shí),我嘗試將I2C電機(jī)板連接到其I2C端口以嘗試使用Pi驅(qū)動(dòng)的機(jī)器人。不幸的是,無論我發(fā)送了什么命令,Pi都無法進(jìn)行通信。由于我從未在自己的主代碼與自己的從代碼進(jìn)行對(duì)話之外驗(yàn)證過協(xié)議,因此我認(rèn)為自己并不是在正確地實(shí)現(xiàn)協(xié)議,因此坐下來使其全部正常工作。我做到了,新代碼更加精簡(jiǎn),井井有條,而且易于理解(任何想學(xué)習(xí)的人都贊不絕口!)。由于進(jìn)入I2C世界的旅程很艱難,因此我決定在此處發(fā)布消息,以供所有人查看,并盡我所能詳細(xì)說明I2C的功能。
在接下來的幾步中,我將討論USI硬件及其作為主機(jī)和從機(jī)的工作方式。我還附加了我的USI代碼文件。我希望人們擁有良好的USI實(shí)現(xiàn),也希望他們閱讀它的工作原理,確切地了解發(fā)生的情況對(duì)于處理復(fù)雜的低級(jí)系統(tǒng)至關(guān)重要,因此,我對(duì)文件進(jìn)行了完整的評(píng)論。
步驟5:ATTiny USI I2C代碼實(shí)現(xiàn)-USI硬件
因此,在看代碼之前,讓我們看一下數(shù)據(jù)表即可。具體來說,我正在查看ATTiny2313數(shù)據(jù)表,因?yàn)檫@是我使用的芯片,但是在許多不同的ATTiny型號(hào)中都可以找到相同的USI硬件。請(qǐng)注意,芯片之間的輸出引腳可能有所不同,但否則硬件的工作方式相同,寄存器也相同。
USI硬件具有三個(gè)引腳:
DO-數(shù)據(jù)輸出,僅用于三線(SPI)通信模式
DI/SDA-數(shù)據(jù)輸入/串行數(shù)據(jù),在I2C配置中用作SDA
USCK/SCL-時(shí)鐘,在I2C配置中用作SCK
,USI硬件具有三個(gè)寄存器:
USIDR-USI數(shù)據(jù)移位寄存器-將數(shù)據(jù)移入和移出USI硬件
USISR-USI狀態(tài)寄存器-具有狀態(tài)標(biāo)志和 4位計(jì)數(shù)器(詳情請(qǐng)參見下文)
USICR-USI控制寄存器-具有中斷允許,時(shí)鐘模式和軟件時(shí)鐘選通功能
4位計(jì)數(shù)器 《該4位計(jì)數(shù)器占用USISR的低4位,用于在從模式下操作時(shí)為溢出中斷計(jì)時(shí),并幫助在主模式下生成SCK時(shí)鐘脈沖。作為4位計(jì)數(shù)器,它在溢出之前從0遞增到15。溢出時(shí),它可以觸發(fā)中斷(USI_OVERFLOW_vect,由USICR中的某個(gè)位啟用)。當(dāng)USI從狀態(tài)表在傳輸狀態(tài)之間切換時(shí),它用于跟蹤傳輸(有關(guān)詳細(xì)信息,請(qǐng)參見從代碼部分)。
當(dāng)用作主設(shè)備時(shí),4位計(jì)數(shù)器與計(jì)數(shù)器一起使用。 USICR中的時(shí)鐘選通位產(chǎn)生SCK時(shí)鐘。您將計(jì)數(shù)器設(shè)置為希望產(chǎn)生的時(shí)鐘脈沖數(shù)溢出(通常為8或1,其中8為數(shù)據(jù)傳輸,1為ACK/NACK傳輸)。然后循環(huán),直到計(jì)數(shù)器溢出,連續(xù)設(shè)置時(shí)鐘選通位并執(zhí)行延遲等待。有關(guān)更多信息,請(qǐng)參見主代碼部分。
兩線制時(shí)鐘控制單元(啟動(dòng)條件檢測(cè)器)
TWI時(shí)鐘控制單元是USI中的模塊,用于監(jiān)視SCK。開始和停止條件的行。它的主要目的是啟動(dòng)條件檢測(cè)器,啟用該功能后,只要檢測(cè)到有效的啟動(dòng)條件,就會(huì)生成USI_START_vect中斷。此中斷處理程序是從機(jī)模式USI I2C傳輸處理的起點(diǎn),并且必須將4位計(jì)數(shù)器設(shè)置為在發(fā)生地址傳輸后溢出。從那以后,溢出中斷將管理該I2C消息的其余部分,并為下一條消息重置啟動(dòng)條件檢測(cè)器。
閱讀數(shù)據(jù)表
我將不對(duì)每個(gè)消息進(jìn)行詳細(xì)介紹這些寄存器中每個(gè)位的位數(shù),但是如果您要編寫一些USI代碼,則必須閱讀數(shù)據(jù)表的這些部分。我建議閱讀整個(gè)通用串行接口-USI部分(ATTiny2313完整數(shù)據(jù)表的第142-150頁(yè))。除了我在這里指出的內(nèi)容之外,這還將為您提供所有您需要的信息。
步驟6:ATTiny USI I2C代碼實(shí)現(xiàn)-USI I2C主控
USI I2C Master(usi_i2c_master.c/h)庫(kù)使用USI硬件提供I2C master模式功能。用戶應(yīng)該熟悉兩個(gè)重要功能。第一個(gè)是初始化功能,用于設(shè)置SDA/SCL引腳和USI硬件,第二個(gè)是傳輸功能,該功能對(duì)I2C消息執(zhí)行讀取或?qū)懭氩僮?,返?(如果成功,則返回true(真),如果發(fā)生錯(cuò)誤(接收到NACK),則返回0(假)。收發(fā)器功能使用第三個(gè)功能傳輸功能來發(fā)送和接收數(shù)據(jù)。傳遞函數(shù)不應(yīng)在usi_i2c_master庫(kù)的外部使用。
傳遞函數(shù)帶有兩個(gè)參數(shù)。第一個(gè)是指向數(shù)據(jù)緩沖區(qū)的指針,數(shù)據(jù)將在其中發(fā)送或接收。假定該緩沖區(qū)的第一個(gè)字節(jié)是ADDRESS + R/W字節(jié)(高7位地址,LSB是R/W)。根據(jù)協(xié)議,該字節(jié)始終被發(fā)送,而從未被接收。其余的緩沖區(qū)將根據(jù)R/W位發(fā)送出去或由接收到的數(shù)據(jù)填充(讀為1,寫為0)。第二個(gè)參數(shù)是緩沖區(qū)的總大?。òǖ刂纷止?jié))。
這是一個(gè)簡(jiǎn)短的示例。假設(shè)我們要將值 0x70 輸出到地址為 0x40 的設(shè)備的內(nèi)部地址 0x12 。首先,我們必須創(chuàng)建一個(gè)緩沖區(qū)來存儲(chǔ)我們的傳輸:
char i2c_transmit_buffer [3];
char i2c_transmit_buffer_len = 3;
i2c_transmit_buffer [0] =(0x40 《《1)| 0//不需要與0進(jìn)行“或”運(yùn)算,但為清楚起見,這會(huì)將R/W位置1進(jìn)行寫操作。
i2c_transmit_buffer [1] = 0x12;//內(nèi)部地址
i2c_transmit_buffer [2] = 0x70;//要寫入的值
//傳輸I2C消息
USI_I2C_Master_Start_Transmission(i2c_transmit_buffer,i2c_transmit_buffer_size);
有,消息傳輸完成!那很簡(jiǎn)單!如果您想了解有關(guān)USI_I2C_Master代碼的內(nèi)部工作的更多信息,只需瀏覽 usi_i2c_master.c 文件,在其中我對(duì)狀態(tài),傳遞函數(shù)和其他有趣的部分進(jìn)行了注釋。我使用了單行#define宏,以便更清楚地說明每行的用途。
下一步,我將介紹從屬模式代碼,該代碼要復(fù)雜得多,但也易于使用從最終用戶的角度來看。我采用了另一種方法來實(shí)現(xiàn)從屬代碼,這是我在其他任何教程中都沒有看到的,這很有趣且有用!
步驟7:ATTiny USI I2C代碼實(shí)現(xiàn)-USI I2C從站
與主代碼不同,USI I2C從站代碼(usi_i2c_slave.c/h)使用USI中斷幾乎完全實(shí)現(xiàn)。如前所述,USI模塊有兩個(gè)中斷,一個(gè)中斷是在檢測(cè)到START條件時(shí)產(chǎn)生的,另一個(gè)是基于4位計(jì)數(shù)器的溢出而產(chǎn)生的。計(jì)數(shù)器對(duì)于從屬代碼正常工作至關(guān)重要,在我閱讀的教程和代碼中并沒有很好地說明。在流程圖中,我注意到了邏輯中每個(gè)狀態(tài)的數(shù)字。這些數(shù)字(8、1和0)是計(jì)數(shù)器計(jì)數(shù)值,指示在轉(zhuǎn)換到下一個(gè)狀態(tài)之前計(jì)數(shù)器應(yīng)計(jì)數(shù)的滴答數(shù)。由于使用SCL時(shí)鐘為計(jì)數(shù)器提供時(shí)鐘,因此這些值表明在下一個(gè)狀態(tài)之前必須發(fā)生多少個(gè)SCL時(shí)鐘脈沖。通常,等待8個(gè)時(shí)鐘脈沖的事物正在等待數(shù)據(jù)字節(jié)的發(fā)送/接收,而等待1個(gè)時(shí)鐘脈沖的事物正在等待ACK/NACK的發(fā)送/接收。有些事情等待0個(gè)時(shí)鐘,這意味著它們會(huì)立即繼續(xù)到下一個(gè)狀態(tài),或者是前一個(gè)狀態(tài)的擴(kuò)展部分(對(duì)于Write或Read?)。
因此,作為最終用戶,您可能是對(duì)如何將庫(kù)與自己的代碼接口更感興趣!這簡(jiǎn)單,這就是原因。我已經(jīng)取消了其他USI I2C實(shí)現(xiàn)(主要是基于AVR312應(yīng)用筆記的實(shí)現(xiàn))中使用的接收/發(fā)送緩沖區(qū),而是實(shí)現(xiàn)了本教程開始時(shí)所述的注冊(cè)銀行協(xié)議 。銀行存儲(chǔ)為指針數(shù)組,而不是數(shù)據(jù)值,因此您必須在代碼中附加局部變量到I2C寄存器組中的存儲(chǔ)器地址設(shè)置指針以指向變量。這意味著您的主線代碼不必輪詢I2C緩沖區(qū)或處理數(shù)據(jù)到達(dá),只要它們到達(dá),這些值就會(huì)立即更新。它還允許通過I2C接口在任何時(shí)間輪詢程序變量,而不會(huì)影響主代碼(除了由于中斷引起的延遲之外)。這是一個(gè)非常整潔的系統(tǒng)。讓我們?cè)倥e一個(gè)簡(jiǎn)短的例子。例如,我們有一個(gè)非?;镜能浖WM發(fā)生器來驅(qū)動(dòng)LED。我們希望能夠在不使主循環(huán)復(fù)雜的情況下更改PWM值( 16位值,僅用于學(xué)習(xí)指針)。借助異步I2C從設(shè)備的魔力,我們可以做到這一點(diǎn)!
#include“ usi_i2c_slave.h”
//定義對(duì)I2C從設(shè)備寄存器組指針數(shù)組的引用extern char * USI_Slave_register_buffer [];
int main()
{
//創(chuàng)建16位PWM值無符號(hào)int pwm_val = 0;
//將pwm值低字節(jié)分配給I2C內(nèi)部地址0x00
//將pwm值高字節(jié)分配給I2C內(nèi)部地址0x01
USI_Slave_register_buffer [0] =(unsigned char *)&pwm_val;
USI_Slave_register_buffer [1] =(unsigned char *)(&pwm_val)+1;
//使用從設(shè)備地址為0x40的I2C從設(shè)備初始化
USI_I2C_Init(0x40);
//將引腳A0設(shè)置為L(zhǎng)ED的輸出(我們假設(shè)所使用的任何芯片都具有引腳A0)
DDRA | = 0x01;
while(1)
{
PORTA | = 0x01;//為(unsigned int i = 0; i {
PORTA&=?(0x01);//關(guān)閉LED燈
}
}
}
就可以了!主循環(huán)完全不引用I2C,但是將PWM值發(fā)送到I2C內(nèi)部地址0x00/0x01中的16位位置后,我們可以完全控制LED的PWM!為了增加穩(wěn)定性(確保僅使用您正在使用的指針值并防止出現(xiàn)雜散指針),我建議您將#define USI_SLAVE_REGISTER_COUNT更改為所需的寄存器指針的數(shù)量,不要更多,不少。嘗試對(duì)范圍從0x00到USI_SLAVE_REGISTER_COUNT-1之外的寄存器索引進(jìn)行訪問(讀取或?qū)懭耄r(shí),不寫入任何內(nèi)容,并且返回零。
步驟8:ATTiny USI I2C代碼實(shí)現(xiàn)-編寫代碼!
要獲?。╣it)代碼,請(qǐng)轉(zhuǎn)到我的GitHub頁(yè)面!該代碼是我的高級(jí)項(xiàng)目步進(jìn)電機(jī)控制器的一部分,因此您可以使用I2C驅(qū)動(dòng)程序檢查我對(duì)電機(jī)控制器的實(shí)現(xiàn)。我也有一個(gè)不錯(cuò)的中斷驅(qū)動(dòng)的USART串行驅(qū)動(dòng)程序,您也可以在其中使用。
https://github.com/CalcProgrammer1/Stepper-Motor-Controller/tree/master/UnipolarStepperDriver
請(qǐng)注意,名稱由于我實(shí)施的錯(cuò)誤修復(fù)和更新,I2C驅(qū)動(dòng)程序中使用的功能和功能可能會(huì)略有不同。如果有什么嚴(yán)重的問題,我將編輯該教程,但是現(xiàn)在它應(yīng)該非常準(zhǔn)確。
現(xiàn)在,您已經(jīng)掌握了I2C的知識(shí),那么您就可以準(zhǔn)備開始討論任何東西!借助I2C的總線設(shè)計(jì),您可以將許多設(shè)備(理論上最多為128,但受地址限制的限制)連接到網(wǎng)絡(luò)!
責(zé)任編輯:wv
-
I2C
+關(guān)注
關(guān)注
28文章
1489瀏覽量
123900
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論