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