黃劍波
安徽理工大學(xué)電氣與信息工程學(xué)院,安徽 淮南 232001
ATmega128為基于AVR RISC結(jié)構(gòu)的8位低功耗CMO S微處理器。由于其先進的指令集以及單周期指令執(zhí)行時間,ATmega128的數(shù)據(jù)吞吐率高達1MIPS/MHz,從而減緩系統(tǒng)在功耗和處理速度之間的矛盾。我們研究的對象主要是基于ATmega128的綜合開發(fā)系統(tǒng),研究內(nèi)容包括TWI接口與AT24C01的通信功能實現(xiàn),USART接口與PC的通信功能實現(xiàn),SPI接口控制相關(guān)數(shù)碼管的數(shù)據(jù)顯示的功能實現(xiàn)。
SPI總線是由MOTOROLA公司提出的一種同步串行外設(shè)接口。本次研究的開發(fā)板采用的是4根信號線,即兩條控制信號線 (低電平有效)和SCLK以及兩條數(shù)據(jù)信號線SDI和SDO。
通過將需要的從機的 引腳拉低,主機啟動一次通訊過程。主機和從機將需要發(fā)送的數(shù)據(jù)放入相應(yīng)的移位寄存器。主機在SCK引腳上產(chǎn)生時鐘脈沖以交換數(shù)據(jù)。主機通過將從機的 拉高實現(xiàn)與從機的同步。
TWI協(xié)議允許系統(tǒng)設(shè)計者只用兩根雙向傳輸線就可以將128個不同的設(shè)備互連到一起。這兩根線一是時鐘SCL,一是數(shù)據(jù)SDA。外部硬件只需要兩個上拉電阻,每根線上一個。所有連接到總線上的設(shè)備都有自己的地址。TWI 協(xié)議解決了總線仲裁的問題。
TWI總線進行數(shù)據(jù)傳輸時,SDA線上的數(shù)據(jù)必須在時鐘的高電平周期保持穩(wěn)定。數(shù)據(jù)線的高或低電平狀態(tài)只有在SCL線的時鐘信號時低電平時才能改變。
TWI總線協(xié)議規(guī)定,在SCL線是高電平時,SDA線從高電平向低電平切換表示其實條件;當(dāng)SCL是高電平時,SDA線由低電平向高電平切換表示停止條件。
發(fā)送到SDA線上的每個字節(jié)必須是8位。每次傳輸可以發(fā)送的字節(jié)數(shù)量不受限制,每個字節(jié)后跟一個響應(yīng)位(ACK)。首先傳輸?shù)氖菙?shù)據(jù)的最高位。
USART分為了三個主要部分:時鐘發(fā)生器,發(fā)送器和接收器。控制寄存器由三個單元共享。時鐘發(fā)生器包括同步從機操作用來與外部輸入時鐘進行同步的邏輯,以及波特率發(fā)生器。XCK ( 發(fā)送器時鐘)引腳用于同步發(fā)送模式。發(fā)送器包括單個寫緩沖器,串行移位寄存器,奇偶發(fā)生器以及處理不同的幀格式所需的控制邏輯。寫緩沖器可以保持連續(xù)發(fā)送數(shù)據(jù)而不會在數(shù)據(jù)幀之間引入延遲。由于接收器具有時鐘和數(shù)據(jù)恢復(fù)單元,它是USART 模塊中最復(fù)雜的?;謴?fù)單元用于異步數(shù)據(jù)的接收。除了恢復(fù)單元,接收器還包括奇偶校驗,控制邏輯,移位寄存器和兩個接收緩沖器UDR。接收器支持與發(fā)送器相同的幀格式,而且可以檢測幀錯誤,數(shù)據(jù)過速和奇偶校驗錯誤。
對于TWI串口來說,它所要實現(xiàn)的功能就是對AT24C01進行訪問,包括對指定單元寫入內(nèi)容0xaa,并將該單元內(nèi)容讀取。
(1)TWI通信初始化
在這一部分,我們采用了“twi_init(void)”函數(shù)以實現(xiàn)TWI通信的初始化。函數(shù)具體實現(xiàn)是首先對TWI控制寄存器——TWCR進行設(shè)置,將其所有比特位置為0,以禁止TWI。在這之后,對TWI比特率寄存器——TWBR設(shè)置比特率,設(shè)置為01100100.然后將TWI狀態(tài)寄存器——TWSR的所有的比特位置為0,其目的主要是令TWSR的后三位比特位為0,選擇不分頻,和系統(tǒng)鐘保持一致。然后通過對TWI(從機)地址寄存器——TWAR賦值以設(shè)置從機地址。最后,再將TWCR寄存器的TWEN比特位——TWI使能位置位,啟動TWI。
(2)TWI通信開始
在這一部分,我們采用了“TWIstart(void)”函數(shù)以實現(xiàn)TWI通信的開始。函數(shù)實現(xiàn)的功能就是發(fā)送幀格式中的START信號。函數(shù)具體實現(xiàn)是首先將TWCR寄存器的TWEN,TWSTA,TWINT置為1,發(fā)送START信號。這里需要注意的是TWINT的特殊,TWINT標(biāo)志的清零必須通過軟件寫“1”來完成,只要這一位被清零,TWI立即開始工作。然后用“while (!(TWCR & (1< (3)TWI寫數(shù)據(jù) 這一部分當(dāng)中,我們采用了“unsigned char TWIwt(unsigned char data)”函數(shù)實現(xiàn)TWI寫數(shù)據(jù)。我們需要進行兩步操作:將數(shù)據(jù)裝入TWDR寄存器,啟動數(shù)據(jù)發(fā)送;等待TWINT置位。ATmega128向AT24C01寫入一個字節(jié)的數(shù)據(jù),數(shù)據(jù)類型可以包括從機地址,AT24C01的地址單元,寫入地址單元的內(nèi)容。函數(shù)具體實現(xiàn)是首先將數(shù)據(jù)裝入到TWDR寄存器,然后將TWINT清零,啟動發(fā)送數(shù)據(jù),并且用“while (!(TWCR & (1< (4)TWI讀數(shù)據(jù) 同寫數(shù)據(jù)類似的,我們采用了“unsigned char TWIrd(void)”函數(shù)實現(xiàn)TWI讀數(shù)據(jù)。處理器從AT24C01某個地址單元讀取數(shù)據(jù)。首先將TWCR寄存器的TWEN,TWEA,TWINT置為1,TWEA標(biāo)志控制應(yīng)答脈沖的產(chǎn)生,在主機/ 從機接收模式下接收到一個字節(jié)的數(shù)據(jù)時接口發(fā)出ACK脈沖。在等待TWINT置位后完成數(shù)據(jù)的讀取。 (5)TWI停止 本部分我們運用了“T W I s t o p(v o i d)”函數(shù)完成TWI串口通信停止。通過將TWCR寄存器的TWEN,TWSTO,TWINT置為1,發(fā)送STOP 信號。在寫入值時 TWINT 位要置位,這非常重要。給TWINT寫"1”清除此標(biāo)志。TWCR寄存器中的TWINT置位期間TWI不會啟動任何操作。一旦TWINT清零,TWI啟動STOP信號的傳送。注意TWINT在STOP狀態(tài)發(fā)送后不會置位。 TWI的寫操作和讀操作的流程圖分別如下圖1,圖2所示: 圖1 AT24C01寫流程圖 圖2 AT24C01讀流程圖 ATmega128具有兩個USART,USART0和USART1。本次我使用的是USART0。USART的硬件圖如下所示: 圖3 USART串口連接圖 在USART0的初始化實現(xiàn)了對波特率9600,8位數(shù)據(jù)位,一位停止位,無校驗位等要求的設(shè)定。數(shù)據(jù)位是8位,所以USART端口發(fā)送數(shù)據(jù)的方式是按字節(jié)發(fā)送。 USART0端口的數(shù)據(jù)發(fā)送有查詢方式和中斷方式兩種,這里我們采用了查詢方式。數(shù)據(jù)發(fā)送結(jié)束標(biāo)志有“USART發(fā)送結(jié)束”和“USART數(shù)據(jù)寄存器空”兩種,我們采用的是“USART數(shù)據(jù)寄存器空”。這兩種結(jié)束標(biāo)志的區(qū)別主要體現(xiàn)在發(fā)送緩沖器(UDRn)中的數(shù)據(jù)是否被送出,在數(shù)據(jù)沒有被送出的情況下,不能使用“USART發(fā)送結(jié)束”標(biāo)志。 USART0端口的數(shù)據(jù)發(fā)送我們采用了異步方式。 SPI與74HC595的硬件連接如下圖所示 圖4 SPI串口連接圖 由上圖我們可以看到處理器A T m e g a 1 2 8的S P I串口通信中的 接到7 4 H C 5 9 5口的R C L K口,ATmega128的SPI串口通信中的SCK接到74HC595口的SRCLK,ATmega128的SPI串口通信中的MOSI接到74HC595口的SER,處理器ATmega128的SPI串口通信中的MISO接到74HC595口的SRCLR上。PC7接到使能口上。本次課題串口通信中只實現(xiàn)主出從入。 (1)SPI初始化 這一部分當(dāng)中,我們采用了“spi_init(void)”完成SPI的初始化。通過對端口B數(shù)據(jù)方向寄存器DDRB賦值,將MOSI,SCK,SS設(shè)置為輸出,之后對SPI控制寄存器——SPCR賦值,使能SPI,選擇主機模式,并且設(shè)置傳送速度。 (2)SPI主機發(fā)送數(shù)據(jù) “SPI_MasterTransmit(char Data)” 可以完成SPI主機發(fā)送數(shù)據(jù)的操作。將數(shù)據(jù)寫入SPI數(shù)據(jù)寄存器——SPDR,串行發(fā)送結(jié)束后,SPIF置位。 (1)HC595初始化 我們采用“void HC_595_init(void)”將HC595初始化。主要需要完成 的方向和值的設(shè)置。首先將 設(shè)置為輸出,賦值為1以禁止其啟動。初始化PORTB的值使得數(shù)碼管的選通全部禁止,并將SPI的主從同步信號設(shè)置為高電平。之后調(diào)用SPI的初始化程序,最后將數(shù)碼管的顯示數(shù)據(jù)設(shè)為16即不顯示。 (2)HC595寫數(shù)據(jù) 送數(shù)據(jù)的操作比較簡單,主要通過調(diào)用函數(shù)實現(xiàn)。首先通過調(diào)用函數(shù)設(shè)置 的值以啟動從機SPI通信,然后調(diào)用SPI主機發(fā)送數(shù)據(jù)函數(shù)“SPI_MasterTransmit(char Data)”,最后調(diào)用函數(shù)將PB0( )設(shè)置為1,恢復(fù)到初始狀態(tài)。 (3)HC595顯示整形數(shù)據(jù) 這部分函數(shù)主要實現(xiàn)的功能是待顯示數(shù)據(jù)通過處理后,分別將百位,十位,個位存儲在相應(yīng)的單元中。在程序中,存儲單元指的是數(shù)組Seg7_Led_Buf[]。 (4)HC595刷新顯示 這部分函數(shù)主要實現(xiàn)的功能:4個數(shù)碼管依次選通顯示相應(yīng)數(shù)值,顯示的數(shù)值通過查表,通過SPI接口發(fā)送。由于刷新顯示程序的運行時間比較短,可以保證數(shù)碼管的穩(wěn)定顯示。 本次研究運用編程實現(xiàn)處理器通過串行接口與外設(shè)之間的聯(lián)系。顯示結(jié)果表明處理器與外設(shè)之間通信狀況良好,顯示延遲小,數(shù)據(jù)準確,對于運用此系統(tǒng)進行后續(xù)的開發(fā)具有重要的意義。 [1]馬潮. AVR單片機嵌入式系統(tǒng)原理與應(yīng)用實踐[M]. 第一版.北京:北京航空航天大學(xué)出版社,2007 [2]金鐘夫. AVR ATmega128單片機C程序設(shè)計與實踐[M]. 第一版.北京: 北京航空航天大學(xué)出版社,2008 [3]朱飛,楊平. AVR單片機C語言開發(fā)入門與典型實例[M]. 第一版.北京:人民郵電出版社,20102.2 USART串口通信模塊的功能實現(xiàn)
2.3 SPI串口通信模塊的功能實現(xiàn)
2.4 數(shù)碼管顯示模塊功能實現(xiàn)
3 結(jié)語