版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第5章LPC1700系列處理器通信接口技術(shù)5.1I2C總線接口5.2以太網(wǎng)接口5.3SPI接口與串口閃存5.4CAN總線接口5.5USB接口5.6I2S接口本章將介紹LPC1700系列處理器高級(jí)通信接口特性、工作原理及操作方法。高級(jí)接口包括I2C總線接口、以太網(wǎng)接口、SPI總線接口、CAN總線接口、USB總線接口和I2S總線接口等。
5.1.1I2C接口特性
LPC1700系列處理器中的I2C接口具有如下特性:
(1)標(biāo)準(zhǔn)I2C總線接口,可配置為主機(jī)、從機(jī)或者主/從機(jī);
(2)同時(shí)發(fā)送的主機(jī)之間進(jìn)行仲裁,避免了串行總線數(shù)據(jù)的沖突;5.1I2C總線接口
(3)可編程時(shí)鐘能夠?qū)崿F(xiàn)I2C傳輸速率控制;
(4)主、從機(jī)之間雙向數(shù)據(jù)傳輸;
(5)串行時(shí)鐘同步可作為一個(gè)握手機(jī)制來(lái)掛起和恢復(fù)串行傳輸;
(6)
I2C0接口支持快速模式,運(yùn)行速度高達(dá)1MHz;
(7)采用監(jiān)控模式時(shí)可觀察所有I2C總線通信量,不用考慮從機(jī)地址;
(8)接口工作于從機(jī)模式時(shí),可識(shí)別多達(dá)4個(gè)不同的從機(jī)地址;
(9)
I2C0是一個(gè)標(biāo)準(zhǔn)的I2C總線接口(開(kāi)漏引腳),支持多主機(jī)操作,并允許掛接在I2C總線上的運(yùn)行器件在退出I2C總線功能時(shí)掉電;
(10)
I2C1接口和I2C2接口使用標(biāo)準(zhǔn)的I/O引腳,專用于單主機(jī)I2C總線,不支持掛接在I2C總線上的運(yùn)行器件在退出I2C總線功能時(shí)掉電,也不支持多主機(jī)I2C操作。5.1.2I2C總線引腳及應(yīng)用
LPC1700系列處理器的3個(gè)I2C接口都相同,具有I/O特性的引腳除外。這3個(gè)接口中只有I2C0符合完整I2C規(guī)范,I2C0接口可關(guān)斷與總線上某個(gè)器件的連接,并且不會(huì)影響I2C總線上的其它器件。此功能有時(shí)很有用,但它實(shí)際上限制了I2C接口不使用時(shí)相同引腳的交替使用。當(dāng)微控制器中包含多個(gè)I2C接口時(shí)該功能幾乎不用,因此,需利用標(biāo)準(zhǔn)端口來(lái)實(shí)現(xiàn)I2C1接口和I2C2接口,并且當(dāng)其它器件之間沒(méi)有I2C總線操作時(shí),不支持關(guān)斷器件功能。標(biāo)準(zhǔn)的I/O口也可以改變I2C總線的上拉特性,且不支持多主機(jī)I2C操作。在系統(tǒng)設(shè)計(jì)過(guò)程中指定I2C接口的用途時(shí)需要注意這點(diǎn)。當(dāng)引腳用于I2C通信時(shí),I2C1接口和I2C2接口的相關(guān)引腳應(yīng)當(dāng)為開(kāi)漏極模式。3個(gè)接口引腳描述如表5.1所示。
表5.1I2C接口引腳描述
圖5.1I2C連接原理圖5.1.3I2C總線基本原理
I2C總線上共有兩類(lèi)設(shè)備:主機(jī)設(shè)備(Master)和從機(jī)設(shè)備(Slave),每個(gè)設(shè)備都有唯一的設(shè)備地址用于總線尋址。主機(jī)負(fù)責(zé)啟動(dòng)總線、產(chǎn)生時(shí)鐘、控制其它從機(jī)設(shè)備接收或發(fā)送數(shù)據(jù),此時(shí)任何被尋址的設(shè)備均被認(rèn)為是從機(jī),且I2C總線的控制完全由掛接在總線上的主機(jī)送出的地址和數(shù)據(jù)決定??偩€上設(shè)備的角色并不是一成不變的,根據(jù)其功能用戶程序(也有的受硬件限制)可使其工作于主機(jī)、從機(jī)或者是主/從機(jī)角色。根據(jù)I2C總線通信數(shù)據(jù)中方向位(R/W)狀態(tài)的不同,I2C總線上存在以下兩種類(lèi)型的數(shù)據(jù)傳輸:
(1)主發(fā)送器向從接收器發(fā)送數(shù)據(jù)。主機(jī)發(fā)送的第一個(gè)字節(jié)是從機(jī)地址與方向位(W),接下來(lái)是數(shù)據(jù)字節(jié)流。從機(jī)每接收到一個(gè)字節(jié)返回一個(gè)應(yīng)答位(ACK)。主機(jī)通過(guò)應(yīng)答位判斷從機(jī)是否接收到數(shù)據(jù)。
(2)從發(fā)送器向主接收器發(fā)送數(shù)據(jù)。第一個(gè)字節(jié)由主機(jī)發(fā)送,內(nèi)容為從地址加方向位(R),然后從機(jī)返回一個(gè)應(yīng)答位(ACK),接下來(lái)從機(jī)向主機(jī)發(fā)送數(shù)據(jù)字節(jié)。主機(jī)每接收到一個(gè)字節(jié)返回一個(gè)應(yīng)答位(ACK),接收完最后一個(gè)字節(jié),主機(jī)返回一個(gè)非應(yīng)答位(NACK),即命令從機(jī)不要再發(fā)送數(shù)據(jù)。此過(guò)程中主機(jī)產(chǎn)生所有的同步脈沖、起始信號(hào)(START)和結(jié)束信號(hào)(STOP)。一次傳送在一個(gè)STOP信號(hào)或者一個(gè)重復(fù)的START信號(hào)后結(jié)束。由于一個(gè)重復(fù)的START信號(hào)也是下一次串行傳輸?shù)拈_(kāi)始,故此時(shí)I2C總線不會(huì)被釋放。5.1.4I2C操作模式
LPC1700系列處理器的每個(gè)I2C接口都是面向字節(jié)的,具有四種操作模式:主機(jī)發(fā)送模式、主機(jī)接收模式、從機(jī)發(fā)送模式和從機(jī)接收模式。本節(jié)只介紹主機(jī)角色的I2C接口操作模式與使用方法,從機(jī)的相關(guān)介紹請(qǐng)參閱LPC1700處理器I2C接口相關(guān)章節(jié)。
在一個(gè)給定的應(yīng)用中,I2C模塊可以是主機(jī)、從機(jī)或兩者兼有。在從機(jī)模式時(shí),I2C硬件尋找自己的從機(jī)地址和通用呼叫地址。當(dāng)這些地址中的一個(gè)被檢測(cè)到時(shí),會(huì)發(fā)出一個(gè)中斷請(qǐng)求。如果處理器想成為總線主機(jī),則該硬件需等待,直至總線被釋放才能進(jìn)入主機(jī)模式,以避免打斷從機(jī)操作。如果在主機(jī)模式下,當(dāng)總線仲裁失敗時(shí),I2C模塊會(huì)立即轉(zhuǎn)換成從機(jī)模式,在同一串行傳輸中檢測(cè)自己的從機(jī)地址。
1.主機(jī)發(fā)送模式
主機(jī)發(fā)送模式下數(shù)據(jù)由主機(jī)發(fā)送到從機(jī),其總線通信格式如圖5.2所示。在進(jìn)入主發(fā)送模式之前,I2CONSET寄存器必須按照表4.72進(jìn)行初始化。I2EN位必須置為1以使能I2C功能。如果AA位為0,當(dāng)其它設(shè)備為總線主機(jī)時(shí),處理器的I2C接口不會(huì)響應(yīng)任何地址,因此不可能進(jìn)入從機(jī)模式。STA、STO和SI位必須為0,當(dāng)向I2CONCLR寄存器的SIC位寫(xiě)入1時(shí)SI位會(huì)被清0。主機(jī)設(shè)備的設(shè)置如表5.2所示。
圖5.2主機(jī)發(fā)送模式的通信格式
表5.2用于設(shè)置主機(jī)設(shè)備的I2CONSET寄存器傳輸?shù)牡谝粋€(gè)字節(jié)包含接收器件的7位從機(jī)地址和1位數(shù)據(jù)方向位。這種模式的數(shù)據(jù)方向位(R/W)應(yīng)設(shè)為0,表示寫(xiě)。數(shù)據(jù)是8位同時(shí)發(fā)送的,每個(gè)字節(jié)發(fā)送完后,會(huì)收到一個(gè)確認(rèn)位。START和STOP信號(hào)輸出分別表示一次串行傳輸?shù)拈_(kāi)始和結(jié)束。
軟件設(shè)置STA位為1后,I2C接口進(jìn)入到主機(jī)發(fā)送模式。當(dāng)總線一旦空閑就會(huì)發(fā)出START信號(hào)。在START信號(hào)發(fā)送后,SI位會(huì)被置1,并且狀態(tài)寄存器I2STAT的狀態(tài)代碼為0x08,這個(gè)狀態(tài)代碼用于引導(dǎo)狀態(tài)服務(wù)機(jī),加載從機(jī)地址和寫(xiě)數(shù)據(jù)位到I2DAT寄存器,然后清除SI位。當(dāng)向I2CONCLR寄存器的SIC位寫(xiě)入1時(shí)SI位會(huì)被清0。
從機(jī)地址和R/W位發(fā)送完畢,并且收到一個(gè)確認(rèn)位后,SI位會(huì)被重新置位,其狀態(tài)代碼在主機(jī)模式情況下可能是0x18、0x20或0x38。主機(jī)模式狀態(tài)代碼對(duì)應(yīng)的操作可參考后面的表5.7與表5.8。
2.主機(jī)接收模式
在主機(jī)接收模式中,接收來(lái)自從機(jī)發(fā)送的數(shù)據(jù),其總線通信格式如圖5.3所示。傳輸初始化方法與主發(fā)送模式相同。當(dāng)START信號(hào)發(fā)送后,用戶程序必須將從機(jī)地址和數(shù)據(jù)方向位加載到I2C的數(shù)據(jù)寄存器I2DAT中,然后清除SI位。在這種情況下,數(shù)據(jù)方向位(R/W)應(yīng)該設(shè)為1,表示讀操作。
圖5.3主機(jī)接收模式的總線通信格式當(dāng)從機(jī)地址和數(shù)據(jù)方向位發(fā)送,且主機(jī)收到一個(gè)確認(rèn)位后,SI位被置位。狀態(tài)寄存器I2STAT會(huì)顯示狀態(tài)代碼。對(duì)于主機(jī)模式,狀態(tài)代碼可能是0x40、0x48或0x38。主機(jī)模式狀態(tài)代碼對(duì)應(yīng)的操作可參考表5.7與表5.8。
當(dāng)主機(jī)發(fā)送重復(fù)START信號(hào)后,I2C接口重新轉(zhuǎn)換到主機(jī)發(fā)送模式,主機(jī)接收轉(zhuǎn)為主機(jī)發(fā)送模式的總線通信格式如圖5.4所示。
圖5.4主機(jī)接收轉(zhuǎn)為主機(jī)發(fā)送模式的總線通信格式5.1.5I2C接口寄存器描述
由于LPC1700處理器中的I2C接口支持從機(jī)模式下多地址與總線監(jiān)聽(tīng)模式,所以增加了I2ADDR1~3、I2MASK0~3、MMCTRL和DATA_BUFFER寄存器。I2C接口所有寄存器如表5.3所示。
表5.3I2C接口寄存器總表續(xù)表1.I2C控制置位寄存器
I2CONSET寄存器用于設(shè)置I2C控制寄存器I2CON中的位,而I2CON寄存器又控制著I2C接口的操作。將1寫(xiě)入該寄存器的某個(gè)位時(shí),I2C控制寄存器I2CON的相應(yīng)位會(huì)被置位;寫(xiě)入0對(duì)I2C控制寄存器的相應(yīng)位沒(méi)有影響。
LPC1700系列處理器的三個(gè)I2C接口各自對(duì)應(yīng)的I2CONSET寄存器名為I2C0CONSET、I2C1CONSET和I2C2CONSET,對(duì)應(yīng)地址分別為0x4001C000、0x4005C000和0x400A0000。該寄存器包含8個(gè)位,每一位的含義如表5.4所示。
表5.4I2C控制置位寄存器I2CONSET的位描述(1)
AA。聲明確認(rèn)標(biāo)志。該位置1時(shí),在SCL線的確認(rèn)時(shí)鐘脈沖內(nèi),出現(xiàn)下面的任意條件之一將產(chǎn)生一個(gè)確認(rèn)信號(hào)ACK(SDA線為低電平):
①接收到從機(jī)地址寄存器中的地址。
②當(dāng)I2ADR中的通用呼叫位(GC)置位時(shí),接收到通用呼叫地址。
③當(dāng)I2C接口處于主機(jī)接收模式時(shí),接收到一個(gè)數(shù)據(jù)字節(jié)。
④當(dāng)I2C接口處于可尋址的從機(jī)接收模式時(shí),接收到一個(gè)數(shù)據(jù)字節(jié)。向I2CONCLR寄存器中的AAC位寫(xiě)入1,會(huì)使AA位清零。當(dāng)AA為0時(shí),在SCL線的確認(rèn)時(shí)鐘脈沖內(nèi),出現(xiàn)下列情況之一時(shí)將返回一個(gè)非確認(rèn)信號(hào)NACK(SDA線為高
電平):
①當(dāng)I2C接口處于主機(jī)接收模式時(shí),接收到最后一個(gè)數(shù)據(jù)字節(jié)。
②當(dāng)I2C接口處于可尋址的從機(jī)接收模式時(shí),接收到最后一個(gè)數(shù)據(jù)字節(jié)。
(2)
SI。I2C中斷標(biāo)志。當(dāng)I2C狀態(tài)改變時(shí)該位置位。但進(jìn)入到狀態(tài)碼F8時(shí)不會(huì)置位SI,因?yàn)樵谶@種情況下沒(méi)有任何中斷服務(wù)程序可以執(zhí)行。當(dāng)SI置位,SCL線上串行時(shí)鐘的低周期會(huì)展寬,并且串行傳輸被掛起。當(dāng)SCL為高時(shí)則不受SI標(biāo)志狀態(tài)的影響。SI必須通過(guò)軟件向I2CONCLR寄存器的SIC位寫(xiě)入1來(lái)實(shí)現(xiàn)復(fù)位。
(3)
STO。停止(STOP)標(biāo)志。設(shè)置該位,在主機(jī)模式下使I2C接口發(fā)送一個(gè)STOP信號(hào),或是在從機(jī)模式下從一個(gè)錯(cuò)誤條件中恢復(fù)。當(dāng)STO=1時(shí),主機(jī)模式下,一個(gè)STOP信號(hào)會(huì)被發(fā)送到I2C總線上,當(dāng)總線檢測(cè)到STOP信號(hào)時(shí)STO會(huì)自動(dòng)清零。
在從機(jī)模式下,置位STO位可以從錯(cuò)誤狀態(tài)中恢復(fù)。這種情況下不向總線發(fā)送STOP信號(hào)。硬件的表現(xiàn)就如同接收到一個(gè)STOP信號(hào)并切換到不可尋址的從機(jī)接收模式。STO標(biāo)志由硬件自動(dòng)清零。
當(dāng)STA和STO都被置位時(shí),如果I2C接口處于主機(jī)模式,I2C接口會(huì)向總線發(fā)送一個(gè)STOP信號(hào),然后再發(fā)送一個(gè)START信號(hào);如果I2C接口處于從機(jī)模式,則產(chǎn)生一個(gè)內(nèi)部STOP信號(hào),但不發(fā)送到總線上。
(4)
STA。開(kāi)始(START)標(biāo)志。設(shè)置該位使I2C接口進(jìn)入主機(jī)模式并發(fā)送一個(gè)START信號(hào),或者如果已經(jīng)處于主機(jī)模式,則發(fā)送一個(gè)重復(fù)START信號(hào)。
當(dāng)STA為1,且I2C接口還沒(méi)有進(jìn)入主機(jī)模式時(shí),I2C接口將進(jìn)入主機(jī)模式,檢測(cè)總線,并在總線空閑時(shí)產(chǎn)生一個(gè)START信號(hào)。如果總線忙,則等待下一個(gè)STOP信號(hào)(釋放總線),并在延遲內(nèi)部時(shí)鐘發(fā)生器的半個(gè)時(shí)鐘周期后產(chǎn)生一個(gè)START信號(hào)。如果I2C接口已經(jīng)處于主機(jī)模式并已經(jīng)發(fā)送或接收了數(shù)據(jù),I2C接口會(huì)發(fā)送一個(gè)重復(fù)START信號(hào)。STA可以在任何時(shí)候置位,包括I2C接口處于被尋址的從機(jī)模式時(shí)。向I2CONCLR寄存器中的STA位寫(xiě)入1可以使STA位清零。當(dāng)STA=0時(shí),不會(huì)產(chǎn)生START信號(hào)或復(fù)重復(fù)的START信號(hào)。
(5)
I2EN。I2C接口使能。當(dāng)該位是1時(shí),使能I2C接口。通過(guò)向I2CONCLR寄存器中的I2ENC位寫(xiě)入1可以將I2EN位清零;當(dāng)I2EN為0時(shí),I2C接口被禁止,SDA和SCL輸入信號(hào)被忽略,I2C接口處于“不可尋址”的從機(jī)狀態(tài),且STO位被強(qiáng)行置“0”。
I2EN不能用于臨時(shí)釋放I2C總線,因?yàn)楫?dāng)I2EN復(fù)位時(shí),I2C總線的狀態(tài)會(huì)丟失,可以利用AA標(biāo)志來(lái)代替。
2.I2C控制清零寄存器
I2CONCLR寄存器用于清零I2C控制寄存器I2CON中的位。將1寫(xiě)入該寄存器的某個(gè)位時(shí),I2C控制寄存器的相應(yīng)位會(huì)被清零;寫(xiě)入0對(duì)I2C控制寄存器的相應(yīng)位沒(méi)有影響。
LPC1700系列處理器的三個(gè)I2C接口,各自對(duì)應(yīng)的I2CONCLR寄存器名分別為I2C0CONCLR、I2C1CONCLR和I2C2CONCLR,對(duì)應(yīng)地址分別為0x4001C018、0x4005C018和0x400A0018。該寄存器包含8個(gè)位,每一位的含義如表5.5所示。
表5.5I2C控制清零寄存器I2CONCLR的位描述3.I2C狀態(tài)寄存器
每個(gè)I2C狀態(tài)寄存器都反映了相應(yīng)I2C接口的狀況。該寄存器是一個(gè)只讀寄存器。
LPC1700系列處理器的三個(gè)I2C接口,各自對(duì)應(yīng)的I2STAT寄存器名分別為I2C0STAT、I2C1STAT和I2C2STAT,對(duì)應(yīng)地址分別為0x4001C004、0x4005C004和0x400A0004。該寄存器包含8個(gè)位,每一位的含義如表5.6所示。
表5.6I2C狀態(tài)寄存器I2STAT的位描述
最低3位總是0。作為一個(gè)字節(jié),狀態(tài)寄存器的內(nèi)容代表一種狀態(tài)代碼,共有26種可能存在的狀態(tài)代碼。當(dāng)代碼為0xF8時(shí),無(wú)可用的相關(guān)信息,SI位不會(huì)被置位。所有其它25種狀態(tài)代碼都對(duì)應(yīng)一個(gè)已定義的I2C總線狀態(tài)。當(dāng)進(jìn)入其中一種狀態(tài)時(shí),SI位會(huì)被置位。主機(jī)模式下的完整狀態(tài)代碼可參見(jiàn)表5.7~表5.9。
表5.7主機(jī)發(fā)送模式下的狀態(tài)代碼
表5.8主機(jī)接收模式下的狀態(tài)代碼表5.9不同性質(zhì)的狀態(tài)代碼4.I2C數(shù)據(jù)寄存器
該寄存器包含要發(fā)送的數(shù)據(jù)或者是剛接收到的數(shù)據(jù)。當(dāng)SI位被置位,且沒(méi)有進(jìn)行數(shù)據(jù)移位操作時(shí),CPU可以對(duì)其進(jìn)行讀/寫(xiě)操作。在SI位被置位期間,I2DAT中的數(shù)據(jù)保持穩(wěn)定。I2DAT中的數(shù)據(jù)移位總是從右至左進(jìn)行的:第一個(gè)發(fā)送的是最高位(位7),在接收字節(jié)時(shí),第一個(gè)接收到的位存放在I2DAT的最高位。
LPC1700系列處理器的三個(gè)I2C接口各自對(duì)應(yīng)的I2DAT寄存器名分別為I2C0DAT、I2C1DAT和I2C2DAT,對(duì)應(yīng)地址分別為0x4001C008、0x4005C008和0x400A0008。該寄存器包含8個(gè)位,每一位的含義如表5.10所示。
表5.10I2C數(shù)據(jù)寄存器I2DAT的位描述5.I2C監(jiān)控模式寄存器
I2C監(jiān)控模式寄存器控制監(jiān)控模式的使能,它可以使I2C模塊監(jiān)控I2C總線的通信量,并且不需要實(shí)際參與通信或干擾I2C總線。
LPC1700系列處理器的三個(gè)I2C接口各自對(duì)應(yīng)的I2MMCTRL寄存器名分別為I2C0MMCTRL、I2C1MMCTRL和I2C2MMCTRL,對(duì)應(yīng)地址分別為0x4001C01C、0x4005C01C和0x400A001C。該寄存器各位功能描述如表5.11所示。
表5.11I2C監(jiān)控模式寄存器I2MMCTRL位描述當(dāng)MM_ENA位為0(即I2C接口不在監(jiān)控模式中)時(shí),ENA_SCL和MATCH_ALL位無(wú)效。
1)監(jiān)控模式中的中斷
模塊處于監(jiān)控模式下時(shí)所有中斷正常出現(xiàn)。這意味著:首次中斷將出現(xiàn)在發(fā)現(xiàn)有從機(jī)地址匹配時(shí)(如果MATCH_ALL置位,則接收到任意一個(gè)從機(jī)地址就會(huì)產(chǎn)生中斷,否則中斷只會(huì)在4個(gè)從機(jī)地址寄存器中的一個(gè)出現(xiàn)匹配時(shí)產(chǎn)生)。
發(fā)現(xiàn)地址匹配后,對(duì)于從機(jī)發(fā)送模式,接口每接收一個(gè)字節(jié),中斷產(chǎn)生一次;對(duì)于從機(jī)接收模式,則接口認(rèn)為是某個(gè)從機(jī)接收字節(jié)以后,產(chǎn)生中斷。在第二種情況下,數(shù)據(jù)寄存器實(shí)際上保存了總線上其它從機(jī)發(fā)送的數(shù)據(jù),該從機(jī)實(shí)際上是被主機(jī)尋址的。
當(dāng)產(chǎn)生從機(jī)地址接收或從機(jī)地址匹配中斷后,處理器就可以讀取數(shù)據(jù)寄存器得到實(shí)際總線上傳輸?shù)臄?shù)據(jù)了。
2)監(jiān)控模式中的仲裁丟失
在監(jiān)控模式中,I2C模塊不能響應(yīng)總線主機(jī)的信息請(qǐng)求或發(fā)送應(yīng)答,而是由總線上的其它從機(jī)來(lái)響應(yīng)的。這很可能導(dǎo)致仲裁丟失。用戶軟件應(yīng)當(dāng)注意:監(jiān)控模式中的模塊不應(yīng)當(dāng)對(duì)任何檢測(cè)到的仲裁狀態(tài)丟失做出響應(yīng)。
6.I2C數(shù)據(jù)緩沖寄存器
在監(jiān)控模式中,如果ENA_SCL位未置位,I2C模塊就不能延長(zhǎng)時(shí)鐘(使總線遲延)。也就是說(shuō),處理器讀取總線數(shù)據(jù)的時(shí)間有限。如果處理器以正常速度讀取I2DAT移位寄存器,那么在新數(shù)據(jù)更新接收數(shù)據(jù)之前,它可能只有1位時(shí)間來(lái)響應(yīng)中斷。
為了給予處理器更多的響應(yīng)時(shí)間,系統(tǒng)增加了一個(gè)新的8位只讀寄存器I2DATA_BUFFER??偩€接口每接收到第9個(gè)位(8個(gè)數(shù)據(jù)位+應(yīng)答位或非應(yīng)答位)后,寄存器I2DAT的最高8位會(huì)自動(dòng)發(fā)送到I2DATA_BUFFER。這意味著處理器會(huì)有9個(gè)位的傳輸時(shí)間來(lái)響應(yīng)中斷,并且在更新接收數(shù)據(jù)之前讀取數(shù)據(jù)。
處理器仍可直接讀取I2DAT,I2DAT無(wú)論如何是不會(huì)改變的。
即便I2DATA_BUFFER主要用于監(jiān)控模式(ENA_SCL=0),在任何一種操作模式下它都可以隨時(shí)讀取。
LPC1700系列處理器的三個(gè)I2C接口各自對(duì)應(yīng)的I2DATA_BUFFER寄存器名分別為I2C0DATA_BUFFER、I2C1DATA_BUFFER和I2C2DATA_BUFFER,對(duì)應(yīng)地址分別為0x4001C02C、0x4005C02C和0x400A002C。該寄存器各位功能描述如表5.12所示。
表5.12I2C數(shù)據(jù)緩沖寄存器I2DATA_BUFFER的位描述7.I2C從機(jī)地址寄存器
I2C從機(jī)地址寄存器可讀可寫(xiě),但只有在I2C接口被設(shè)置成從機(jī)模式時(shí)有用。在主機(jī)模式下,這類(lèi)寄存器無(wú)效。I2ADR的最低位是通用呼叫位(GC),當(dāng)該位被置位時(shí),通用呼叫地址(0x00)被識(shí)別。
LPC1700系列處理器的三個(gè)I2C接口各自擁有四個(gè)從機(jī)地址寄存器。I2C0的I2ADR
寄存器對(duì)應(yīng)地址為I2C0ADR[0,1,2,3]-0x4001C0[0C,20,24,28];I2C1的I2ADR寄存器對(duì)應(yīng)地址為:I2C1ADR[0,1,2,3]-0x4005C0[0C,20,24,28];I2C2的I2ADR寄存器對(duì)應(yīng)地址為I2C2ADR[0,1,2,3]-0x400A00[0C,20,24,28]。每個(gè)寄存器包含8個(gè)位,每一位的含義如表5.13所示。
表5.13I2C從機(jī)地址寄存器I2ADR的位描述8.I2C從機(jī)地址屏蔽寄存器
從機(jī)地址屏蔽寄存器都含有7個(gè)有效位(7:1)。這些寄存器中的任意位置位都會(huì)引起接收地址相應(yīng)位的自動(dòng)比較(當(dāng)它與屏蔽寄存器關(guān)聯(lián)的I2ADDRn寄存器比較時(shí))。換句話說(shuō),就是在確定地址匹配時(shí)不會(huì)考慮寄存器I2ADDRn中被屏蔽的位。
復(fù)位時(shí)所有屏蔽寄存器中的位被清零,處理器不響應(yīng)任何從機(jī)地址。
當(dāng)與通用呼叫地址(0000000)比較時(shí),屏蔽寄存器失效。
屏蔽寄存器中的位(31:8)和(0)不使用也不能寫(xiě)入值,這些位總是0。當(dāng)出現(xiàn)地址匹配中斷時(shí),處理器必須讀取數(shù)據(jù)寄存器(I2DAT)來(lái)確定實(shí)際引起匹配的接收地址。
LPC1700系列處理器的三個(gè)I2C接口各自擁有四個(gè)從機(jī)地址屏蔽寄存器。I2C0的I2MASK寄存器對(duì)應(yīng)地址為I2C0MASK[0,1,2,3]-0x4001C0[30,34,38,3C];I2C1的I2MASK寄存器對(duì)應(yīng)地址為I2C1MASK[0,1,2,3]-0x4005C0[30,34,38,3C];I2C2的I2MASK寄存器對(duì)應(yīng)地址為I2C2MASK[0,1,2,3]-0x400A00[30,34,38,3C]。該寄存器各位功能描述如表5.14所示。
表5.14I2C從機(jī)地址屏蔽寄存器I2MASK的位描述9.I2CSCL占空比高半字寄存器
LPC1700系列處理器的三個(gè)I2C接口各自對(duì)應(yīng)的I2SCLH寄存器名分別為I2C0SCLH、I2C1SCLH和I2C2SCLH,對(duì)應(yīng)地址分別為0x4001C010、0x4005C010和0x400A0010。該寄存器包含16個(gè)位,每一位的含義如表5.15所示。
表5.15I2C數(shù)據(jù)寄存器I2SCLH的位描述10.I2CSCL占空比低半字寄存器
LPC1700系列處理器的三個(gè)I2C接口各自對(duì)應(yīng)的I2SCLL寄存器名分別為I2C0SCLL、I2C1SCLL和I2C2SCLL,對(duì)應(yīng)地址分別為0x4001C014、0x4005C014和0x400A0014。該寄存器包含16個(gè)位,每一位的含義如表5.16所示。
表5.16I2C數(shù)據(jù)寄存器I2SCLL的位描述11.選擇適當(dāng)?shù)腎2C數(shù)據(jù)率和占空比
軟件必須通過(guò)對(duì)I2SCLH和I2SCLL寄存器進(jìn)行設(shè)置來(lái)選擇適當(dāng)?shù)臄?shù)據(jù)率和占空比。I2SCLH定義SCL高電平所保持的PCLK周期數(shù);I2SCLL定義SCL低電平的PCLK周期數(shù)。頻率由下面的公式?jīng)Q定(fPCLK是PCLK的頻率):
I2SCLL和I2SCLH的值不一定要相同。軟件通過(guò)設(shè)置這兩個(gè)寄存器來(lái)得到SCL不同的占空對(duì)。例如,I2C總線規(guī)范定義了400kHzI2C速率的SCL低電平和高電平的不同的值。寄存器的值必須確保I2C數(shù)據(jù)率在0~400kHz之間。每個(gè)寄存器的值都必須大于或等于4。表5.17給出了基于PCLK頻率和I2SCLL和I2SCLH的I2C總線速率的例子。
表5.17I2C時(shí)鐘頻率設(shè)置對(duì)照表I2SCLL和I2SCLH的值不一定要相同。通過(guò)設(shè)定這兩個(gè)寄存器可以得到SCL的不同占空比。例如,I2C總線規(guī)范定義在快速模式下和在快速模式Plus下的SCL低電平時(shí)間和高電平時(shí)間是不同的。5.1.6應(yīng)用舉例
本應(yīng)用使用LPC1700處理器的I2C0接口對(duì)E2PROM器件AT24C02進(jìn)行查詢方式讀寫(xiě),介紹LPC1700處理器I2C接口的編程方法。程序?qū)2C接口設(shè)置為主機(jī)模式,分別執(zhí)行主機(jī)發(fā)送模式(向E2PROM中寫(xiě)數(shù)據(jù))和主機(jī)接收模式(從E2PROM中讀數(shù)據(jù))完成對(duì)AT24C02的讀寫(xiě)操作。有關(guān)AT24C02的具體細(xì)節(jié)請(qǐng)參考相關(guān)芯片數(shù)據(jù)手冊(cè)。
1.頭文件中相關(guān)宏定義
在頭文件中定義了AT24C02器件的I2C總線地址,I2C接口控制寄存器中AA、SI、STO、STA、I2EN等位的掩碼,便于程序的使用與理解。具體定義如程序清單5.1所示。
【程序5.1】頭文件宏定義。
/*定義EEPROMAT24C02的從機(jī)地址*/
#defineAT24C02_SLA 0xA0
/*I2C接口的控制設(shè)置寄存器I2CONSET各位定義*/
#defineI2CONSET_AA 0x00000004
#defineI2CONSET_SI 0x00000008
#defineI2CONSET_STO 0x00000010
#defineI2CONSET_STA 0x00000020
#defineI2CONSET_I2EN 0x00000040
/*I2C接口的控制清除寄存器I2CONCLR各位定義*/
#defineI2CONCLR_AAC 0x00000004
#defineI2CONCLR_SIC 0x00000008
#defineI2CONCLR_STAC 0x00000020
#defineI2CONCLR_I2ENC 0x00000040
2.I2C接口初始化函數(shù)
I2CInit函數(shù)初始化處理器I2C模塊,包括選擇I2C總線引腳功能,設(shè)置I2C接口為主設(shè)備角色并使能I2C總線模塊。具體代碼如程序清單5.2所示。
【程序5.2】I2C接口初始化函數(shù)。
voidI2CInit(void)
{
LPC_SC->PCONP|=(1<<19); //打開(kāi)I2C接口電源
LPC_PINCON->PINSEL1&=~0x03C00000;
LPC_PINCON->PINSEL1|=0x01400000; //將P0.27與P0.28設(shè)置為I2C總線SDA
//與SCL引腳
LPC_I2C0->I2CONCLR=I2CONCLR_AAC|\ //清除控制寄存器中各個(gè)位
I2CONCLR_SIC|I2CONCLR_STAC|I2CONCLR_I2ENC;
LPC_I2C0->I2SCLL=40; //設(shè)置I2C總線工作時(shí)鐘
LPC_I2C0->I2SCLH=40;
LPC_I2C0->I2CONSET=I2CONSET_I2EN; //使能I2C接口為主機(jī)模式
}
3.I2C接口寫(xiě)字節(jié)函數(shù)
I2CWriteByte函數(shù)實(shí)現(xiàn)向從器件AT24C02的特定地址寫(xiě)入1個(gè)字節(jié)數(shù)據(jù)。函數(shù)的兩個(gè)參數(shù)為要寫(xiě)入的數(shù)據(jù)和AT24C02的存儲(chǔ)器地址。具體代碼如程序清單5.3所示。
【程序5.3】I2C接口寫(xiě)字節(jié)函數(shù)。
uint8_tI2CWriteByte(uint8_tdata,uint8_taddress)
{
LPC_I2C0->I2CONCLR=(I2CONCLR_STAC|I2CONCLR_SIC|I2CONCLR_AAC);
LPC_I2C0->I2CONSET=I2CONSET_I2EN; //使能I2C接口為主機(jī)模式
LPC_I2C0->I2CONSET=I2CONSET_STA; //發(fā)送START信號(hào)
while(LPC_I2C0->I2STAT!=0x8); //通過(guò)狀態(tài)寄存器判斷操作是否成功
LPC_I2C0->I2DAT=AT24C02_SLA+0; //設(shè)置AT24C02地址與寫(xiě)操作位
LPC_I2C0->I2CONCLR=(I2CONCLR_SIC|I2CONCLR_STAC); //清零SI位以發(fā)送SLA+W
while(LPC_I2C0->I2STAT!=0x18); //通過(guò)狀態(tài)寄存器判斷操作是否成功
LPC_I2C0->I2DAT=address; //寫(xiě)入字節(jié)地址到AT24C02
LPC_I2C0->I2CONCLR=I2CONCLR_SIC; //清零SI位以發(fā)送字節(jié)地址
while(LPC_I2C0->I2STAT!=0x28); //通過(guò)狀態(tài)寄存器判斷操作是否成功
LPC_I2C0->I2DAT=data; //寫(xiě)入字節(jié)數(shù)據(jù)到AT24C02
LPC_I2C0->I2CONCLR=I2CONCLR_SIC; //清零SI位以發(fā)送字節(jié)數(shù)據(jù)
delayMs(0,1);
LPC_I2C0->I2CONCLR=I2CONCLR_SIC;
LPC_I2C0->I2CONSET=I2CONSET_STO; //設(shè)置STO位以停止發(fā)送
delayMs(0,80); //函數(shù)返回前延時(shí)等待AT24C02寫(xiě)入數(shù)據(jù)
return1;
}
4.I2C接口讀字節(jié)函數(shù)
I2CReadByte函數(shù)實(shí)現(xiàn)從AT24C02的特定地址處讀取一個(gè)字節(jié)數(shù)據(jù)。函數(shù)參數(shù)為讀取的字節(jié)地址,返回值為讀出的字節(jié)數(shù)據(jù)。具體代碼如程序清單5.4所示。
【程序5.4】I2C接口讀字節(jié)函數(shù)。
uint8_tI2CReadByte(uint8_taddress)
{
uint8_tdata;
LPC_I2C0->I2CONCLR=(I2CONCLR_STAC|I2CONCLR_SIC|I2CONCLR_AAC);
LPC_I2C0->I2CONSET=I2CONSET_I2EN; //使能I2C接口為主機(jī)模式
LPC_I2C0->I2CONSET=I2CONSET_STA; //發(fā)送START信號(hào)
while(LPC_I2C0->I2STAT!=0x08); //狀態(tài)代碼必須是0x08
LPC_I2C0->I2DAT=AT24C02_SLA; //寫(xiě)入設(shè)備地址與寫(xiě)操作位
LPC_I2C0->I2CONCLR=(I2CONCLR_SIC|I2CONCLR_STAC);
//清零SI位以發(fā)送SLA+W
while(LPC_I2C0->I2STAT!=0x18); //狀態(tài)代碼必須是0x18
LPC_I2C0->I2DAT=address; //寫(xiě)入要讀出的AT24C02字節(jié)地址
LPC_I2C0->I2CONCLR=I2CONCLR_SIC; //清零SI位以發(fā)送字節(jié)地址
while(LPC_I2C0->I2STAT!=0x28); //狀態(tài)代碼必須是0x28
LPC_I2C0->I2CONSET=I2CONSET_STO; //停止寫(xiě)AT24C02操作
LPC_I2C0->I2CONCLR=I2CONCLR_SIC;
LPC_I2C0->I2CONSET=I2CONSET_STA; //重發(fā)送START信號(hào),開(kāi)始真正讀取操作
while(LPC_I2C0->I2STAT!=0x8);
LPC_I2C0->I2DAT=AT24C02_SLA+1; //發(fā)送設(shè)備地址與讀操作位
LPC_I2C0->I2CONCLR=(I2CONCLR_SIC|I2CONCLR_STAC);
//清零SI位以執(zhí)行讀操作
while(LPC_I2C0->I2STAT!=0x40);
LPC_I2C0->I2CONCLR=I2CONCLR_SIC;
while(LPC_I2C0->I2STAT!=0x58); //等待接收數(shù)據(jù)字節(jié),回送非ACK
data=LPC_I2C0->I2DAT; //讀出字節(jié)數(shù)據(jù)
LPC_I2C0->I2CONCLR=(I2CONCLR_SIC|I2CONCLR_AAC);
LPC_I2C0->I2CONSET=I2CONSET_STO; //設(shè)置STO位以發(fā)送STOP信號(hào)
returndata;
}
5.測(cè)試主函數(shù)
測(cè)試主函數(shù)連續(xù)調(diào)用I2C寫(xiě)函數(shù),并調(diào)用I2C讀函數(shù)驗(yàn)證數(shù)據(jù),最終在串口輸出結(jié)果。具體代碼如程序5.5所示。
【程序5.5】測(cè)試主函數(shù)。
intmain(void)
{
uint8_ti,chr_i2c;
……
I2CInit();
for(i=0;i<255;i++)I2CWriteByte(i,i); //連續(xù)調(diào)用寫(xiě)函數(shù)寫(xiě)入AT24C02
UART0_SendString("ReadingAT24C02:\r\n");
for(i=0;i<255;i++)
{
chr_i2c=I2CReadByte(i); //調(diào)用讀函數(shù)驗(yàn)證數(shù)據(jù)
if(chr_i2c!=i)
{
UART0_SendString("Foundaerror!\r\n");
return-1;
}
UART0_SendByte(chr_i2c);
delayMs(0,100);
}
UART0_SendString("\r\nI2Ctestsuccessed!\r\n");
}
5.2.1以太網(wǎng)接口概述
LPC1700系列處理器的以太網(wǎng)模塊包含一個(gè)功能齊全的10Mb/s或100Mb/s以太網(wǎng)MAC(媒體訪問(wèn)控制器),以太網(wǎng)MAC通過(guò)使用DMA硬件加速功能來(lái)優(yōu)化其性能。以太網(wǎng)模塊具有大量的控制寄存器組,5.2以?太?網(wǎng)?接?口可以提供半雙工/全雙工操作、流控制、控制幀、重發(fā)硬件加速、接收包過(guò)濾以及LAN上的系統(tǒng)喚醒等功能。利用分散-集中式(Scatter-Gather)DMA進(jìn)行自動(dòng)的幀發(fā)送和接收操作,減輕了CPU的負(fù)荷。
以太網(wǎng)模塊是一個(gè)驅(qū)動(dòng)AHB總線矩陣的AHB主設(shè)備。通過(guò)總線矩陣,它可以訪問(wèn)片上所有的RAM存儲(chǔ)器。建議以太網(wǎng)使用RAM的方法是專門(mén)使用其中一個(gè)RAM模塊來(lái)處理以太網(wǎng)幀通信。那么該模塊只能由以太網(wǎng)和CPU,或者是GPDMA進(jìn)行訪問(wèn),從而獲取以太網(wǎng)功能的最大帶寬。以太網(wǎng)模塊使用RMII(簡(jiǎn)化的媒體獨(dú)立接口)和片上MIIM(媒體獨(dú)立接口管理)串行總線,也被稱為MDIO(管理數(shù)據(jù)輸入/輸出),以實(shí)現(xiàn)與片外以太網(wǎng)物理層(PHY)芯片之間的連接。5.2.2以太網(wǎng)接口特性
(1)以太網(wǎng)標(biāo)準(zhǔn)支持特性:
●支持10M或100Mb/s物理層(PHY)器件,包括10Base-T、100Base-TX、100Base-FX和100Base-T4規(guī)范;
●與IEEE標(biāo)準(zhǔn)802.3完全兼容;
●與802.3x全雙工流控和半雙工背壓流控完全兼容;
●靈活的發(fā)送幀和接收幀選項(xiàng);
●支持VLAN幀。
(2)存儲(chǔ)器管理特性:
●獨(dú)立的發(fā)送和接收緩沖區(qū)存儲(chǔ)器,映射為共享的SRAM;
●帶有分散/集中式DMA的DMA管理器以及幀描述符隊(duì)列;
●通過(guò)緩沖和預(yù)取來(lái)實(shí)現(xiàn)存儲(chǔ)器通信的優(yōu)化。
(3)以太網(wǎng)增強(qiáng)的功能:
●接收進(jìn)行過(guò)濾;
●發(fā)送和接收均支持多播幀和廣播幀;●發(fā)送操作可選擇自動(dòng)插入FCS(CRC);
●可選擇在發(fā)送操作時(shí)自動(dòng)進(jìn)行幀填充;
●發(fā)送和接收均支持超長(zhǎng)幀傳輸,允許幀長(zhǎng)度為任意值;
●多種接收模式;
●出現(xiàn)沖突時(shí)自動(dòng)后退并重傳幀信息;
●通過(guò)時(shí)鐘切換實(shí)現(xiàn)功率管理;
●支持“由LAN喚醒”的功率管理功能,以便將系統(tǒng)喚醒,該功能可使用接收過(guò)濾器或魔法幀檢測(cè)過(guò)濾器來(lái)實(shí)現(xiàn)。
(4)物理接口特性:
●通過(guò)標(biāo)準(zhǔn)的簡(jiǎn)化MII(RMII)接口來(lái)連接外部物理層(PHY)芯片;
●通過(guò)媒體獨(dú)立接口管理(MIIM)接口可對(duì)物理層(PHY)芯片內(nèi)寄存器進(jìn)行訪問(wèn)。5.2.3以太網(wǎng)接口結(jié)構(gòu)及引腳描述
LPC1700系列處理器的以太網(wǎng)模塊結(jié)構(gòu)框圖如圖5.5所示。
圖5.5
以太網(wǎng)模塊結(jié)構(gòu)框圖以太網(wǎng)模塊結(jié)構(gòu)框圖由以下部分構(gòu)成:
(1)主機(jī)寄存器模塊:包含軟件使用的寄存器組,并處理AHB對(duì)以太網(wǎng)模塊的訪問(wèn)。主機(jī)寄存器連接發(fā)送和接收數(shù)據(jù)通路,以及MAC連接。
(2)
DMA到AHB接口:提供AHB主設(shè)備的連接,允許以太網(wǎng)模塊訪問(wèn)以太網(wǎng)SRAM讀描述字、寫(xiě)狀態(tài)和讀/寫(xiě)數(shù)據(jù)緩沖器。
(3)以太網(wǎng)MAC和相連的RMII適配器:MAC到片外物理層的接口。
(4)發(fā)送數(shù)據(jù)通路,包括:
①發(fā)送DMA管理器,負(fù)責(zé)從存儲(chǔ)器中讀描述字和數(shù)據(jù),并將狀態(tài)寫(xiě)入存儲(chǔ)器。
②發(fā)送重試模塊處理以太網(wǎng)重發(fā)和放棄的情況。
③發(fā)送流量控制模塊能插入以太網(wǎng)暫停幀。
(5)接收數(shù)據(jù)通道,包括:
①接收DMA管理器,負(fù)責(zé)從存儲(chǔ)器中讀描述字和數(shù)據(jù),并將狀態(tài)寫(xiě)入存儲(chǔ)器。
②以太網(wǎng)MAC通過(guò)分析幀頭來(lái)檢測(cè)幀的類(lèi)型。③接收濾波器可以設(shè)置不同的過(guò)濾方案來(lái)濾除一些特定的以太幀。
④接收緩沖區(qū)實(shí)現(xiàn)對(duì)接收幀的延遲,允許在存儲(chǔ)到存儲(chǔ)器之前過(guò)濾掉一些特定的以太幀。
LPC1700系列處理器的以太網(wǎng)模塊使用簡(jiǎn)化媒體獨(dú)立接口(RMII)及媒體獨(dú)立接口管理引腳(MIIM)與外部的物理層(PHY)芯片連接。其中RMII用于傳輸以太網(wǎng)幀數(shù)據(jù);MIIM用于CPU對(duì)PHY芯片的配置及管理。
RMII接口引腳如表5.18所示,MIIM接口引腳如表5.19所示。
表5.18RMII引腳描述表5.19MIIM引腳描述5.2.4以太網(wǎng)接口操作概述
1.以太網(wǎng)DMA引擎
以太網(wǎng)模塊通過(guò)加速的DMA硬件來(lái)優(yōu)化性能。位于AHB總線上的獨(dú)立的分散/集中式DMA引擎可大大減輕CPU的數(shù)據(jù)傳輸負(fù)擔(dān)。
以太網(wǎng)DMA引擎將每個(gè)以太網(wǎng)幀(或片段)用一個(gè)描述符(Descriptor)和一個(gè)狀態(tài)字來(lái)表示。存放在存儲(chǔ)器中的描述符包括以太網(wǎng)幀片段的相關(guān)信息,一個(gè)片段可以是一個(gè)完整的幀或一個(gè)極小的數(shù)據(jù)量。每個(gè)描述符都含有一個(gè)指針,指向相關(guān)的以太網(wǎng)幀數(shù)據(jù)存儲(chǔ)器地址,描述符還含有緩沖區(qū)的大小以及如何發(fā)送或接收片段的詳細(xì)設(shè)置。狀態(tài)字則保存了DMA引擎處理該幀后(發(fā)送或接收)的結(jié)果。有關(guān)描述及狀態(tài)字的定義參見(jiàn)5.2.7小節(jié)。
在進(jìn)行以太網(wǎng)數(shù)據(jù)通信前,驅(qū)動(dòng)程序必須先初始化好描述符與狀態(tài)字,然后由DMA引擎根據(jù)各個(gè)描述的要求處理對(duì)應(yīng)的以太網(wǎng)幀,最后將結(jié)果保存在對(duì)應(yīng)的狀態(tài)字中。用戶程序根據(jù)描述符與狀態(tài)字對(duì)以太網(wǎng)數(shù)據(jù)進(jìn)一步處理。
2.描述符隊(duì)列與狀態(tài)字隊(duì)列概述
由于每個(gè)以太網(wǎng)幀需要一個(gè)描述符與一個(gè)狀態(tài)字匹配,因此將描述符和狀態(tài)字都各自維護(hù)為循環(huán)隊(duì)列。根據(jù)發(fā)送和接收方向的不同,在MAC模塊中共有4個(gè)循環(huán)隊(duì)列:發(fā)送描述符隊(duì)列、發(fā)送狀態(tài)字隊(duì)列、接收描述符隊(duì)列和接收狀態(tài)字隊(duì)列。其中發(fā)送方向的兩個(gè)隊(duì)列與接收方向的兩個(gè)隊(duì)列的長(zhǎng)度必須相同。另外,由于描述符隊(duì)列與狀態(tài)字隊(duì)列都保存在RAM中,為了提高以太網(wǎng)操作性能,建議存放描述與狀態(tài)的RAM不要與其它模塊公用。根據(jù)循環(huán)隊(duì)列的工作特性,隊(duì)列的隊(duì)尾(數(shù)據(jù)入隊(duì)列端)稱為生產(chǎn)者(producer),隊(duì)列的隊(duì)頭(數(shù)據(jù)出隊(duì)列端)稱為消費(fèi)者(consumer)。針對(duì)MAC模塊發(fā)送方向的兩個(gè)隊(duì)列,DMA引擎為消費(fèi)者,即從隊(duì)列取出描述符進(jìn)行以太幀發(fā)送;驅(qū)動(dòng)程序?yàn)樯a(chǎn)者,即把以太幀復(fù)制到緩沖區(qū),并將描述符入隊(duì)列。而針對(duì)MAC模塊接收方向的兩個(gè)隊(duì)列,DMA引擎為生產(chǎn)者,即把MAC接收到的以太幀復(fù)制到緩沖區(qū),并將描述符入隊(duì)列;驅(qū)動(dòng)程序?yàn)橄M(fèi)者,即從隊(duì)列取出描述符,根據(jù)描述符將以太幀復(fù)制到用戶空間。為了方便程序操作循環(huán)隊(duì)列,MAC模塊將隊(duì)頭和隊(duì)尾索引保存在寄存器中。其中DMA引擎硬件維護(hù)TxConsumeIndex和RxProduceIndex隊(duì)列索引;驅(qū)動(dòng)程序軟件維護(hù)TxProduceIndex和RxConsumeIndex隊(duì)列索引。程序通過(guò)讀取這些索引就可對(duì)循環(huán)隊(duì)列進(jìn)行操作,找到對(duì)應(yīng)的以太幀數(shù)據(jù)。DMA引擎處理完以太幀后會(huì)自動(dòng)更新索引(包括索引越界檢查),以供驅(qū)動(dòng)程序使用;驅(qū)動(dòng)程序處理完以太幀后則需要程序?qū)λ饕M(jìn)行更新(包括越界檢查),以供DMA引擎使用。
圖5.6
MAC模塊的循環(huán)隊(duì)列與隊(duì)列索引的關(guān)系5.2.5幀描述符與狀態(tài)字
本節(jié)給出了DMA引擎使用的接收/發(fā)送描述符和狀態(tài)字的格式定義。每個(gè)以太幀可由一個(gè)或多個(gè)片段組成,每個(gè)片段對(duì)應(yīng)一個(gè)描述符和一個(gè)狀態(tài)字。以太網(wǎng)模塊中的DMA管理器能夠?qū)⒁粋€(gè)以太幀中的多個(gè)片段進(jìn)行分散(用于接收)或集中(用于發(fā)送)。為了方便操作,MAC硬件將所有幀描述符和狀態(tài)字組織成循環(huán)隊(duì)列,由DMA引擎和驅(qū)動(dòng)程序共同操作,從而完成以太網(wǎng)幀的發(fā)送與接收。
1.接收描述符和狀態(tài)字
圖5.7描述了接收描述符和狀態(tài)字在內(nèi)存中的構(gòu)成情況。
圖5.7接收描述符和狀態(tài)字的分布接收描述符存放在存儲(chǔ)器的一個(gè)數(shù)組中。數(shù)組的基址存放在RxDescriptor寄存器中,并且與4字節(jié)地址邊界對(duì)齊(最低2位為0)。數(shù)組中描述符的個(gè)數(shù)存放在RxDescriptorNumber寄存器中,該寄存器使用減1編碼。例如,如果數(shù)組有8個(gè)元素,則該寄存器的值應(yīng)該是7。還有一個(gè)與描述符平行的狀態(tài)字?jǐn)?shù)組。對(duì)于描述符數(shù)組中的每個(gè)描述符,狀態(tài)字?jǐn)?shù)組中均有一個(gè)相關(guān)的狀態(tài)區(qū)域?qū)?yīng)。接收狀態(tài)字?jǐn)?shù)組的基址存放在RxStatus寄存器中,并且該基址必須與8字節(jié)地址邊界對(duì)齊(最低3位為0)。在操作過(guò)程中(當(dāng)接收通道使能時(shí)),不可再對(duì)RxDescriptor、RxStatus和RxDescriptorNumber寄存器進(jìn)行修改。
隊(duì)列索引寄存器RxConsumeIndex和RxProduceIndex用于定義下一個(gè)將被DMA硬件和驅(qū)動(dòng)程序軟件使用的描述符單元。這兩個(gè)寄存器從0開(kāi)始計(jì)數(shù),在計(jì)數(shù)值到達(dá)RxDescriptorNumber寄存器中的值時(shí)應(yīng)該重置為0。接收描述符隊(duì)列隊(duì)頭索引(RxProduceIndex)包含了將要被DMA引擎接收的幀所對(duì)應(yīng)的描述符索引,該索引由DMA引擎維護(hù)。接收描述符隊(duì)列隊(duì)尾索引(RxConsumeIndex)包含了驅(qū)動(dòng)程序下一個(gè)將要讀取的幀所對(duì)應(yīng)的描述符索引,該索引由驅(qū)動(dòng)程序維護(hù)。當(dāng)RxProduceIndex與RxConsumeIndex相等時(shí),接收緩沖區(qū)為空;當(dāng)RxProduceIndex+1等于RxConsumeIndex時(shí)(需要考慮循環(huán)隊(duì)列索引的翻轉(zhuǎn)),接收緩沖區(qū)滿。新接收的以太幀將產(chǎn)生緩沖區(qū)溢出錯(cuò)誤,除非軟件驅(qū)動(dòng)程序處理一個(gè)或多個(gè)描述符,釋放接收描述符隊(duì)列空間。每個(gè)接收描述符占兩個(gè)字(8個(gè)字節(jié))存儲(chǔ)空間。同樣,每個(gè)狀態(tài)字也占兩個(gè)字(8個(gè)字節(jié))存儲(chǔ)空間。每個(gè)接收描述符均由一個(gè)“數(shù)據(jù)包指針域(PACKET)”和一個(gè)“控制字(CONTROL)”組成。指針域指向用來(lái)存放接收以太幀或幀片段的緩沖區(qū)基地址;控制字包含硬件接收幀的控制信息。接收描述符的構(gòu)成如表5.20所示。
表5.20接收描述符的構(gòu)成
表5.21接收描述符控制字的位描述
表5.22接收狀態(tài)字的構(gòu)成StatusInfo字包含的是由MAC返回的標(biāo)志和由接收通道產(chǎn)生的反映接收狀態(tài)的標(biāo)志。StatusInfo字的位描述如表5.23所示。
StatusHashCRC包含的是兩個(gè)串聯(lián)的9位HashCRC,這兩個(gè)CRC是通過(guò)計(jì)算接收幀中的目標(biāo)地址和源地址得來(lái)的。在檢測(cè)到目標(biāo)地址和源地址之后,只對(duì)StatusHashCRC進(jìn)行一次計(jì)算,然后保存該值,供同一幀中的所有片段使用。StatusHashCRC字的位描述如表5.24所示。
表5.23StatusInfo字的位描述
表5.24StatusHashCRC字的位描述
對(duì)于具有多個(gè)片段的幀,該幀中除了最后一個(gè)片段之外的所有片段中的AlignmentError、RangeError、LengthError、SymbolError、CRCError位的值都是0。同樣,F(xiàn)ailFilter、Multicast、Broadcast、VLAN、ControlFrame位的值是未定義的。而該幀中最后一個(gè)片段的狀態(tài)是從MAC中將上述位的值復(fù)制過(guò)來(lái)而得的。所有片段都將具有有效的LastFrag、RxSize、Error、Overrun和NoDescriptor位。
2.發(fā)送描述符和狀態(tài)字
圖5.8描述了發(fā)送描述符和狀態(tài)字在內(nèi)存中的構(gòu)成情況。
圖5.8發(fā)送描述符和狀態(tài)字的分布發(fā)送描述符存放在存儲(chǔ)器的一個(gè)數(shù)組中。數(shù)組的基地址存放在TxDescriptor寄存器中,并且與4字節(jié)地址邊界對(duì)齊(最低2位為0)。數(shù)組中描述符的個(gè)數(shù)存放在TxDescriptorNumber寄存器中,該寄存器使用減1編碼。對(duì)于描述符數(shù)組中的每個(gè)元素,狀態(tài)字?jǐn)?shù)組中均有一個(gè)相關(guān)的狀態(tài)區(qū)域與之對(duì)應(yīng)。發(fā)送狀態(tài)字?jǐn)?shù)組的基址存放在TxStatus寄存器中,并且該地址也必須是4字節(jié)地址邊界對(duì)齊(最低2位為0)。在操作過(guò)程中(當(dāng)發(fā)送通道使能時(shí)),不可再對(duì)TxDescriptor、TxStatus和TxDescriptorNumber寄存器進(jìn)行修改。隊(duì)列索引寄存器TxConsumeIndex和TxProduceIndex,用于定義下一個(gè)將被DMA硬件和驅(qū)動(dòng)程序軟件使用的描述符單元。這兩個(gè)寄存器從0開(kāi)始計(jì)數(shù),在計(jì)數(shù)值到達(dá)TxDescriptorNumber寄存器中的值時(shí)應(yīng)重置為0。發(fā)送描述符隊(duì)列隊(duì)頭索引(TxProduceIndex)包含了驅(qū)動(dòng)程序下一個(gè)將要填充的幀所對(duì)應(yīng)的描述符的索引,該索引由驅(qū)動(dòng)程序維護(hù)。發(fā)送描述符隊(duì)列隊(duì)尾索引(TxConsumeIndex)包含了將要被DMA引擎發(fā)送的幀所對(duì)應(yīng)的描述符索引,該索引由DMA引擎維護(hù)。當(dāng)TxProduceIndex等于TxConsumeIndex時(shí),發(fā)送緩沖區(qū)為空;當(dāng)TxProduceIndex+1等于TxConsumeIndex時(shí)(需要考慮循環(huán)隊(duì)列索引的翻轉(zhuǎn)),發(fā)送緩沖區(qū)滿,軟件驅(qū)動(dòng)程序不能再添加新的描述符,直到DMA引擎發(fā)送了一個(gè)或多個(gè)幀,釋放發(fā)送描述符隊(duì)列空間為止。
每個(gè)發(fā)送描述符在存儲(chǔ)器中占兩個(gè)字(8個(gè)字節(jié)),每個(gè)狀態(tài)字在存儲(chǔ)器中占1個(gè)字(4個(gè)字節(jié))。每個(gè)發(fā)送描述符均由一個(gè)“數(shù)據(jù)包指針域”和一個(gè)“控制字”組成。指針域指向保存了要發(fā)送的以太幀的緩沖區(qū)基地址;控制字包含硬件發(fā)送幀的控制信息。發(fā)送描述符的構(gòu)成如表5.25所示。
表5.25發(fā)送描述符的構(gòu)成
表5.26發(fā)送描述符控制字的位描述
每個(gè)發(fā)送狀態(tài)字由1個(gè)StatusInfo字組成,它包含的是由MAC返回的標(biāo)志和由發(fā)送通道產(chǎn)生的反映發(fā)送狀態(tài)的標(biāo)志。StatusInfo字的位描述如表5.27所示。
表5.27StatusInfo字的位描述
對(duì)于具有多個(gè)片段的幀,該幀中除了最后一個(gè)片段之外的所有片段中的LateCollision、ExcessiveCollision、ExcessiveDefer、Defer和CollisionCount位的值都為0。該幀中最后一個(gè)片段的狀態(tài)是從MAC中將上述位的值復(fù)制過(guò)來(lái)而得的。所有片段都將具有有效的Error、NoDescriptor和Underrun位。
3.使用注意事項(xiàng)
1)所有權(quán)
設(shè)備驅(qū)動(dòng)軟件和以太網(wǎng)硬件都能同時(shí)對(duì)描述符隊(duì)列執(zhí)行讀/寫(xiě)操作,以“產(chǎn)生”和“消費(fèi)”描述符。在兩者同時(shí)請(qǐng)求使用描述符隊(duì)列時(shí),AHB總線仲裁將使硬件具有更高的優(yōu)先級(jí)。一個(gè)描述符的“擁有者”可以是設(shè)備驅(qū)動(dòng)軟件也可以是以太網(wǎng)硬件。只有描述符的“擁有者”才能對(duì)描述符進(jìn)行讀/寫(xiě)操作。通常,描述符和狀態(tài)字的“使用”和“擁有”順序是:首先,設(shè)備驅(qū)動(dòng)程序“擁有”并建立描述符隊(duì)列;其次,設(shè)備驅(qū)動(dòng)軟件將描述符/狀態(tài)字的“擁有權(quán)”傳遞給以太網(wǎng)模塊,這時(shí)以太網(wǎng)模塊會(huì)讀取描述符并將操作結(jié)果(發(fā)送或接收)寫(xiě)入狀態(tài)字;然后,以太網(wǎng)模塊將描述符的“擁有權(quán)”傳遞回設(shè)備驅(qū)動(dòng)程序,驅(qū)動(dòng)程序“消費(fèi)”描述符與狀態(tài)字信息,并重復(fù)利用描述符以供其它幀使用。軟件必須預(yù)先分配好用來(lái)存放描述符隊(duì)列的存儲(chǔ)區(qū)。
軟件通過(guò)將TxProduceIndex/RxConsumeIndex索引寄存器加1(驅(qū)動(dòng)程序必須考慮索引翻轉(zhuǎn)問(wèn)題),將描述符和狀態(tài)字的“擁有權(quán)”移交給硬件。硬件通過(guò)更新TxConsumeIndex/RxProduceIndex索引寄存器來(lái)將描述符和狀態(tài)字的“擁有權(quán)”移交給軟件。將一個(gè)描述符移交給了接收和發(fā)送DMA硬件之后,設(shè)備驅(qū)動(dòng)軟件則不能修改描述符或通過(guò)將TxProduceIndex/RxConsumeIndex寄存器減1來(lái)收回描述符,因?yàn)橛布赡芤呀?jīng)預(yù)取了這些描述符。此時(shí),設(shè)備驅(qū)動(dòng)軟件必須等待,直到以太幀發(fā)送完成,否則設(shè)備驅(qū)動(dòng)程序必須將發(fā)送和/或接收通道進(jìn)行軟復(fù)位,從而將描述符隊(duì)列復(fù)位。
2)索引增長(zhǎng)及翻轉(zhuǎn)
為了循環(huán)使用描述符隊(duì)列緩沖區(qū),以太網(wǎng)模塊將其維護(hù)為循環(huán)隊(duì)列。在軟件或硬件操作完一個(gè)描述符時(shí),索引是線性增長(zhǎng)的,即每操作一個(gè)描述符/狀態(tài)字,索引增加1。
索引翻轉(zhuǎn)(wrap-around)是指當(dāng)索引值超出隊(duì)列長(zhǎng)度范圍時(shí),應(yīng)該將其重置回0,即隊(duì)列的首個(gè)描述符。特別強(qiáng)調(diào)由DMA引擎維護(hù)的TxConsumeIndex/RxProduceIndex索引自動(dòng)完成增長(zhǎng)和翻轉(zhuǎn),TxProduceIndex/RxConsumeIndex索引的增長(zhǎng)和翻轉(zhuǎn)必須由驅(qū)動(dòng)程序軟件來(lái)維護(hù)。
3)隊(duì)列狀態(tài)判斷
判斷描述符隊(duì)列的狀態(tài)對(duì)于用戶程序來(lái)說(shuō)至關(guān)重要。當(dāng)隊(duì)列為空時(shí),隊(duì)列的消費(fèi)者一方將停止工作;當(dāng)隊(duì)列為滿時(shí),隊(duì)列的生產(chǎn)者一方將停止工作。注意,在以太網(wǎng)模塊中根據(jù)接收和發(fā)送方向的不同,描述隊(duì)列的消費(fèi)和生產(chǎn)者角色是不同的。
根據(jù)循環(huán)隊(duì)列的特點(diǎn)及隊(duì)列的隊(duì)頭和隊(duì)尾相對(duì)位置則可判斷隊(duì)列的狀態(tài)。隊(duì)列空條件:
ConsumeIndex==ProduceIndex
隊(duì)列滿條件:
ConsumeIndex==(ProduceIndex+1)%隊(duì)列長(zhǎng)度
隊(duì)列空條件是兩個(gè)索引值相等;為了與隊(duì)列空條件相區(qū)別,預(yù)留一個(gè)空元素表示隊(duì)列滿狀態(tài)。考慮到索引翻轉(zhuǎn)問(wèn)題,在生產(chǎn)者索引加1后要對(duì)隊(duì)列長(zhǎng)度值取模,保證索引值不會(huì)越界。
4)中斷位
描述符有一個(gè)可通過(guò)軟件進(jìn)行編程的中斷位。當(dāng)以太網(wǎng)模塊正在處理一個(gè)描述符并發(fā)現(xiàn)該位處于置位狀態(tài)時(shí),它通過(guò)將IntStatus寄存器中的RxDoneInt或TxDoneInt位傳遞給中斷輸出引腳來(lái)觸發(fā)一個(gè)中斷(將狀態(tài)字保存到存儲(chǔ)器之后)。如果描述符中的中斷位沒(méi)有置位,則RxDoneInt和TxDoneInt不置位也不觸發(fā)中斷(注意:IntEnable中的對(duì)應(yīng)位必須置位才能觸發(fā)中斷),這樣可以靈活地管理描述符隊(duì)列。例如,設(shè)備驅(qū)動(dòng)程序能夠添加10幀信息給發(fā)送描述符隊(duì)列,可將隊(duì)列中描述符編號(hào)5的中斷位置位。這樣可以在發(fā)送完編號(hào)為5的描述符后觸發(fā)中斷,調(diào)用中斷服務(wù)程序。設(shè)備驅(qū)動(dòng)程序能夠在不打斷連續(xù)的幀傳輸?shù)那闆r下向描述符數(shù)組添加另一組幀描述符信息。
5)幀片段處理
為保證在存放幀信息時(shí)具有最大的靈活性,可以將幀信息分為多個(gè)幀片段,這些片段可以放在存儲(chǔ)器的不同位置。此時(shí),可以為每個(gè)幀片段分配一個(gè)描述符。因此,描述符能夠指向一幀或一幀中的一個(gè)片段。通過(guò)分散/集中式DMA引擎,可以使用這些片段:發(fā)送幀由存儲(chǔ)器中的多個(gè)片段集中而得,接收幀可以分散到存儲(chǔ)器的多個(gè)片段中。通過(guò)將片段連接在一起,可以在小存儲(chǔ)器空間中創(chuàng)建長(zhǎng)幀。片段的另一個(gè)使用是:對(duì)位于不同地點(diǎn)的幀頭和幀有效負(fù)載進(jìn)行定位,從而可以在不執(zhí)行數(shù)據(jù)復(fù)制操作的情況下將它們連接起來(lái)。
對(duì)于發(fā)送操作,使用發(fā)送描述符控制字中的Last位來(lái)指示該片段是否為一幀信息中的最后一個(gè)片段;對(duì)于接收操作,使用狀態(tài)字的StatusInfo區(qū)域中的LastFrag位指示該片段是否為這幀信息中的最后一個(gè)片段。如果LastFrag位為0,那么下一個(gè)描述符屬于同一個(gè)以太網(wǎng)幀;如果LastFrag位為1,則下一個(gè)描述符是一個(gè)新的以太網(wǎng)幀。5.2.6以太網(wǎng)幀操作舉例
1.以太網(wǎng)模塊初始化
復(fù)位后,以太網(wǎng)軟件驅(qū)動(dòng)程序需對(duì)以太網(wǎng)模塊進(jìn)行初始化。在初始化過(guò)程中,軟件需完成以下內(nèi)容:
●將軟件復(fù)位條件(SOFTRESET)從MAC中移除;
●通過(guò)MAC的MIIM接口配置物理層芯片(PHY);
●選擇MAC為RMII模式;
●在內(nèi)存中初始化發(fā)送和接收描述符隊(duì)列以及配置相關(guān)索引寄存器,供DMA引擎和驅(qū)動(dòng)程序軟件使用;●配置MAC模塊中的MAC寄存器(MAC1、MAC2等);
●使能接收和發(fā)送數(shù)據(jù)通道。
根據(jù)使用的物理層芯片不同,軟件需通過(guò)MIIM接口來(lái)初始化物理層芯片中的寄存器。軟件通過(guò)對(duì)MAC的MCFG、MCMD、MADR寄存器進(jìn)行編程來(lái)讀/寫(xiě)物理層芯片內(nèi)部寄存器。寫(xiě)數(shù)據(jù)應(yīng)該寫(xiě)入MWTD寄存器,讀數(shù)據(jù)和MIIM接口狀態(tài)信息可以從MRDD和MIND寄存器中讀取。
以太網(wǎng)模塊支持使用RMII接口的物理層芯片。在初始化過(guò)程中,軟件必須通過(guò)對(duì)命令寄存器(Command)進(jìn)行設(shè)置來(lái)選擇RMII模式。在切換到RMII模式之前,默認(rèn)的軟件復(fù)位條件(SOFTRESET位)必須清零。在該操作過(guò)程中必須保證以太網(wǎng)模塊參考時(shí)鐘信號(hào)(enet_ref_clk)有效,并將其連接到以太網(wǎng)模塊上。
MAC驅(qū)動(dòng)軟件通過(guò)在存儲(chǔ)器中劃分“描述符隊(duì)列”和“狀態(tài)字隊(duì)列”來(lái)完成對(duì)發(fā)送和接收DMA引擎的初始化。發(fā)送和接收各自有專門(mén)的描述符和狀態(tài)字隊(duì)列,這些隊(duì)列的基址需在TxDescriptor/TxStatus和RxDescriptor/RxStatus寄存器中指定。隊(duì)列中描述符的數(shù)目要與狀態(tài)字隊(duì)列中的數(shù)目相等。
需注意的是:發(fā)送描述符、接收描述符和接收狀態(tài)字每個(gè)都占8個(gè)字節(jié),而發(fā)送狀態(tài)字則占4個(gè)字節(jié)。所有的描述符隊(duì)列和發(fā)送狀態(tài)字隊(duì)列中的元素地址必須是4字節(jié)邊界對(duì)齊,接收狀態(tài)字隊(duì)列的元素地址必須是8字節(jié)邊界對(duì)齊。如果隊(duì)列中的元素地址沒(méi)有嚴(yán)格按照規(guī)定的字節(jié)邊界對(duì)齊,則DMA引擎將無(wú)法正確操作描述符和狀態(tài)字內(nèi)容。描述符隊(duì)列中描述符的數(shù)目需使用減1編碼寫(xiě)入TxDescriptorNumber/RxDescriptorNumber寄存器中。例如,如果描述符隊(duì)列中有4個(gè)描述符,則該寄存器的值應(yīng)為3。建立了描述符隊(duì)列后,初始化程序要在使能接收數(shù)據(jù)通道之前為接收描述符分配幀緩沖區(qū)。接收描述符的數(shù)據(jù)包指針域(PACKET)保存了該描述符對(duì)應(yīng)幀的緩沖區(qū)的基址。接收描述符控制字域包含的是接收幀緩沖區(qū)大小,該值也使用減1編碼。
接收通道有一個(gè)可配置的幀過(guò)濾功能,用于丟棄或忽略指定的以太網(wǎng)幀。幀過(guò)濾功能也應(yīng)該在初始化過(guò)程中配置。
在發(fā)出硬件復(fù)位之后,MAC中的軟件復(fù)位位將生效。使能以太網(wǎng)模塊之前必須將軟件復(fù)位條件移除。有兩處接收功能需使能:一個(gè)是接收DMA管理器需使能;另一個(gè)是MAC的接收數(shù)據(jù)通道需使能。為防止接收DMA引擎出現(xiàn)溢出,在通過(guò)將MAC1寄存器中的RECEIVEENABLE位置位來(lái)使能MAC中的接收通道之前,應(yīng)先通過(guò)使命令寄存器中的RxEnable位置位來(lái)將接收DMA引擎使能。
發(fā)送DMA引擎可在任何時(shí)候通過(guò)置位命令寄存器(Command)中的TxEnable位來(lái)使能。在將數(shù)據(jù)通道使能之前,用戶可以對(duì)MAC中的幾個(gè)選項(xiàng)進(jìn)行設(shè)置,例如自動(dòng)流控制、發(fā)送到接收的回送(用于驗(yàn)證以太網(wǎng)通信)、全雙工/半雙工模式等。在沒(méi)有對(duì)接收和發(fā)送通道進(jìn)行(軟)復(fù)位的情況下,描述符隊(duì)列的基址和長(zhǎng)度不可以修改。
2.以太網(wǎng)接收實(shí)例
本節(jié)以MAC模塊接收以太幀為例,說(shuō)明DMA引擎與驅(qū)動(dòng)程序在以太網(wǎng)通信中操作描述符隊(duì)列及相關(guān)索引寄存器的過(guò)程。實(shí)例中,假設(shè)MAC模塊需要接收一個(gè)長(zhǎng)度為19個(gè)字節(jié)的以太幀。該幀被分成3個(gè)片段(FRAGMENT),前兩片長(zhǎng)8個(gè)字節(jié),最后一片長(zhǎng)為3個(gè)字節(jié)。圖5.9所示為DMA引擎連續(xù)接收完三個(gè)以太幀片段后,接收隊(duì)列處于滿狀態(tài),以及接收隊(duì)列相關(guān)寄存器的狀態(tài)。
圖5.9接收描述符隊(duì)列及相關(guān)寄存器示例復(fù)位之后,DMA寄存器的值將為0。在初始化過(guò)程中,設(shè)備驅(qū)動(dòng)軟件在存儲(chǔ)器中分配描述符數(shù)組和狀態(tài)數(shù)組。上述例子的描述符隊(duì)列分配了4個(gè)描述符。該隊(duì)列為4×2×4字節(jié),并且是4字節(jié)地址對(duì)齊。描述符的數(shù)目與狀態(tài)字?jǐn)?shù)目相等,因此,狀態(tài)字隊(duì)列也由4個(gè)元素組成,狀態(tài)字隊(duì)列為4×2×4字節(jié),并且是8字節(jié)地址邊界對(duì)齊。設(shè)備驅(qū)動(dòng)軟件將描述符隊(duì)列的基址(0x200810EC)寫(xiě)入RxDescriptor寄存器,將狀態(tài)字隊(duì)列的基址(0x200811F8)寫(xiě)入RxStatus寄存器。設(shè)備驅(qū)動(dòng)軟件還將描述符和狀態(tài)數(shù)目減1(值為3)寫(xiě)入RxDescriptorNumber寄存器。分配了描述符隊(duì)列后,下面將為每個(gè)描述符分配幀片段緩沖區(qū)。每個(gè)幀片段緩沖區(qū)的范圍為1字節(jié)~2k字節(jié)之間(控制字中的Size占11位)。片段緩沖區(qū)的基址存放在描述符的Packet指針域;片段緩沖區(qū)長(zhǎng)度存放在描述符控制字的Size域中。描述符控制字的Interrupt域可以設(shè)置為:接收幀片段并處理完描述符時(shí),立即產(chǎn)生一個(gè)中斷。在上例中,幀片段緩沖區(qū)為8字節(jié),因此,描述符控制字的Size域值為7。注意:在該例中,片段緩沖區(qū)實(shí)際上是一段連續(xù)的存儲(chǔ)器空間,本例幀緩沖區(qū)范圍為0x20081409~0x2008141B,共19字節(jié)。即使當(dāng)幀信息分布在多個(gè)片段上時(shí),它通常也是一個(gè)線性連續(xù)的存儲(chǔ)器空間,而在描述符隊(duì)列中的其它描述符對(duì)應(yīng)幀緩沖區(qū)可以不與該幀緩沖區(qū)連續(xù)。
設(shè)備驅(qū)動(dòng)軟件應(yīng)通過(guò)向命令寄存器(Command)的RxEnable位寫(xiě)入“1”來(lái)使能DMA接收引擎功能。此后,通過(guò)向MAC配置寄存器MAC1的RECEIVEENABLE位寫(xiě)入“1”來(lái)使能MAC接收通道。這兩個(gè)位的設(shè)置順序不能顛倒,否則可能引起DMA接收緩沖區(qū)溢出錯(cuò)誤。現(xiàn)在,以太網(wǎng)模塊將啟動(dòng)以太網(wǎng)幀的接收操作。為減小處理器的中斷負(fù)擔(dān),通過(guò)置位IntEnable寄存器中的相關(guān)位系統(tǒng)可以將某些中斷禁止。在DMA引擎接收使能之后,它將發(fā)起描述符讀操作。在上述例子中,描述符數(shù)目為4。最初隊(duì)列索引RxProduceIndex和RxConsumeIndex初始值為0。由于隊(duì)列處于滿狀態(tài)時(shí)必須保留一個(gè)空描述符,故DMA引擎只能最多使用3個(gè)描述符。驅(qū)動(dòng)軟件在執(zhí)行隊(duì)列判滿條件時(shí)應(yīng)注意循環(huán)隊(duì)列索引翻轉(zhuǎn)問(wèn)題。在使能MAC中的接收功能之后,數(shù)據(jù)接收將從下一幀開(kāi)始進(jìn)行,即如果當(dāng)RMII接口正在接收一幀信息的同時(shí)接收功能使能,則該幀信息將被丟棄,接收操作從下一幀開(kāi)始。以太網(wǎng)模塊將以太幀中的導(dǎo)言(Preamble)和幀起始定界符(SFD)從該幀剝離。如果該幀信息通過(guò)了接收過(guò)濾,則DMA引擎將根據(jù)第一個(gè)描述符的數(shù)據(jù)包指針域內(nèi)容將幀剩余內(nèi)容保存至數(shù)據(jù)緩沖區(qū)中。
本例假設(shè)該幀信息有19個(gè)字節(jié)。考慮到該例中指定了緩沖區(qū)的大小,因此,該幀信息將分布在3個(gè)數(shù)據(jù)緩沖區(qū)中。在將最初的8個(gè)字節(jié)寫(xiě)入第一個(gè)片段緩沖區(qū)之后,接著寫(xiě)入的是第一個(gè)片段緩沖區(qū)的狀態(tài)字信息并且DMA引擎將繼續(xù)填充第二個(gè)片段緩沖區(qū)。由于要接收多個(gè)片段,因此第一個(gè)片段
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年設(shè)備貸款合同標(biāo)準(zhǔn)文本
- 生態(tài)守護(hù)之旅
- 解密地球:地理學(xué)之旅
- 培訓(xùn)資源使用協(xié)議書(shū)(2篇)
- 多媒體設(shè)計(jì)服務(wù)協(xié)議書(shū)(2篇)
- 揭秘谷雨季的奧妙
- 鐵路工程項(xiàng)目投資與建設(shè)合同
- 專業(yè)封陽(yáng)臺(tái)工程協(xié)議條款(2024年修訂)版
- 餐廳供貨商合同協(xié)議書(shū)范本
- 山林購(gòu)買(mǎi)合同范本
- 初中九年級(jí)美術(shù)期末藝術(shù)測(cè)評(píng)指標(biāo)試卷及答案
- 新生入職紀(jì)委培訓(xùn)課件
- 違停抓拍方案
- 《生殖系統(tǒng)》課程教學(xué)大綱
- 心臟搭橋手術(shù)與心臟搭橋手術(shù)知情同意書(shū)
- 檢驗(yàn)科質(zhì)控總結(jié)匯報(bào)
- 醫(yī)院婦產(chǎn)科2024年度工作總結(jié)
- 破產(chǎn)法培訓(xùn)課件銀行
- 歷史文化古城
- 中小學(xué)綜合實(shí)踐活動(dòng)課程指導(dǎo)綱要解讀
- 2024年門(mén)店籌建主管第一季度工作回顧以及反思
評(píng)論
0/150
提交評(píng)論