日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

I2C的使用說(shuō)明

454398 ? 來(lái)源:網(wǎng)絡(luò)整理 ? 作者:網(wǎng)絡(luò)整理 ? 2019-11-13 09:20 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

步驟1:什么是I2C-1

I2C的使用說(shuō)明

I2C(內(nèi)部集成電路總線),最初是由Phillips(現(xiàn)為NXP Semiconductor)開(kāi)發(fā)的,并且通常由Atmel和其他有條件的公司稱為T(mén)WI(兩線接口) 兩線式同步串行總線是我們不想涉及的商標(biāo)問(wèn)題。讓我們看一下每個(gè)單詞的含義:

兩根線-這很簡(jiǎn)單,I2C使用兩根線(當(dāng)然,除了地線?。鼈儽环Q為 SDA (串行數(shù)據(jù))和 SCL (串行時(shí)鐘)。它們以漏極開(kāi)路配置進(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ù)傳輸通過(guò)存在于所有連接的時(shí)鐘信號(hào)進(jìn)行同步設(shè)備。這是由主機(jī)生成的。相比之下,異步串行系統(tǒng)沒(méi)有時(shí)鐘信號(hào)。相反,它使用預(yù)定的時(shí)基或波特率。異步串行的一個(gè)示例是RS-232(許多計(jì)算機(jī)上的通用串行端口)。

串行-串行傳輸?shù)臄?shù)據(jù)表示一次通過(guò)一根電線傳輸一位數(shù)據(jù)。相比之下,并行數(shù)據(jù)傳輸有多條導(dǎo)線,每條導(dǎo)線都包含一個(gè)位,所有這些導(dǎo)線都被一次采樣以并行傳輸多個(gè)位。

總線-總線是一種允許許多設(shè)備執(zhí)行以下操作的系統(tǒng):通過(guò)單條電線相互通信。盡管可以將其稱為總線,但是USB在硬件級(jí)別上并不是真正的總線,因?yàn)檫B接多個(gè)設(shè)備需要集線器。諸如I2C之類的總線允許簡(jiǎn)單地通過(guò)將它們的SDA和SCL連接連接到現(xiàn)有線路來(lái)添加新設(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í)行仲裁以糾正問(wèn)題。本教程不會(huì)介紹多主機(jī)配置,但應(yīng)注意它們確實(shí)存在。

主機(jī)可以請(qǐng)求從主機(jī)發(fā)送或接收數(shù)據(jù)。在發(fā)送期間,主機(jī)將數(shù)據(jù)寫(xiě)入總線,而從機(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ā)送開(kāi)始條件以指示傳輸開(kāi)始。在開(kāi)始轉(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ā)送或接收(分別稱為寫(xiě)和讀)。從機(jī)地址是7位長(zhǎng),并且有幾個(gè)保留地址。這樣的保留地址之一是0x00,通常被認(rèn)為是全局寫(xiě)入(寫(xiě)入所有從站)。通常,您可以通過(guò)將地址選擇引腳連接到高電平或低電平來(lái)配置從設(shè)備的地址,盡管在微控制器上可以像在ATTiny2313上那樣通過(guò)編程方式設(shè)置地址。地址字節(jié)的最低有效位是“讀/寫(xiě)”位,它指示執(zhí)行讀還是寫(xiě)操作。如果為1,則該操作為讀取,如果為0,則為寫(xiě)入。

步驟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,以指示已完成接收。從這里開(kāi)始,通過(guò)正確的實(shí)施,您可以與所需的所有設(shè)備進(jìn)行通信。但是,我還需要指出一件事,因?yàn)樗?jīng)常使用。

在某些I2C設(shè)備上(或者我應(yīng)該說(shuō)最多,這很常見(jiàn)),訪問(wèn)協(xié)議設(shè)置為注冊(cè)銀行。要從這些寄存器讀取或?qū)懭?,必須首先編?xiě)一個(gè)內(nèi)部地址,該地址是您希望讀取或?qū)懭氲募拇嫫鞯牡刂?。?xiě)入內(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)部地址,這是通過(guò)執(zhí)行以下操作來(lái)完成的:一個(gè)字節(jié),其中包含內(nèi)部地址。對(duì)于寫(xiě)操作,傳輸可以繼續(xù)進(jìn)行數(shù)據(jù)值,數(shù)據(jù)值中的第一個(gè)將存儲(chǔ)在所需的地址中,并且任何其他字節(jié)每次都將遞增一個(gè)。對(duì)于讀取,主機(jī)將發(fā)送停止條件,然后開(kāi)始新的傳輸以進(jìn)行讀取。這是因?yàn)槟荒茉谕粋鬏斨型瑫r(shí)進(jìn)行寫(xiě)操作和讀操作。在某些情況下,可以發(fā)送重復(fù)開(kāi)始而不是先停止再開(kāi)始。 重復(fù)開(kāi)始是SCL為高時(shí)SDA上的從高到低過(guò)渡。

步驟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á)到零之前通過(guò)驅(qū)動(dòng)板的任何東西重新加載。這對(duì)本教程來(lái)說(shuō)都不重要。

這里的重要部分是這些板提供動(dòng)力的機(jī)器人具有三個(gè)輪子(全向輪子,以三角形模式排列)。我想構(gòu)建三個(gè)相同的板,但僅使用機(jī)器人主計(jì)算機(jī)(筆記本電腦)中的單個(gè)RS-232串行接口來(lái)控制全部三個(gè)。我想到的想法是使用串行端口連接計(jì)算機(jī)接口和I2C總線來(lái)連接所有三個(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)我終于開(kāi)始玩Pi時(shí),我嘗試將I2C電機(jī)板連接到其I2C端口以嘗試使用Pi驅(qū)動(dòng)的機(jī)器人。不幸的是,無(wú)論我發(fā)送了什么命令,Pi都無(wú)法進(jìn)行通信。由于我從未在自己的主代碼與自己的從代碼進(jìn)行對(duì)話之外驗(yàn)證過(guò)協(xié)議,因此我認(rèn)為自己并不是在正確地實(shí)現(xiàn)協(xié)議,因此坐下來(lái)使其全部正常工作。我做到了,新代碼更加精簡(jiǎn),井井有條,而且易于理解(任何想學(xué)習(xí)的人都贊不絕口?。?。由于進(jìn)入I2C世界的旅程很艱難,因此我決定在此處發(fā)布消息,以供所有人查看,并盡我所能詳細(xì)說(shuō)明I2C的功能。

在接下來(lái)的幾步中,我將討論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ù)表即可。具體來(lái)說(shuō),我正在查看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)參見(jiàn)下文)

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)參見(jiàn)從代碼部分)。

當(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)參見(jiàn)主代碼部分。

兩線制時(shí)鐘控制單元(啟動(dòng)條件檢測(cè)器)

TWI時(shí)鐘控制單元是USI中的模塊,用于監(jiān)視SCK。開(kāi)始和停止條件的行。它的主要目的是啟動(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ù),但是如果您要編寫(xiě)一些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è)功能傳輸功能來(lái)發(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,寫(xiě)為0)。第二個(gè)參數(shù)是緩沖區(qū)的總大?。òǖ刂纷止?jié))。

這是一個(gè)簡(jiǎn)短的示例。假設(shè)我們要將值 0x70 輸出到地址為 0x40 的設(shè)備的內(nèi)部地址 0x12 。首先,我們必須創(chuàng)建一個(gè)緩沖區(qū)來(lái)存儲(chǔ)我們的傳輸:

char i2c_transmit_buffer [3];

char i2c_transmit_buffer_len = 3;

i2c_transmit_buffer [0] =(0x40 《《1)| 0//不需要與0進(jìn)行“或”運(yùn)算,但為清楚起見(jiàn),這會(huì)將R/W位置1進(jìn)行寫(xiě)操作。

i2c_transmit_buffer [1] = 0x12;//內(nèi)部地址

i2c_transmit_buffer [2] = 0x70;//要寫(xiě)入的值

//傳輸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宏,以便更清楚地說(shuō)明每行的用途。

下一步,我將介紹從屬模式代碼,該代碼要復(fù)雜得多,但也易于使用從最終用戶的角度來(lái)看。我采用了另一種方法來(lái)實(shí)現(xiàn)從屬代碼,這是我在其他任何教程中都沒(méi)有看到的,這很有趣且有用!

步驟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)重要,在我閱讀的教程和代碼中并沒(méi)有很好地說(shuō)明。在流程圖中,我注意到了邏輯中每個(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)了本教程開(kāi)始時(shí)所述的注冊(cè)銀行協(xié)議 。銀行存儲(chǔ)為指針數(shù)組,而不是數(shù)據(jù)值,因此您必須在代碼中附加局部變量到I2C寄存器組中的存儲(chǔ)器地址設(shè)置指針以指向變量。這意味著您的主線代碼不必輪詢I2C緩沖區(qū)或處理數(shù)據(jù)到達(dá),只要它們到達(dá),這些值就會(huì)立即更新。它還允許通過(guò)I2C接口在任何時(shí)間輪詢程序變量,而不會(huì)影響主代碼(除了由于中斷引起的延遲之外)。這是一個(gè)非常整潔的系統(tǒng)。讓我們?cè)倥e一個(gè)簡(jiǎn)短的例子。例如,我們有一個(gè)非?;镜能浖WM發(fā)生器來(lái)驅(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值無(wú)符號(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)行訪問(wèn)(讀取或?qū)懭耄r(shí),不寫(xiě)入任何內(nèi)容,并且返回零。

步驟8:ATTiny USI I2C代碼實(shí)現(xiàn)-編寫(xiě)代碼!

要獲?。╣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)重的問(wèn)題,我將編輯該教程,但是現(xiàn)在它應(yīng)該非常準(zhǔn)確。

現(xiàn)在,您已經(jīng)掌握了I2C的知識(shí),那么您就可以準(zhǔn)備開(kāi)始討論任何東西!借助I2C的總線設(shè)計(jì),您可以將許多設(shè)備(理論上最多為128,但受地址限制的限制)連接到網(wǎng)絡(luò)!

責(zé)任編輯:wv

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • I2C
    I2C
    +關(guān)注

    關(guān)注

    28

    文章

    1563

    瀏覽量

    131812
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    SGM4541 I2C總線過(guò)壓保護(hù)器:設(shè)計(jì)與應(yīng)用的詳細(xì)解析

    SGM4541 I2C總線過(guò)壓保護(hù)器:設(shè)計(jì)與應(yīng)用的詳細(xì)解析 在如今的電子設(shè)備設(shè)計(jì)中,保護(hù)電路免受過(guò)電壓的損害是至關(guān)重要的。SG Micro Corp推出的SGM4541 I2C總線過(guò)壓保護(hù)器,為
    的頭像 發(fā)表于 03-17 16:30 ?424次閱讀

    SGM4541A:I2C總線過(guò)壓保護(hù)的理想之選

    SGM4541A:I2C總線過(guò)壓保護(hù)的理想之選 在電子設(shè)備的設(shè)計(jì)中,I2C總線的穩(wěn)定運(yùn)行至關(guān)重要。而SGM4541A作為一款低IQ I2C總線過(guò)壓保護(hù)器,憑借其出色的性能和豐富的特性,為I2C
    的頭像 發(fā)表于 03-17 16:30 ?241次閱讀

    RK平臺(tái)I2C開(kāi)發(fā):從硬件原理到實(shí)戰(zhàn)排查

    在嵌入式開(kāi)發(fā)中,I2C 總線是連接外設(shè)的 “橋梁”—— 小到傳感器、EEPROM,大到 LCD 驅(qū)動(dòng)器、音頻芯片,都離不開(kāi)它的控制。而瑞芯微(Rockchip)系列芯片作為主流嵌入式方案,其 I2C 控制器的開(kāi)發(fā)是很多工程師的必備技能。
    的頭像 發(fā)表于 02-05 13:42 ?2806次閱讀
    RK平臺(tái)<b class='flag-5'>I2C</b>開(kāi)發(fā):從硬件原理到實(shí)戰(zhàn)排查

    I2C 為什么只要兩根線就能搞定通信?

    到目前為止,我們已經(jīng)討論了SPI通信和UART通信的基礎(chǔ)知識(shí),現(xiàn)在讓我們討論本系列的最后一個(gè)協(xié)議,即集成電路間協(xié)議(I2C)。如果您曾經(jīng)構(gòu)建過(guò)使用OLED顯示器、氣壓傳感器或陀螺儀/加速度計(jì)模塊
    的頭像 發(fā)表于 01-04 09:14 ?2121次閱讀
    <b class='flag-5'>I2C</b> 為什么只要兩根線就能搞定通信?

    P82B715:I2C總線擴(kuò)展的得力助手

    P82B715:I2C總線擴(kuò)展的得力助手 在電子設(shè)計(jì)領(lǐng)域,I2C總線是一種常用的通信協(xié)議,但它的總線電容限制往往會(huì)影響實(shí)際通信距離和系統(tǒng)設(shè)計(jì)。今天,我們就來(lái)詳細(xì)了解一下德州儀器(TI
    的頭像 發(fā)表于 12-26 10:20 ?1780次閱讀

    基于FPGA的I2C控制模塊設(shè)計(jì)

    I2C_WRITE_WDATA.v模塊實(shí)現(xiàn)I2C寫(xiě)時(shí)序,I2C_Controller (I2C控制器)例化了I2C_WRITE_WDATA.
    的頭像 發(fā)表于 12-26 09:48 ?6243次閱讀
    基于FPGA的<b class='flag-5'>I2C</b>控制模塊設(shè)計(jì)

    AS32X601的I2C模塊操作EEPROM詳解

    國(guó)科安芯推出的AS32X601系列MCU芯片內(nèi)置的I2C模塊提供了符合工業(yè)標(biāo)準(zhǔn)的兩線串行制接口,可用于MCU和外部I2C設(shè)備的通訊。I2C總線使用兩條串行線:串行數(shù)據(jù)線SDA和串行時(shí)鐘線SCL
    的頭像 發(fā)表于 12-21 21:39 ?1708次閱讀
    AS32X601的<b class='flag-5'>I2C</b>模塊操作EEPROM詳解

    I2C的狀態(tài)碼

    I2C 總線狀態(tài)通過(guò) I2C 狀態(tài)寄存器 I2Cx_STAT 來(lái)標(biāo)識(shí),共 26 個(gè)正常接收或發(fā)送狀態(tài),和 2 個(gè)特殊狀態(tài)(0xF8:I2C
    發(fā)表于 12-08 08:04

    I2C死鎖的問(wèn)題

    在實(shí)際使用過(guò)程中,I2C比較容易出現(xiàn)的一個(gè)問(wèn)題就是死鎖 ,死鎖在I2C中主要表現(xiàn)為:I2C死鎖時(shí)表現(xiàn)為SCL為高,SDA一直為低。 在I2C主設(shè)備進(jìn)行讀寫(xiě)操作的過(guò)程中,主設(shè)備在開(kāi)始信
    發(fā)表于 12-04 06:00

    深入剖析I2C協(xié)議

    I2C是由Philips開(kāi)發(fā)的簡(jiǎn)單的雙向兩線總線,在深入淺出理解SPI協(xié)議中,我們區(qū)分了單工,半雙工,全雙工協(xié)議數(shù)據(jù)流向的區(qū)別,根據(jù)特征,I2C協(xié)議屬于半雙工協(xié)議(即同一時(shí)刻,數(shù)據(jù)單向流動(dòng))。此外
    的頭像 發(fā)表于 08-21 15:10 ?3976次閱讀
    深入剖析<b class='flag-5'>I2C</b>協(xié)議

    I2C總線通信,為什么要進(jìn)行電氣隔離?

    I2C總線采用雙向二線制,支持多主機(jī)多從機(jī)通信,具備高可靠性、抗干擾能力強(qiáng),廣泛應(yīng)用于嵌入式系統(tǒng)中。
    的頭像 發(fā)表于 08-11 11:04 ?2716次閱讀
    <b class='flag-5'>I2C</b>總線通信,為什么要進(jìn)行電氣隔離?

    高效率、6通道、白光LED驅(qū)動(dòng)器,帶I2C接口 skyworksinc

    電子發(fā)燒友網(wǎng)為你提供()高效率、6通道、白光LED驅(qū)動(dòng)器,帶I2C接口相關(guān)產(chǎn)品參數(shù)、數(shù)據(jù)手冊(cè),更有高效率、6通道、白光LED驅(qū)動(dòng)器,帶I2C接口的引腳圖、接線圖、封裝手冊(cè)、中文資料、英文資料,高效率
    發(fā)表于 07-30 18:31
    高效率、6通道、白光LED驅(qū)動(dòng)器,帶<b class='flag-5'>I2C</b>接口 skyworksinc

    第十八章 I2C通信測(cè)試

    本章介紹了I2C協(xié)議,其物理層用SDA和SCL雙線,支持多設(shè)備:協(xié)議層含起始/停止信號(hào)、應(yīng)答機(jī)制等。還講解W55MH32的I2C外設(shè)及初始化,并進(jìn)行了通信測(cè)試代碼的分析。
    的頭像 發(fā)表于 06-19 17:07 ?1513次閱讀
    第十八章 <b class='flag-5'>I2C</b>通信測(cè)試

    【技術(shù)說(shuō)明】數(shù)字輸出壓力傳感器的I2C通信

    介紹I2C總線是一個(gè)簡(jiǎn)單的,串行8位面向計(jì)算機(jī)總線有效的I2C(集成電路間)控制。It提供了良好的支持不同電路板距離之間的通信,例如與各種低速外圍設(shè)備接口的微控制器。連接到總線的每個(gè)設(shè)備都可通過(guò)唯一
    的頭像 發(fā)表于 06-19 11:02 ?1996次閱讀
    【技術(shù)<b class='flag-5'>說(shuō)明</b>】數(shù)字輸出壓力傳感器的<b class='flag-5'>I2C</b>通信

    第十六章 一文淺談I2C

    本篇文章介紹了W55MH32的I2C總線,其由SDA和SCL構(gòu)成,具設(shè)備尋址等特點(diǎn),協(xié)議含起始 / 停止信號(hào)等。闡述主從模式,介紹了相關(guān)例程,用于驗(yàn)證 I2C 通信功能。
    的頭像 發(fā)表于 05-28 16:07 ?1655次閱讀
    第十六章 一文淺談<b class='flag-5'>I2C</b>
    梁山县| 镇雄县| 德庆县| 微山县| 海丰县| 吴忠市| 甘谷县| 安吉县| 深州市| 岚皋县| 碌曲县| 崇左市| 武平县| 大新县| 乌兰县| 额济纳旗| 格尔木市| 成都市| 神池县| 邵武市| 洮南市| 海阳市| 桓台县| 建瓯市| 喀喇| 凯里市| 莫力| 陆河县| 文水县| 门头沟区| 甘谷县| 昌江| 潞城市| 上犹县| 玉屏| 台山市| 米林县| 淮滨县| 巴林左旗| 昌平区| 成都市|