版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第 6 章 基于MCS-51的典型串行總線設(shè)計(jì)6.1 概述6.2 SPI總線6.3 RS-485總線6.4 I2C總線本章小結(jié)習(xí)題 第 6 章 基于MCS-51的典型串行總線設(shè)計(jì)微型計(jì)算機(jī)、單片機(jī)系統(tǒng)大都采用總線結(jié)構(gòu)。這種結(jié)構(gòu)采用一組公共的信號(hào)線作為微型計(jì)算機(jī)各部件之間的通信線,這組公共信號(hào)線就稱為總線。單片機(jī)的常用總線有并行總線與串行總線兩種。串行總線可以顯著減少引腳數(shù)量,簡(jiǎn)化系統(tǒng)結(jié)構(gòu)。隨著外圍器件串行接口的發(fā)展,單片機(jī)串行接口的普遍化和高速化使得并行擴(kuò)展接口技術(shù)日漸衰退,后來推出了刪去并行總線的非總線單片微機(jī),需要外擴(kuò)器件(存儲(chǔ)器、I/O等)時(shí),采用串行擴(kuò)展總線,甚至用軟件虛擬串行總線來實(shí)
2、現(xiàn)。6.1 概概 述述第 6 章 基于MCS-51的典型串行總線設(shè)計(jì)常用的串行總線包括RS-232、CAN、RS-485、I2C總線、SPI總線等。其中,RS-232、RS-485、CAN為外總線,它們是系統(tǒng)之間的通信用總線;I2C、SPI是內(nèi)總線,主要用于系統(tǒng)內(nèi)芯片之間的數(shù)據(jù)傳輸。本章主要介紹SPI、RS-485和I2C總線的原理。第 6 章 基于MCS-51的典型串行總線設(shè)計(jì)串行外圍設(shè)備接口(Serial Peripheral Interface,SPI)總線技術(shù)是 Motorola公司推出的一種同步串行外設(shè)接口,允許單片機(jī)等微控制器與各種外部設(shè)備以同步串行方式進(jìn)行通信以交換信息。由于SP
3、I總線一共只需34條數(shù)據(jù)線和控制線即可實(shí)現(xiàn)與具有SPI總線功能的各種I/O器件的連接,而擴(kuò)展并行總線則需要8條數(shù)據(jù)線、816條地址線、23條控制線,因此,采用SPI總線接口可以簡(jiǎn)化整個(gè)電路的設(shè)計(jì),節(jié)省更多常規(guī)電路中的接口器件和I/O口線,提高了系統(tǒng)的可靠性。6.2 SPI 總總 線線第 6 章 基于MCS-51的典型串行總線設(shè)計(jì)6.2.1 SPI總線的工作原理總線的工作原理Motorola公司生產(chǎn)的絕大多數(shù)MCU(微控制器)都配有SPI硬件接口。SPI用于CPU與各種外圍器件進(jìn)行全雙工、同步串行通信。這些外圍器件可以是簡(jiǎn)單的TTL移位寄存器、復(fù)雜的LCD顯示驅(qū)動(dòng)器、A/D和D/A轉(zhuǎn)換子系統(tǒng)或其
4、他的MCU。第 6 章 基于MCS-51的典型串行總線設(shè)計(jì)SPI只需四條線就可以完成MCU與各種外圍器件的通信,這四條線是:串行時(shí)鐘線(SCK)、主機(jī)輸入/從機(jī)輸出數(shù)據(jù)線(MISO)、主機(jī)輸出/從機(jī)輸入數(shù)據(jù)線(MOSI)、低電平有效從機(jī)選擇線()。當(dāng)SPI工作時(shí),在移位寄存器中的數(shù)據(jù)逐位從輸出引腳(MOSI)輸出(高位在前),同時(shí)從輸入引腳(MISO)接收的數(shù)據(jù)逐位移到移位寄存器(高位在前)。發(fā)送一個(gè)字節(jié)后,從另一個(gè)外圍器件接收的字節(jié)數(shù)據(jù)進(jìn)入移位寄存器中。主SPI的時(shí)鐘信號(hào)(SCK)用來保證傳輸?shù)耐健PI總線的典型系統(tǒng)結(jié)構(gòu)如圖6.1所示。CS第 6 章 基于MCS-51的典型串行總線設(shè)計(jì)圖
5、6.1 SPI總線的典型系統(tǒng)框圖第 6 章 基于MCS-51的典型串行總線設(shè)計(jì)SPI總線的主要特點(diǎn)如下:(1) 全雙工三線同步傳送。(2) 可設(shè)置為主機(jī)或從機(jī)的工作方式。(3) 可程控串行時(shí)鐘的極性和相位。(4) 具有結(jié)束發(fā)送中斷標(biāo)志和寫沖突保護(hù)標(biāo)志。(5) 主機(jī)方式時(shí),位頻率可以有四種(可編程設(shè)置),最高可達(dá)1.05 MHz;從機(jī)方式時(shí),位頻率由外部時(shí)鐘決定,最高可達(dá)2.1 MHz。(6) 有多主機(jī)方式出錯(cuò)保護(hù),防止多個(gè)MCU同時(shí)成為串行總線的主機(jī)。(7) 可方便地與各種串行擴(kuò)展器件接口。第 6 章 基于MCS-51的典型串行總線設(shè)計(jì)6.2.2 SPI總線的通信時(shí)序總線的通信時(shí)序SPI 模塊
6、和外設(shè)進(jìn)行數(shù)據(jù)交換時(shí),根據(jù)外設(shè)工作要求,其輸出串行同步時(shí)鐘的極性和相位可以進(jìn)行配置。圖6.2為SPI總線工作的四種方式,其中使用最為廣泛的是SPI0和SPI3方式(實(shí)線表示)。第 6 章 基于MCS-51的典型串行總線設(shè)計(jì)圖6.2 SPI總線工作的四種方式第 6 章 基于MCS-51的典型串行總線設(shè)計(jì)時(shí)鐘極性(CPOL)對(duì)傳輸協(xié)議沒有重大影響,若CPOL=0,則串行同步時(shí)鐘的空閑狀態(tài)為低電平;若CPOL=1,則串行同步時(shí)鐘的空閑狀態(tài)為高電平。時(shí)鐘相位(CPHA)能夠配置為選擇兩種不同的傳輸協(xié)議之一進(jìn)行數(shù)據(jù)傳輸。若CPHA=0,則在串行同步時(shí)鐘的第一個(gè)跳變沿(上升或下降)數(shù)據(jù)被采樣;若CPHA=
7、1,則在串行同步時(shí)鐘的第二個(gè)跳變沿(上升或下降)數(shù)據(jù)被采樣。SPI主模塊和與之通信的外設(shè)時(shí)鐘的相位和極性應(yīng)該保持一致。SPI總線接口時(shí)序如圖6.3和圖6.4所示。第 6 章 基于MCS-51的典型串行總線設(shè)計(jì)圖6.3 CPHA=0時(shí)SPI總線數(shù)據(jù)傳輸時(shí)序第 6 章 基于MCS-51的典型串行總線設(shè)計(jì)圖6.4 CPHA=1時(shí)SPI總線數(shù)據(jù)傳輸時(shí)序第 6 章 基于MCS-51的典型串行總線設(shè)計(jì)6.2.3 硬件電路設(shè)計(jì)硬件電路設(shè)計(jì)MC14489是Motorola公司生產(chǎn)的5位7段LED譯碼驅(qū)動(dòng)芯片,能直接驅(qū)動(dòng)LED數(shù)據(jù)顯示器。MC14489使用一個(gè)外接電阻Rx即可控制每一段的輸出電流,有三線串行接口
8、(SPI),可直接與具有SPI接口的CPU相連,也可通過軟件模擬與沒有SPI接口的CPU配合工作。第 6 章 基于MCS-51的典型串行總線設(shè)計(jì)1. 工作原理工作原理MC14489芯片由24位輸入移位寄存器、位系統(tǒng)設(shè)置寄存器、位顯示寄存器以及位選開關(guān)、段選開關(guān)、位驅(qū)動(dòng)器、段譯碼、驅(qū)動(dòng)器、內(nèi)部振蕩器等組成。在串行輸入使能端為低有效時(shí)串行數(shù)據(jù)輸入到內(nèi)部移位寄存器,上升沿根據(jù)移位寄存器中的數(shù)據(jù)位數(shù)不同自動(dòng)將8位數(shù)據(jù)裝入位系統(tǒng)設(shè)置寄存器或?qū)?4位數(shù)據(jù)裝入位顯示寄存器。ENABLEENABLE第 6 章 基于MCS-51的典型串行總線設(shè)計(jì)2. 引腳介紹引腳介紹圖6.5給出了MC14489芯片的引腳圖。引
9、腳3:VDD為電源的正極輸入,范圍為4.56 V。引腳14:VSS為地。引腳11:CLOCK為串行數(shù)據(jù)時(shí)鐘輸入端,時(shí)鐘頻率范圍為04 MHz。引腳12:DATAIN為串行數(shù)據(jù)輸入端。引腳18:DATAOUT為串行數(shù)據(jù)輸出端,用于將MC14489各級(jí)級(jí)聯(lián)使用。第 6 章 基于MCS-51的典型串行總線設(shè)計(jì)引腳8:Rx為外接電流設(shè)置電阻,阻值范圍為700 至無窮大。引腳10:為使能信號(hào)輸入端,低電平有效。引腳7、6、5、4、2、1、20、19:ah為陽極驅(qū)動(dòng)電流源,若接共陰極LED數(shù)碼管,則ag驅(qū)動(dòng)7段筆畫,h驅(qū)動(dòng)小數(shù)點(diǎn);若接發(fā)光二極管,則應(yīng)采用非譯碼方式,使用a、b、c和d共可控制20只發(fā)光管,
10、同時(shí)h也可控制5只,在此方式下e、f與g不使用。引腳9、13、15、16、17:BANK1BANK5為陰極開關(guān),可分別接至5組數(shù)碼管或者發(fā)光管的公共陰極。ENABLE第 6 章 基于MCS-51的典型串行總線設(shè)計(jì)圖6.5 MC14489芯片的引腳圖第 6 章 基于MCS-51的典型串行總線設(shè)計(jì)3. 硬件連接電路硬件連接電路圖6.6為AT89C52與MC14489的硬件連接電路。AT89C52不帶SPI串行總線接口,所以使用軟件來模擬SPI的操作,包括串行時(shí)鐘、數(shù)據(jù)輸入和數(shù)據(jù)輸出。第 6 章 基于MCS-51的典型串行總線設(shè)計(jì)圖6.6 AT89C52與MC14489接口設(shè)計(jì)電路原理圖第 6 章
11、基于MCS-51的典型串行總線設(shè)計(jì)AT89C52的P2.0、P2.1和P2.2引腳分別連到MC14489的DATAIN、CLOCK和,用來模擬SPI接口;BANK1BANK5連接到LED的陰極;ah連接到LED的陽極。第 6 章 基于MCS-51的典型串行總線設(shè)計(jì)6.2.4 軟件設(shè)計(jì)軟件設(shè)計(jì)以下為在5位LED上顯示“HELLO”的程序代碼。#include#define uchar unsigned char sbit DATA=P20; /定義P2.0為DATAINsbit CLK=P21; /定義P2.1為CLOCKsbit ENA=P22; /定義P2.2為 ENABLE第 6 章 基于
12、MCS-51的典型串行總線設(shè)計(jì)void DSPCMD(uchar CMD);/單字節(jié)命令函數(shù),寫入MC14489內(nèi)部設(shè)置寄存器void DSPDATA(uchar DSCMD,uchar DSDATA1,uchar DSDATA2);/多字節(jié)命令函數(shù),寫入MC14489顯示寄存器void main() DSPCMD(0 xEF); /寫內(nèi)部設(shè)置寄存器 DSPDATA(0 x82,0 xE5,0 x5F);/在5位LED上顯示HELLO,滿亮度顯示第 6 章 基于MCS-51的典型串行總線設(shè)計(jì)/*單字節(jié)命令函數(shù),寫入MC14489內(nèi)部設(shè)置寄存器*/void DSPCMD (uchar CMD)
13、uchar i; ENA=0; /使能MC14489 for (i=8;i=1;i-) /寫入單字節(jié)命令 第 6 章 基于MCS-51的典型串行總線設(shè)計(jì)DATA=CMD&0 x80; CMD=CMD1; CLK=0; CLK=1; ENA=1; /禁止MC14489第 6 章 基于MCS-51的典型串行總線設(shè)計(jì)/*多字節(jié)命令函數(shù),寫入 MC14489 顯示寄存器*/ void DSPDATA (uchar DSCMD, uchar DSDATA1,uchar DSDATA2) uchar DSP, i, j; i=0; ENA=0; /使能 MC14489 while (i24) /寫
14、入 3 字節(jié)顯示數(shù)據(jù) if (i8) DSP=DSCMD; else if (i=1;j-) 第 6 章 基于MCS-51的典型串行總線設(shè)計(jì) DATA=DSP&0 x80; DSP=DSP1; CLK=0; CLK=1; i=i+8; ENA=1; /禁止 MC14489 第 6 章 基于MCS-51的典型串行總線設(shè)計(jì)6.2.5 小結(jié)小結(jié)本節(jié)介紹了基于單片機(jī)AT89C52與MC14489的SPI接口設(shè)計(jì)的硬件連接與軟件設(shè)計(jì),主要側(cè)重于用單片機(jī)接口模擬SPI接口時(shí)序。在進(jìn)行設(shè)計(jì)時(shí)應(yīng)注意以下幾個(gè)問題:(1) 由于SPI接口有四種時(shí)序方式,所以事先必須確定所選用的時(shí)序方式,一般SPI0和SP
15、I3方式較為常用。(2) 如何用C程序?qū)崿F(xiàn)時(shí)序中的起始條件、停止條件等。第 6 章 基于MCS-51的典型串行總線設(shè)計(jì)RS-232是串行數(shù)據(jù)接口標(biāo)準(zhǔn),最初由電子工業(yè)協(xié)會(huì)(EIA)在1962年制定并發(fā)布,命名為EIA-232-E,用于保證不同廠家產(chǎn)品之間的兼容。為了改進(jìn)RS-232通信距離短、速率低的缺點(diǎn),RS-422定義了一種平衡通信接口,將傳輸速率提高到10 Mb/s,傳輸距離延長到1219.2米(4000英尺)(速率低于100 kb/s時(shí)),并允許在一條平衡總線上最多連接10個(gè)接收器。6.3 RS-485總線總線 第 6 章 基于MCS-51的典型串行總線設(shè)計(jì)為擴(kuò)展應(yīng)用范圍,EIA又于19
16、83年在RS-422基礎(chǔ)上制定了RS-485標(biāo)準(zhǔn),增加了多點(diǎn)、雙向通信能力,即允許多個(gè)發(fā)送器連接到同一條總線上,同時(shí)增加了發(fā)送器的驅(qū)動(dòng)能力和沖突保護(hù)特性,擴(kuò)展了總線共模范圍。后來EIA將RS-485標(biāo)準(zhǔn)重新命名為TIA/EIA-485-A標(biāo)準(zhǔn)。由于EIA提出的建議標(biāo)準(zhǔn)都是以“RS”作為前綴的,所以在通信工業(yè)領(lǐng)域,仍然習(xí)慣將上述標(biāo)準(zhǔn)以RS作前綴表示。 第 6 章 基于MCS-51的典型串行總線設(shè)計(jì)RS-485具有以下特點(diǎn):(1) RS-485的電氣特性:邏輯“1”以兩線間的電壓差為+(26) V表示;邏輯“0”以兩線間的電壓差為-(26) V表示。接口信號(hào)電平比RS-232-C有所降低,不易損壞
17、接口電路的芯片,且該電平與TTL電平兼容,可方便地與TTL電路連接。RS-485的最高數(shù)據(jù)傳輸速率為10 Mb/s。(2) RS-485接口采用平衡驅(qū)動(dòng)器和差分接收器的組合,抗共模干擾能力增強(qiáng),即抗噪聲干擾性好。RS-485接口的最大傳輸距離標(biāo)準(zhǔn)值為1219.2米(4000英尺),實(shí)際上可達(dá)3000米。其總線接口上允許連接多達(dá)128個(gè)收發(fā)器,即具有多站能力,這樣用戶可以利用RS-485接口的特點(diǎn)方便地建立設(shè)備網(wǎng)絡(luò)。注意,RS-232-C接口在總線上只允許連接1個(gè)收發(fā)器,即單站能力。第 6 章 基于MCS-51的典型串行總線設(shè)計(jì)6.3.1 RS-485總線的工作原理總線的工作原理下面以基于單片機(jī)
18、AT89C52的RS-485總線現(xiàn)場(chǎng)監(jiān)測(cè)系統(tǒng)為例來說明RS-485總線的工作原理。圖6.7 MAX481芯片引腳圖MAX481接口芯片是MAXIM公司推出的一種RS-485芯片。該芯片采用單一電源+5V工作,額定電流為300A,采用半雙工通信方式,完成將TTL電平轉(zhuǎn)換為RS-485電平的功能。其引腳結(jié)構(gòu)圖如圖6.7所示。 第 6 章 基于MCS-51的典型串行總線設(shè)計(jì)從圖中可以看出,MAX481芯片的結(jié)構(gòu)和引腳都非常簡(jiǎn)單,內(nèi)部含有一個(gè)驅(qū)動(dòng)器和接收器。圖6.7中,RO和DI端分別為接收器的輸出端和驅(qū)動(dòng)器的輸入端,與單片機(jī)連接時(shí)只需分別與單片機(jī)的RXD和TXD相連即可;和DE端分別為接收和發(fā)送的使
19、能端,當(dāng)為邏輯0時(shí),器件處于接收狀態(tài),當(dāng)DE為邏輯1時(shí),器件處于發(fā)送狀態(tài),因?yàn)镸AX481工作在半雙工狀態(tài),所以只需用單片機(jī)的一個(gè)引腳控制這兩個(gè)引腳即可;A端和B端分別為接收和發(fā)送的差分信號(hào)端,當(dāng)A端的電平高于B時(shí),代表發(fā)送的數(shù)據(jù)為1,當(dāng)A端的電平低于B端時(shí),代表發(fā)送的數(shù)據(jù)為0。在與單片機(jī)連接時(shí)接線非常簡(jiǎn)單,僅需要一個(gè)信號(hào)控制MAX481的接收和發(fā)送即可,同時(shí)將A和B端之間加匹配電阻,一般可選120的電阻。表6.1為MAX481引腳功能說明。RERE第 6 章 基于MCS-51的典型串行總線設(shè)計(jì)圖6.7 MAX481芯片引腳圖第 6 章 基于MCS-51的典型串行總線設(shè)計(jì)表表6.1 MAX48
20、1引腳功能說明引腳功能說明引腳 名稱 說 明 1 RO 接收器輸出端 2 RE 接收器輸出使能端:引腳為“0”允許輸出,為“1”禁止輸出 3 DE 驅(qū)動(dòng)器工作使能端:引腳為“0”禁止工作,為“1”允許工作 4 DI 驅(qū)動(dòng)器輸入端 5 GND 接地端 6 A 接收器非反向輸入端和驅(qū)動(dòng)器非反向輸出端 7 B 接收器反向輸入端和驅(qū)動(dòng)器反向輸出端 8 VCC 電源引腳端,電壓范圍為 4.755.25 V 第 6 章 基于MCS-51的典型串行總線設(shè)計(jì)用MAX481實(shí)現(xiàn)的半雙工485總線現(xiàn)場(chǎng)監(jiān)測(cè)系統(tǒng)結(jié)構(gòu)如圖6.8所示。第 6 章 基于MCS-51的典型串行總線設(shè)計(jì)圖6.8 MAX481實(shí)現(xiàn)的半雙工485
21、總線現(xiàn)場(chǎng)監(jiān)測(cè)系統(tǒng)第 6 章 基于MCS-51的典型串行總線設(shè)計(jì)PC機(jī)作為主控機(jī),通過232/485轉(zhuǎn)接設(shè)備接入485總線,它使用查詢方式與各個(gè)從機(jī)通信;帶有485接口的單片機(jī)系統(tǒng)作為從機(jī),響應(yīng)主機(jī)的查詢命令,將采集到的數(shù)據(jù)回傳給主機(jī),從機(jī)之間的數(shù)據(jù)交換只能通過主機(jī)進(jìn)行轉(zhuǎn)發(fā)。由于是半雙工通信,所以主機(jī)發(fā)送與接收需要分開獨(dú)立運(yùn)行,從機(jī)也是如此。A既是接收器的非反向輸入端,也是驅(qū)動(dòng)器的非反向輸出端;B既是接收器的反向輸入端,也是驅(qū)動(dòng)器的反向輸出端;DE和引腳電平共同控制發(fā)送和接收的切換,這在后面的硬件、軟件設(shè)計(jì)中均有體現(xiàn)。RE第 6 章 基于MCS-51的典型串行總線設(shè)計(jì)6.3.2 RS-485總線
22、的通信協(xié)議總線的通信協(xié)議對(duì)于任何涉及到通信或者數(shù)據(jù)交換的系統(tǒng),通信協(xié)議的設(shè)計(jì)都是軟件設(shè)計(jì)的前提和關(guān)鍵。通信協(xié)議設(shè)計(jì)最重要的就是幀結(jié)構(gòu)的設(shè)計(jì)。485總線現(xiàn)場(chǎng)監(jiān)測(cè)系統(tǒng)中數(shù)據(jù)幀的結(jié)構(gòu)定義如表6.2所示。數(shù)據(jù)幀的內(nèi)容包括起始字節(jié)、地址字節(jié)、類型字節(jié)、數(shù)據(jù)長度字節(jié)、數(shù)據(jù)字節(jié)、校驗(yàn)字節(jié)和結(jié)束字節(jié)。第 6 章 基于MCS-51的典型串行總線設(shè)計(jì)表表6.2 485總線現(xiàn)場(chǎng)監(jiān)測(cè)系統(tǒng)中數(shù)據(jù)幀的結(jié)構(gòu)總線現(xiàn)場(chǎng)監(jiān)測(cè)系統(tǒng)中數(shù)據(jù)幀的結(jié)構(gòu)起始字節(jié) 地址字節(jié) 類型字節(jié) 數(shù)據(jù)長度字節(jié) 數(shù)據(jù)字節(jié) 校驗(yàn)字節(jié) 結(jié)束字節(jié) 1 字節(jié) 1 字節(jié) 1 字節(jié) 1 字節(jié) N 字節(jié) 1 字節(jié) 1 字節(jié) 第 6 章 基于MCS-51的典型串行總線設(shè)計(jì)
23、起始字節(jié)定義為“$”字符,其數(shù)值為0 x24;結(jié)束字節(jié)定義為“”字符,其數(shù)值為0 x2A。地址字節(jié)實(shí)際上存放的是從機(jī)對(duì)應(yīng)的設(shè)備號(hào)碼,此設(shè)備號(hào)在一開始由撥動(dòng)開關(guān)組予以設(shè)置。在工作時(shí),每個(gè)設(shè)備都按規(guī)定已設(shè)定,一般不作改動(dòng),若需改動(dòng)則重新設(shè)置開關(guān)即可。注意:地址碼應(yīng)避免重復(fù)。第 6 章 基于MCS-51的典型串行總線設(shè)計(jì)本系統(tǒng)的數(shù)據(jù)幀主要有4種,這由類型字節(jié)決定,它們分別為主機(jī)詢問從機(jī)是否在位的“ACTIVE”幀、主機(jī)發(fā)送讀設(shè)備請(qǐng)求的“GETDATA”幀、從機(jī)應(yīng)答在位的“READY”幀和從機(jī)發(fā)送設(shè)備狀態(tài)信息的“SENDDATA”幀?!癝ENDDATA”幀實(shí)際上是真正的數(shù)據(jù)幀,該幀中的數(shù)據(jù)字節(jié)存放的是
24、設(shè)備狀態(tài)信息。其他3種是單純的指令幀,數(shù)據(jù)字節(jié)為0字節(jié)。這3種指令幀長度最短,僅為6個(gè)字節(jié)。所以,通信過程中幀長小于6個(gè)字節(jié)的幀都認(rèn)為是錯(cuò)誤幀。幀結(jié)構(gòu)中類型字節(jié)的定義如表6.3所示。第 6 章 基于MCS-51的典型串行總線設(shè)計(jì)表表6.3 幀結(jié)構(gòu)中類型字節(jié)的定義幀結(jié)構(gòu)中類型字節(jié)的定義幀 類 型 字 節(jié) 說 明 ACTIVE 0 x11 主機(jī)詢問從機(jī)是否在位 GETDATA 0 x22 主機(jī)發(fā)送讀設(shè)備請(qǐng)求 READY 0 x33 從機(jī)應(yīng)答在位 SENDDATA 0 x44 從機(jī)發(fā)送設(shè)備狀態(tài)信息 第 6 章 基于MCS-51的典型串行總線設(shè)計(jì)下面采用簡(jiǎn)單的校驗(yàn)和方法來進(jìn)行幀的校驗(yàn),即先將所有的字節(jié)
25、相加,然后將結(jié)果截短到所需的位長,例如,4個(gè)字節(jié)102、8、78和200的校驗(yàn)和為132(經(jīng)過截短為1字節(jié)后)。發(fā)端將待發(fā)送的數(shù)據(jù)進(jìn)行校驗(yàn)和計(jì)算,將校驗(yàn)和值放在數(shù)據(jù)最后一起發(fā)送,在接收端對(duì)接收的數(shù)據(jù)進(jìn)行校驗(yàn)和計(jì)算,然后與收到的校驗(yàn)和字節(jié)比較來進(jìn)行誤碼判斷。設(shè)定要進(jìn)行校驗(yàn)和計(jì)算的字節(jié)包括地址字節(jié)、類型字節(jié)、數(shù)據(jù)長度字節(jié)和數(shù)據(jù)字節(jié),但不包括起始字節(jié)和結(jié)束字節(jié)。第 6 章 基于MCS-51的典型串行總線設(shè)計(jì)除了幀結(jié)構(gòu)的定義以外,整個(gè)系統(tǒng)的通信還需要遵守下列規(guī)則:(1) 主控機(jī)(PC機(jī))主導(dǎo)整個(gè)通信過程。由主控機(jī)定時(shí)輪詢各個(gè)節(jié)點(diǎn)處的從機(jī),并要求這些從機(jī)提交其對(duì)應(yīng)設(shè)備的狀態(tài)信息。(2) 主控機(jī)在發(fā)送完“
26、ACTIVE”指令幀后進(jìn)入接收狀態(tài),同時(shí)開啟超時(shí)控制。如果接收到錯(cuò)誤信息,則繼續(xù)等待;如果在規(guī)定時(shí)間里未能接收到從機(jī)的返回指令幀“READY”,則認(rèn)為從機(jī)不在位,取消這次查詢。第 6 章 基于MCS-51的典型串行總線設(shè)計(jì)(3) 主控機(jī)接收到從機(jī)返回指令幀“READY”后,發(fā)送“GETDATA”指令幀,進(jìn)入接收狀態(tài),同時(shí)開啟超時(shí)控制。如果接收到錯(cuò)誤信息,則繼續(xù)等待;如果在規(guī)定時(shí)間內(nèi)未能接收到從機(jī)的返回信息,則超時(shí)計(jì)數(shù)加1,并且主控機(jī)重新發(fā)送“GETDATA”指令幀;如果超時(shí)3次,則返回錯(cuò)誤信息,取消這次查詢。(4) 從機(jī)復(fù)位后,將等待主控機(jī)發(fā)送指令幀,并根據(jù)具體的指令內(nèi)容作出應(yīng)答。如果接收到的
27、指令幀錯(cuò)誤,則直接丟棄該幀,不作任何處理。第 6 章 基于MCS-51的典型串行總線設(shè)計(jì)6.3.3 硬件電路設(shè)計(jì)硬件電路設(shè)計(jì)在圖6.8所示的485總線現(xiàn)場(chǎng)監(jiān)測(cè)系統(tǒng)中,PC機(jī)為主控機(jī),它僅具有標(biāo)準(zhǔn)的RS-232接口,因此需有232/485轉(zhuǎn)接設(shè)備方可接入485總線網(wǎng)絡(luò),從而與網(wǎng)絡(luò)上的從設(shè)備進(jìn)行通信。圖6.9中,MC1488是驅(qū)動(dòng)器,MC1489為接收器,它們的作用是實(shí)現(xiàn)TTL電平和RS-232通信電平的轉(zhuǎn)化;PC147為光電隔離器件;U7為DC-DC功能模塊,其作用是將電源隔離,降低直流電源的干擾;U1為485驅(qū)動(dòng)收發(fā)芯片MAX481,它實(shí)現(xiàn)232/485電平轉(zhuǎn)接功能,其DE和引腳直接相連接,由
28、于該芯片為半雙工芯片,所以要么驅(qū)動(dòng)有效,要么接收有效,二者不能同時(shí)有效。第 6 章 基于MCS-51的典型串行總線設(shè)計(jì)圖6.9 232/485轉(zhuǎn)接卡原理圖第 6 章 基于MCS-51的典型串行總線設(shè)計(jì)485總線現(xiàn)場(chǎng)監(jiān)測(cè)系統(tǒng)中的單片機(jī)選用Atmel公司的AT89C52。系統(tǒng)的主要功能包括兩部分:數(shù)據(jù)采集和485總線接口,這兩個(gè)部分可以獨(dú)立設(shè)計(jì)。本節(jié)主要介紹與485的接口設(shè)計(jì)部分。圖6.10和圖6.11給出了AT89C52的485接口的硬件設(shè)計(jì)電路。第 6 章 基于MCS-51的典型串行總線設(shè)計(jì)圖6.10 單片機(jī)系統(tǒng)的485接口原理圖(1)第 6 章 基于MCS-51的典型串行總線設(shè)計(jì)圖6.11
29、單片機(jī)系統(tǒng)的485接口原理圖(2)第 6 章 基于MCS-51的典型串行總線設(shè)計(jì)圖6.11中,單片機(jī)的串口引腳RXD和TXD分別連接MAX481的RO和DI引腳,以進(jìn)行串行數(shù)據(jù)交換;控制引腳P1.6和P1.7分別連接MAX481的DE和引腳,以控制驅(qū)動(dòng)器和接收器使能。注意:這4個(gè)引腳均應(yīng)接上拉電阻。S1為一個(gè)DIP6開關(guān),和單片機(jī)AT89C52的P1.0P1.5引腳分別相連,用于設(shè)置本機(jī)的地址碼。由于MAX481實(shí)現(xiàn)的總線上最多帶32個(gè)負(fù)載,所以6位引腳足夠使用。應(yīng)當(dāng)注意,在讀取P1口獲取地址碼之前,需要先將其寄存器置1。MAX481的A和B引腳為485總線網(wǎng)絡(luò)的差分信號(hào)輸入/輸出端,二者之間
30、應(yīng)串接一個(gè)120 的電阻。 RE第 6 章 基于MCS-51的典型串行總線設(shè)計(jì)6.3.4 軟件設(shè)計(jì)軟件設(shè)計(jì)基于單片機(jī)AT89C52的485總線現(xiàn)場(chǎng)監(jiān)測(cè)系統(tǒng)的整個(gè)系統(tǒng)軟件分為主控機(jī)(PC機(jī))端和單片機(jī)端兩部分。主控機(jī)端軟件包括通信接口軟件、用戶界面、數(shù)據(jù)處理、后臺(tái)數(shù)據(jù)庫等。本節(jié)主要介紹通信接口軟件。主控機(jī)端通信接口部分的軟件流程圖如圖6.12所示。第 6 章 基于MCS-51的典型串行總線設(shè)計(jì)圖6.12 主控機(jī)端485通信接口部分的軟件流程圖第 6 章 基于MCS-51的典型串行總線設(shè)計(jì)單片機(jī)端軟件包括數(shù)據(jù)采集和基于485的通信程序。這兩個(gè)部分可以完全獨(dú)立。數(shù)據(jù)采集部分可設(shè)計(jì)為一個(gè)函數(shù),在主程序
31、中調(diào)用即可。單片機(jī)系統(tǒng)的通信軟件流程圖如圖6.13所示??梢钥闯?,整個(gè)程序的流程和協(xié)議設(shè)計(jì)密切相關(guān)。對(duì)于從機(jī)而言,其工作與主機(jī)狀態(tài)密切相關(guān),是完全被動(dòng)的,即根據(jù)主機(jī)的指令執(zhí)行相應(yīng)的操作。從機(jī)何時(shí)采集設(shè)備的狀態(tài)信息也取決于主機(jī),當(dāng)從機(jī)收到主機(jī)發(fā)送的讀設(shè)備狀態(tài)信息指令幀“GETDATA”時(shí),才開始采集信息并發(fā)送“SENDDATA”上報(bào)主機(jī)。值得注意的是,若節(jié)點(diǎn)設(shè)備狀態(tài)發(fā)生變化,則它并不會(huì)主動(dòng)通知主機(jī),主機(jī)也無法及時(shí)獲知并做出處理,因此需根據(jù)具體應(yīng)用設(shè)置主機(jī)使其定時(shí)輪詢各從機(jī)。第 6 章 基于MCS-51的典型串行總線設(shè)計(jì)圖6.13 單片機(jī)端485總線通信軟件流程圖第 6 章 基于MCS-51的典型
32、串行總線設(shè)計(jì)本實(shí)例的程序代碼與說明如下:#include /引用標(biāo)準(zhǔn)庫的頭文件#include #include #define uchar unsigned char #define uint unsigned int #define ACTIVE 0 x11#define GETDATA 0 x22#define READY 0 x33#define SENDDATA 0 x44第 6 章 基于MCS-51的典型串行總線設(shè)計(jì)#define RECFRMMAXLEN 16 /接收幀的最大長度,超過此值則認(rèn)為幀超長錯(cuò)誤#define STATUSMAXLEN 10/設(shè)備狀態(tài)信息的最大長度 #d
33、efine DATA0 0 x10/為簡(jiǎn)化起見,假設(shè)采集了10位固定的數(shù)據(jù)#define DATA1 0 x20#define DATA2 0 x30#define DATA3 0 x40#define DATA4 0 x50第 6 章 基于MCS-51的典型串行總線設(shè)計(jì)#define DATA5 0 x60#define DATA6 0 x70#define DATA7 0 x80#define DATA8 0 x90#define DATA9 0 xA0uchar DevNo;/設(shè)備號(hào)xdata uchar StatusBufSTATUSMAXLEN;第 6 章 基于MCS-51的典型串行
34、總線設(shè)計(jì)sbit DE = P16;/驅(qū)動(dòng)器使能,1有效sbit RE = P17;/接收器使能,0有效void init();/系統(tǒng)初始化void Get_Stat();/簡(jiǎn)化的數(shù)據(jù)采集函數(shù)bit Recv_Data(uchar *type);/接收數(shù)據(jù)幀函數(shù)void Send(uchar m);/發(fā)送單字節(jié)數(shù)據(jù)void Send_Data(uchar type,uchar len,uchar *buf);/發(fā)送數(shù)據(jù)幀函數(shù)第 6 章 基于MCS-51的典型串行總線設(shè)計(jì)void Clr_StatusBuf(); /清除設(shè)備狀態(tài)信息緩沖區(qū)函數(shù) void main(void) uchar type
35、; /* 初始化 */ init(); while (1) 第 6 章 基于MCS-51的典型串行總線設(shè)計(jì) if (Recv_Data(&type)=0) /接收幀錯(cuò)誤或者地址不符合,丟棄 continue; switch (type) case ACTIVE: /主機(jī)詢問從機(jī)是否在位 Send_Data(READY,0,StatusBuf); /發(fā)送 READY 指令 break; case GETDATA: /主機(jī)讀設(shè)備請(qǐng)求 Clr_StatusBuf(); Get_Stat(); /數(shù)據(jù)采集函數(shù) Send_Data(SENDDATA,strlen(StatusBuf),Statu
36、sBuf); break; 第 6 章 基于MCS-51的典型串行總線設(shè)計(jì) default: break; /指令類型錯(cuò)誤,丟棄當(dāng)前幀 /* 初始化 */ void init(void) P1 = 0 xff; 第 6 章 基于MCS-51的典型串行總線設(shè)計(jì) DevNo = (P1&0 x00111111); /讀取本機(jī)設(shè)備號(hào) TMOD = 0 x20; SCON = 0 x50; TH1 = 0 xfd; TL1 = 0 xfd; TR1 = 1; PCON = 0 x00; /SMOD=0 EA = 0; /* 接收數(shù)據(jù)幀函數(shù),實(shí)際上接收的是主機(jī)的指令 */ bit Recv_Da
37、ta(uchar *type) 第 6 章 基于MCS-51的典型串行總線設(shè)計(jì) uchar tmp,rCount,i; uchar r_bufRECFRMMAXLEN; /保存接收到的幀 uchar Flag_RecvOver; /一幀接收結(jié)束標(biāo)志 uchar Flag_StartRec; /一幀接收開始標(biāo)志 uchar CheckSum; /校驗(yàn)和 uchar DataLen; /數(shù)據(jù)字節(jié)長度變量 /* 禁止發(fā)送,允許接收 */ DE = 0; RE = 0; /* 接收一幀數(shù)據(jù) */ rCount = 0; Flag_StartRec = 0; Flag_RecvOver = 0; 第 6
38、 章 基于MCS-51的典型串行總線設(shè)計(jì) while (!Flag_RecvOver) RI = 0; while (!RI); tmp = SBUF; RI=0; /* 判斷是否收到字符$,其數(shù)值為 0 x24 */ if (!Flag_StartRec) & (tmp = 0 x24) Flag_StartRec = 1; 第 6 章 基于MCS-51的典型串行總線設(shè)計(jì) if (Flag_StartRec) r_bufrCount = tmp; rCount +; /* 判斷是否收到字符*, 其數(shù)值為 0 x2A, 根據(jù)接收的指令設(shè)置相應(yīng)標(biāo)志位 */ if (tmp = 0 x2A
39、) Flag_RecvOver = 1; if (rCount = RECFRMMAXLEN) /幀超長錯(cuò)誤,返回 0 return 0; 第 6 章 基于MCS-51的典型串行總線設(shè)計(jì) /* 計(jì)算校驗(yàn)和字節(jié) */ CheckSum = 0; DataLen = r_buf3; for (i=0;i+;i3+DataLen) CheckSum = CheckSum + r_bufi+1; /* 判斷幀是否錯(cuò)誤 */ if (rCount6) /幀過短,錯(cuò)誤,返回 0,最短的指令幀為 6 個(gè)字節(jié) return 0; if (r_buf1!=DevNo) /地址不符合,錯(cuò)誤,返回 0 第 6 章
40、基于MCS-51的典型串行總線設(shè)計(jì) return 0; if (r_bufrCount-2!=CheckSum) /校驗(yàn)錯(cuò)誤,返回 0 return 0; *type = r_buf2; /獲取指令類型 return 1; /成功,返回 1 /* 發(fā)送數(shù)據(jù)幀函數(shù) */ void Send_Data(uchar type,uchar len,uchar *buf) 第 6 章 基于MCS-51的典型串行總線設(shè)計(jì) uchar i,tmp; uchar CheckSum = 0; /* 允許發(fā)送,禁止接收 */ DE = 1; RE = 1; /* 發(fā)送幀起始字節(jié) */ tmp = 0 x24; S
41、end(tmp); Send(DevNo); /發(fā)送地址字節(jié),即設(shè)備號(hào) CheckSum = CheckSum + DevNo; 第 6 章 基于MCS-51的典型串行總線設(shè)計(jì) Send(type); /發(fā)送類型字節(jié) CheckSum = CheckSum + type; Send(len); /發(fā)送數(shù)據(jù)長度字節(jié) CheckSum = CheckSum + len; /* 發(fā)送數(shù)據(jù) */ for (i=0;ilen;i+) Send(*buf); CheckSum = CheckSum + *buf; buf+; Send(CheckSum); /發(fā)送校驗(yàn)和字節(jié) /* 發(fā)送幀結(jié)束字節(jié) */ t
42、mp = 0 x2A; Send(tmp); 第 6 章 基于MCS-51的典型串行總線設(shè)計(jì)/* 采集數(shù)據(jù)函數(shù)經(jīng)過簡(jiǎn)化處理,取固定的 10 個(gè)字節(jié)數(shù)據(jù) */ void Get_Stat(void) StatusBuf0=DATA0; StatusBuf1=DATA1; StatusBuf2=DATA2; StatusBuf3=DATA3; StatusBuf4=DATA4; StatusBuf5=DATA5; StatusBuf6=DATA6; StatusBuf7=DATA7; StatusBuf8=DATA8; StatusBuf9=DATA9; 第 6 章 基于MCS-51的典型串行總線
43、設(shè)計(jì)/* 發(fā)送單字節(jié)數(shù)據(jù) */ void Send(uchar m) TI = 0; SBUF = m; while(!TI); TI = 0; /* 清除設(shè)備狀態(tài)信息緩沖區(qū)函數(shù)*/ void Clr_StatusBuf(void) uchar i; for (i=0;iSTATUSMAXLEN;i+) StatusBufi = 0; 第 6 章 基于MCS-51的典型串行總線設(shè)計(jì)6.3.5 小結(jié)小結(jié)本節(jié)以基于單片機(jī)AT89C52的485總線現(xiàn)場(chǎng)監(jiān)測(cè)系統(tǒng)為例,詳細(xì)介紹了RS-485接口的硬件軟件設(shè)計(jì)。在本例的設(shè)計(jì)過程中,應(yīng)注意下列事項(xiàng):(1) 采用MAX481芯片來實(shí)現(xiàn)485接口,決定了該例所
44、實(shí)現(xiàn)的485總線網(wǎng)絡(luò)是半雙工通信網(wǎng)絡(luò)。若需要實(shí)現(xiàn)全雙工,則可選擇MAX490、MAX491等其他支持全雙工的485總線驅(qū)動(dòng)芯片。第 6 章 基于MCS-51的典型串行總線設(shè)計(jì)(2) 485總線網(wǎng)絡(luò)的傳輸物理介質(zhì)為雙絞線。(3) PC機(jī)無485接口,若要接入485總線網(wǎng)絡(luò),須對(duì)其進(jìn)行232/485接口電路轉(zhuǎn)換。(4) 由于需要通過485總線實(shí)現(xiàn)數(shù)據(jù)通信,因此和通信相關(guān)的協(xié)議設(shè)計(jì)亦為軟件設(shè)計(jì)的重要內(nèi)容。第 6 章 基于MCS-51的典型串行總線設(shè)計(jì)I2C總線(Inter IC Bus)是Philips公司推出的芯片間串行傳輸總線,與SPI、Microwire/Plus接口不同,它以兩根連線即可實(shí)現(xiàn)
45、全雙工同步數(shù)據(jù)傳送,可方便地構(gòu)成多機(jī)通信系統(tǒng)或者外設(shè)擴(kuò)展系統(tǒng)。I2C總線采用了器件地址的硬件設(shè)計(jì)方法,通過軟件尋址完全避免了器件的片選尋址,從而使硬件擴(kuò)展系統(tǒng)等變得簡(jiǎn)單、靈活、方便。按照I2C總線規(guī)范,總線傳輸中所有狀態(tài)都生成相對(duì)應(yīng)的狀態(tài)碼,系統(tǒng)中的主機(jī)能夠依照這些狀態(tài)碼自動(dòng)地進(jìn)行總線管理,啟動(dòng)I2C總線就能自動(dòng)完成規(guī)定的數(shù)據(jù)傳送操作。6.4 I2C 總總 線線第 6 章 基于MCS-51的典型串行總線設(shè)計(jì)6.4.1 I2C總線的工作原理總線的工作原理在基于I2C總線特點(diǎn)的單片機(jī)系統(tǒng)中,其內(nèi)部資源具有I2C總線輸入/輸出接口的電氣結(jié)構(gòu)、可設(shè)置的相關(guān)特殊功能寄存器(SFR)以及所提供的標(biāo)準(zhǔn)程序模
46、塊,為用戶采用I2C總線進(jìn)行系統(tǒng)設(shè)計(jì)和應(yīng)用軟件的編程帶來了極大的方便。第 6 章 基于MCS-51的典型串行總線設(shè)計(jì)I2C 總線的串行數(shù)據(jù)傳送與一般UART的串行數(shù)據(jù)傳送無論是從接口電氣特性、傳送狀態(tài)管理還是從程序的編制上都有很大的差異,其主要特點(diǎn)如下:(1) 二線傳輸。I2C總線上所有的節(jié)點(diǎn),如主器件(單片機(jī)、微處理器)、外圍器件、接口模塊等都連在同名端SCL(時(shí)鐘線)和SDA(數(shù)據(jù)線)上。(2) 系統(tǒng)中有多個(gè)主器件時(shí),這些器件可以作為總線的主控制器(無中心主機(jī))。I2C總線工作時(shí)任何一個(gè)主器件都有可能成為主控制器,多機(jī)競(jìng)爭(zhēng)時(shí)的時(shí)鐘同步與總線仲裁都由硬件與軟件模塊自動(dòng)完成。第 6 章 基于M
47、CS-51的典型串行總線設(shè)計(jì)(3) I2C總線傳輸時(shí),采用狀態(tài)碼管理方法。對(duì)于總線傳輸時(shí)的任何一種狀態(tài),在狀態(tài)寄存器中都會(huì)出現(xiàn)相應(yīng)的狀態(tài)碼,并會(huì)自動(dòng)進(jìn)入相應(yīng)的狀態(tài)處理程序進(jìn)行自動(dòng)處理。(4) 系統(tǒng)中的所有外圍器件及模塊均采用器件地址和引腳地址的編址方法。系統(tǒng)中主控制器對(duì)任意節(jié)點(diǎn)的尋址采用純軟件的尋址方式,避免了片選的連線方法。系統(tǒng)中若有地址編碼沖突,則可通過改變地址的引腳電平來解決。第 6 章 基于MCS-51的典型串行總線設(shè)計(jì)(5) 所有帶有I2C接口的外圍器件都具有應(yīng)答功能。片內(nèi)有多個(gè)單元地址時(shí),數(shù)據(jù)讀/寫都具有自動(dòng)加1功能。這樣,在I2C總線對(duì)某一器件讀/寫多個(gè)字節(jié)時(shí)很容易實(shí)現(xiàn)自動(dòng)操作,
48、即準(zhǔn)備好讀/寫入口條件后,只需啟動(dòng)I2C總線就可以完成N個(gè)字節(jié)的讀/寫操作。(6) I2C總線電氣接口由漏極開路的晶體管組成,開路輸出端未連到電源的鉗位二極管,而是連到I2C 總線的每個(gè)器件上,其自身電源可以獨(dú)立,但必須共地??偩€上各個(gè)節(jié)點(diǎn)可以在系統(tǒng)帶電的情況下直接接入或撤出。第 6 章 基于MCS-51的典型串行總線設(shè)計(jì)I2C總線的時(shí)鐘線SCL和數(shù)據(jù)線SDA都是雙向數(shù)據(jù)線??偩€備用時(shí)二者都必須保持高電平狀態(tài),僅在關(guān)閉I2C總線時(shí)才能使SCL鉗位在低電平。在標(biāo)準(zhǔn)I2C模式下數(shù)據(jù)傳送速率可達(dá)100 kb/s,高速模式下可達(dá)400 kb/s??偩€驅(qū)動(dòng)能力受總線電容限制,不加驅(qū)動(dòng)擴(kuò)展時(shí)驅(qū)動(dòng)能力為40
49、0 pF。第 6 章 基于MCS-51的典型串行總線設(shè)計(jì)6.4.2 I2C總線的通信時(shí)序總線的通信時(shí)序I2C總線的工作時(shí)序如圖6.14所示。第 6 章 基于MCS-51的典型串行總線設(shè)計(jì)圖6.14 I2C總線的工作時(shí)序圖第 6 章 基于MCS-51的典型串行總線設(shè)計(jì)I2C總線時(shí)序工作的基本條件如下:(1) 起停控制。當(dāng)SCL為高電平,SDA電平由高變低時(shí),數(shù)據(jù)開始傳送。所有的操作均必須在開始之后進(jìn)行。當(dāng)SCL為高電平,SDA電平由低變?yōu)楦邥r(shí),數(shù)據(jù)傳送結(jié)束。在結(jié)束條件下,所有操作都不能進(jìn)行。如果產(chǎn)生重復(fù)起始條件而不產(chǎn)生停止條件,則總線會(huì)一直處于忙狀態(tài)。(2) 數(shù)據(jù)的有效轉(zhuǎn)換。當(dāng)時(shí)鐘線SCL為高電
50、平時(shí),數(shù)據(jù)線SDA必須保持穩(wěn)定。若數(shù)據(jù)線SDA改變,則必須在時(shí)鐘線SCL為低時(shí)方可進(jìn)行。第 6 章 基于MCS-51的典型串行總線設(shè)計(jì)(3) 總線空閑。當(dāng)數(shù)據(jù)總線SDA和時(shí)鐘總線SCL都為高電平時(shí),為空閑狀態(tài)。(4) 發(fā)送到SDA線上的每個(gè)字節(jié)必須為8位,每次傳輸可以發(fā)送的字節(jié)數(shù)量不受限制,每個(gè)字節(jié)后必須跟一個(gè)響應(yīng)位,首先傳輸?shù)氖菙?shù)據(jù)的最高位MSB。若從機(jī)需要完成某些其他功能后(例如一個(gè)內(nèi)部中斷服務(wù)程序)才能接收或發(fā)送下一個(gè)完整的數(shù)據(jù)字節(jié),則此時(shí)可以使時(shí)鐘線SCL保持低電平從而迫使主機(jī)進(jìn)入等待狀態(tài),在從機(jī)準(zhǔn)備好接收下一個(gè)數(shù)據(jù)字節(jié)并釋放時(shí)鐘線SCL后使數(shù)據(jù)傳輸繼續(xù)。第 6 章 基于MCS-51的
51、典型串行總線設(shè)計(jì)(5) 響應(yīng)。數(shù)據(jù)傳輸必須帶響應(yīng),相關(guān)的響應(yīng)時(shí)鐘脈沖由主機(jī)產(chǎn)生,在響應(yīng)時(shí)鐘脈沖期間發(fā)送器釋放SDA線(高),在響應(yīng)的時(shí)鐘脈沖期間,接收器必須將SDA線拉低使它在這個(gè)時(shí)鐘脈沖的高電平期間保持穩(wěn)定的低電平。注意:必須考慮建立和保持時(shí)間。第 6 章 基于MCS-51的典型串行總線設(shè)計(jì)(6) 仲裁。主機(jī)只能在總線空閑時(shí)啟動(dòng)傳輸,兩個(gè)或多個(gè)主機(jī)可能在起始條件的最小持續(xù)時(shí)間內(nèi)產(chǎn)生一個(gè)規(guī)定的起始條件。當(dāng)SCL線是高電平時(shí)仲裁在SDA線發(fā)生,這樣在其他主機(jī)發(fā)送低電平時(shí)發(fā)送高電平的主機(jī)將斷開它的數(shù)據(jù)輸出級(jí),因?yàn)榭偩€上的電平與其自身的電平不同。仲裁可以持續(xù)多位,它的第一個(gè)階段是比較地址位。如果每個(gè)
52、主機(jī)都嘗試尋址相同的器件,則仲裁會(huì)繼續(xù)比較數(shù)據(jù)位(如果是主機(jī)-發(fā)送器),或者比較響應(yīng)位(如果是主機(jī)-接收器)。因?yàn)镮2C總線的地址和數(shù)據(jù)信息由贏得仲裁的主機(jī)決定,在仲裁過程中不會(huì)丟失信息。丟失仲裁的主機(jī)可以產(chǎn)生時(shí)鐘脈沖直到丟失仲裁的該字節(jié)末尾。第 6 章 基于MCS-51的典型串行總線設(shè)計(jì)在進(jìn)行數(shù)據(jù)傳送之前,I2C總線會(huì)首先發(fā)送一個(gè)字節(jié)進(jìn)行尋址。這個(gè)字節(jié)一般緊跟在起始條件之后發(fā)送,表示需要通信的從器件地址。其格式定義如下:D7D1 D0 從地址 讀/寫 第 6 章 基于MCS-51的典型串行總線設(shè)計(jì)地址信息是7bit,占用了地址字節(jié)的高7位,可以對(duì)127個(gè)器件進(jìn)行尋址。該字節(jié)的第0bit用于表
53、示數(shù)據(jù)的傳送方向:當(dāng)該位是高電平時(shí),表示由從器件向主器件發(fā)送數(shù)據(jù),即主器件對(duì)從器件進(jìn)行讀操作;當(dāng)該位為低電平時(shí),表示由主器件向從器件發(fā)送數(shù)據(jù),即主器件對(duì)從器件進(jìn)行寫操作。起始條件后,總線中各個(gè)器件將自己的地址與主器件送到總線上的器件地址進(jìn)行比較,如果發(fā)生匹配,則該器件認(rèn)為被主器件尋址。一般來說,從器件的地址由一部分固定地址和一部分可變地址組成,而可變地址確定了在I2C總線上可容納的此類器件的最多數(shù)目。 第 6 章 基于MCS-51的典型串行總線設(shè)計(jì)6.4.3 硬件電路設(shè)計(jì)硬件電路設(shè)計(jì)由于標(biāo)準(zhǔn)的MCS-51單片機(jī)不具備I2C總線接口,MCS-51單片機(jī)在擴(kuò)展具有I2C總線的芯片時(shí)可利用單片機(jī)的I
54、/O接口與之相連,在程序中利用位操作指令及移位指令模仿I2C總線的操作時(shí)序并編寫相應(yīng)的程序。圖6.15為89C52單片機(jī)實(shí)現(xiàn)I2C總線的硬件原理圖。 第 6 章 基于MCS-51的典型串行總線設(shè)計(jì)圖6.15 單片機(jī)實(shí)現(xiàn)I2C總線的硬件原理圖 第 6 章 基于MCS-51的典型串行總線設(shè)計(jì)6.4.4 軟件設(shè)計(jì)軟件設(shè)計(jì)單片機(jī)模擬I2C總線向從器件發(fā)送數(shù)據(jù)和由從器件接收數(shù)據(jù)的程序流程圖分別如圖6.16(a)、(b)所示。第 6 章 基于MCS-51的典型串行總線設(shè)計(jì)圖6.16 程序流程圖第 6 章 基于MCS-51的典型串行總線設(shè)計(jì)程序如下:#include /引用標(biāo)準(zhǔn)庫的頭文件#include #
55、define uchar unsigned char #define uint unsigned int sbit SDA = P12; /串行數(shù)據(jù)sbit SCL = P13; /串行時(shí)鐘uchar idata slave_dev_adr; /從器件地址uchar idata sendbuf8; /數(shù)據(jù)發(fā)送緩沖區(qū)uchar idata receivebuf8; /數(shù)據(jù)接收緩沖區(qū)第 6 章 基于MCS-51的典型串行總線設(shè)計(jì)bit bdata Nack; /器件壞或錯(cuò)誤標(biāo)志位bit bdata NackFlag; /非應(yīng)答標(biāo)志位void delay5us(); /延時(shí)約5微秒,對(duì)于12 MHz
56、時(shí)鐘 void start(void); /起始條件子函數(shù) void stop(void); /停止條件子函數(shù) void ack(void); /發(fā)送應(yīng)答子函數(shù) void n_ack(void); /發(fā)送非應(yīng)答子函數(shù) void checkack(void);/應(yīng)答位檢查子函數(shù) 第 6 章 基于MCS-51的典型串行總線設(shè)計(jì)void sendbyte(uchar idata *ch);/發(fā)送一字節(jié)數(shù)據(jù)子函數(shù) void recbyte(uchar idata *ch); /接收一字節(jié)子程序 void sendnbyte(uchar idata *sla, uchar n); /發(fā)送n字節(jié)數(shù)據(jù)子程序
57、 void recnbyte(uchar idata *sla, uchar n); /接收n字節(jié)數(shù)據(jù)子程序 /* 主函數(shù),模擬實(shí)現(xiàn)I2C總線的數(shù)據(jù)收發(fā) */void main(void)uchar i,numbyte;numbyte = 8; /* 需發(fā)送的8字節(jié)數(shù)據(jù) */for (i=0;inumbyte;i+)sendbufi = i+0 x11;第 6 章 基于MCS-51的典型串行總線設(shè)計(jì)slave_dev_adr = 0 x58; /從器件地址 sendnbyte(&slave_dev_adr,numbyte);/向從器件發(fā)送存放在 sendbuf8中的 8 字 節(jié)數(shù)據(jù) f
58、or (i=0;i10000;i+) delay5us(); recnbyte(&slave_dev_adr,numbyte);/由從器件接收 8 字節(jié)數(shù)據(jù),存放在 rbuf 中 /* 延時(shí)約 5 微秒,對(duì)于 12 MHz 時(shí)鐘 */ void delay5us() uint i; for (i=0;i5;i+) _nop_(); 第 6 章 基于MCS-51的典型串行總線設(shè)計(jì)/* 起始條件子函數(shù) */ void start(void) SDA = 1; /啟動(dòng) I2C 總線 SCL = 1; delay5us(); SDA = 0; delay5us(); SCL = 0; /* 停
59、止條件子函數(shù) */ void stop(void) SDA = 0; /停止 I2C 總線數(shù)據(jù)傳送 第 6 章 基于MCS-51的典型串行總線設(shè)計(jì) SCL = 1; delay5us(); SDA = 1; delay5us(); SCL = 0; /* 發(fā)送應(yīng)答子函數(shù) */ void ack(void) SDA = 0; /發(fā)送應(yīng)答位 SCL = 1; delay5us(); SDA = 1; SCL = 0; 第 6 章 基于MCS-51的典型串行總線設(shè)計(jì)/* 發(fā)送非應(yīng)答子函數(shù) */ void n_ack(void) SDA = 1; /發(fā)送非應(yīng)答位 SCL = 1; delay5us(); SDA = 0; SCL = 0; /* 應(yīng)答位檢查子函數(shù) */ void checkack(void) 第 6 章 基于MCS-51的典型串行總線設(shè)計(jì) SDA = 1; /應(yīng)答位檢查(將 P1.0 設(shè)置成輸入,必須先向端口寫 1) SCL = 1; NackFlag = 0; if (SDA = 1) /若 SDA=1,則表明非應(yīng)答,置位非應(yīng)答標(biāo)志 F0 NackFlag
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度醫(yī)療器械生產(chǎn)許可資質(zhì)轉(zhuǎn)讓合同3篇
- 二零二五年度金融機(jī)構(gòu)公對(duì)公匯款業(yè)務(wù)合作協(xié)議3篇
- 2025年度房地產(chǎn)公司掛靠合作經(jīng)營管理協(xié)議3篇
- 2025年度環(huán)保技術(shù)兼職合同3篇
- 2025年度新型商業(yè)空間使用權(quán)轉(zhuǎn)讓合同3篇
- 二零二五年度競(jìng)業(yè)協(xié)議期限及競(jìng)業(yè)限制解除賠償2篇
- 二零二五年度國有企業(yè)勞動(dòng)用工合同范本3篇
- 2025年度新材料研發(fā)與應(yīng)用合伙人股權(quán)合作協(xié)議書3篇
- 2025年度留學(xué)生實(shí)習(xí)實(shí)訓(xùn)項(xiàng)目資金資助協(xié)議3篇
- 二零二五年度大米產(chǎn)業(yè)鏈品牌建設(shè)與市場(chǎng)營銷服務(wù)合同3篇
- 2024-2030年中國釬焊板式換熱器行業(yè)市場(chǎng)發(fā)展趨勢(shì)與前景展望戰(zhàn)略分析報(bào)告
- 駕駛證吊銷附議申請(qǐng)書
- 水務(wù)集團(tuán)定崗定員方案范文
- 2023-2024學(xué)年河北省高二上學(xué)期期末考試生物試題(解析版)
- 金剛砂固化地坪施工合同
- 車輛駕駛考試培訓(xùn)委托書
- 開票稅點(diǎn)自動(dòng)計(jì)算器
- 2024親戚借名買房協(xié)議書
- 小學(xué)二年級(jí)上冊(cè)數(shù)學(xué)-數(shù)角的個(gè)數(shù)專項(xiàng)練習(xí)
- 醫(yī)療器械質(zhì)量安全風(fēng)險(xiǎn)會(huì)商管理制度
- 《我愛上班》朗誦稿
評(píng)論
0/150
提交評(píng)論