版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
網(wǎng)絡空間安全學院網(wǎng)絡安全基礎技術(shù)應用第七章I2C總線開發(fā)目錄CONTENT7.1.I2C總線標準7.2.GPIO模擬I2C總線協(xié)議的開發(fā)技術(shù)7.3.STC單片機I2C功能模塊開發(fā)技術(shù)7.1.I2C總線標準I2C總線只有兩根雙向信號線:一根是數(shù)據(jù)線SDA,另一根是時鐘線SCL,通常用于芯片和芯片之間的數(shù)據(jù)交換,是串行總線半雙工通信。I2C器件的應用優(yōu)點:減少了電路間連線,減小了電路板尺寸,標準化通信過程,降低了硬件成本,并提高了系統(tǒng)可靠性。7.1.1.I2C總線基本概念I2C是一種串行總線,是在微電子通信控制領域廣泛采用的一種總線標準。它是同步通信的一種特殊形式,具有接口線少,控制方式簡化,器件封裝形式小,通信速率較高等優(yōu)點。圖7.1-1展示了I2C總線傳輸過程,Master是主機,Slave是從機,根據(jù)各器件的功能角色可劃分發(fā)送端、接收端,根據(jù)各器件的主從地位又可劃分為主器件、從器件。I2C總線只有兩根雙向信號線:一根是數(shù)據(jù)線SDA,另一根是時鐘線SCL,在主從通信中,可以有多個I2C總線器件同時接到I2C總線上,通過地址來識別通信對象。圖7.1-1I2C總線基本概念7.1.1.I2C總線基本概念發(fā)送端:發(fā)送數(shù)據(jù)到總線上的器件。接收器:從總線上接收數(shù)據(jù)的器件。主機:為啟動數(shù)據(jù)傳送(START指令)、產(chǎn)生時鐘(SCL)信號并中止數(shù)據(jù)傳送(STOP指令)的器件,也稱主控端,SCL信號必須由主控端發(fā)送,主控端是發(fā)送端或接收端。從機:被主器件尋址的器件。從屬端可以扮演接收端或發(fā)送端的角色。當發(fā)送端器件可以主動將數(shù)據(jù)放到總線,稱為主控發(fā)送端;若可以回應主控端的要求,稱為從屬發(fā)送端。當接收端器件可以主動接收數(shù)據(jù)時,稱為主控接收端;若依照主控端要求而接收,稱為從屬接收端。7.1.2.I2C總線結(jié)構(gòu)I2C總線上數(shù)據(jù)的傳輸速率在標準模式下可達100kbit/s,在快速模式下可達400kbit/s,在高速模式下可達3.4Mbit/s,典型的I2C總線結(jié)構(gòu)見圖7.1-2,所有I2C設備上的串行數(shù)據(jù)SDA都接到總線的SDA上,各設備的時鐘線SCL接到總線的SCL上。在總線上至少必須有一個主控端,在圖7.1-2中,主控端可以是單片機A或是單片機B。圖7.1-2I2C總線結(jié)構(gòu)7.1.2.I2C總線結(jié)構(gòu)SDA和SCL都是雙向線路,I2C總線需通過上拉電阻接正電源,當總線空閑時,兩根線均為高電平,總線上任一器件輸出的低電平,都將使總線的信號變低,即各器件的SDA及SCL都是線與關系,見圖7.1-3。所謂“線與”是指連接到總線的器件輸出級是漏極開路或集電極開路,此時只要有一個器件輸出低電平,總線就被拉低。圖7.1-3I2C總線電路原理圖7.1.2.I2C總線結(jié)構(gòu)如圖7.1-4所示,在I2C總線系統(tǒng)中,CPU是核心,I2C總線由CPU電路引出,其他被控對象均掛接在I2C總線上。CPU是主機,掛接在總線上的設備是從機,SCL上的時鐘信號始終由主機產(chǎn)生。圖7.1-4CPU和被控對象的連接方式每個接到I2C總線上的器件都有唯一的地址。主機與其它器件間的數(shù)據(jù)傳送可以是由主機發(fā)送數(shù)據(jù)到其它器件,這時主機即為發(fā)送器。由總線上接收數(shù)據(jù)的器件則為接收器。在單片機應用系統(tǒng)的串行總線擴展中,我們經(jīng)常遇到的是以單片機為主機,其它接口器件為從機的單主機情況。7.1.3.I2C總線的通信格式圖7.1-5是I2C總線的時序圖:SCL是節(jié)拍周期Clock;SDA是數(shù)據(jù)位。每個節(jié)拍上都有一個數(shù)據(jù)位在傳輸。發(fā)送器給出起始位,每發(fā)出一個字節(jié),接收器都要應答一次,給出ACK信號。發(fā)送器的數(shù)據(jù)發(fā)送完畢后,發(fā)出停止位。圖7.1-5I2C時序圖7.1.3.I2C總線的通信格式I2C總線時序圖關鍵描述如下:起始START信號:當SCL=1階段中,在SDA上有一個下降沿跳變,標識著數(shù)據(jù)傳輸啟動。停止STOP信號:當SCL=1階段中,在SDA上有一個上升沿跳變,標識著數(shù)據(jù)傳輸停止。應答ACK信號:SDA=0,表示接收成功,否則是接收失敗,或者無應答。最后一個字節(jié)接收器可以不應答。在數(shù)據(jù)傳輸?shù)倪^程中必須通過ACK信號來保證數(shù)據(jù)的有效性。I2C總線進行數(shù)據(jù)傳送時,時鐘信號為高電平期間,數(shù)據(jù)線上的數(shù)據(jù)必須保持穩(wěn)定,只有在時鐘線上的信號為低電平期間,數(shù)據(jù)線上的高電平或低電平狀態(tài)才允許變化,見圖7.1-6所示。圖7.1-6數(shù)據(jù)位傳輸?shù)臅r序7.1.3.I2C總線的通信格式從圖7.1-1到圖7.1-6主機和從機都共享一根SDA、SCL,為了說清楚一個字節(jié)中SDA的控制情況,圖7.1-7中用了2根SDA示意了主機SDA和從機SDA的信號情況——主機是發(fā)送端,前8個時鐘都由主機控制SDA的電平狀態(tài),第9個時鐘由從機控制SDA的電平。主機傳送完畢一個字節(jié),從機可以不應答,稱為“非應答”,SDA保持高電平不變,說明字節(jié)接收不成功;從機“應答”,則從機把SDA拉低,表示字節(jié)接收成功。圖7.1-7一個字節(jié)的傳輸演示7.1.3.I2C總線的通信格式圖7.1-8給出了起始、終止、應答、非應答的時間標準。在程序編寫時,需要注意各個信號的最小持續(xù)時間要求。例如,起始信號S中SDA的高電平保持時間需大于4.7微秒,若此過程中SDA跳變?yōu)榈碗娖胶螅瑒tSCL信號大于4微秒后才能變化為低電平,從另一個角度看,即SDA數(shù)據(jù)建立時間需大于4微秒才能滿足I2C的時間標準。圖7.1-8數(shù)據(jù)傳輸位的時間標準7.2.GPIO模擬I2C總線協(xié)議的開發(fā)技術(shù)I2C總線簡單方便,是芯片間通信經(jīng)常使用的一種總線,很多芯片都具有I2C接口。當MCU沒有I2C功能模塊時,可利用通用輸入輸出管腳模擬I2C總線協(xié)議。7.2.1.GPIO模擬I2C總線的驅(qū)動函數(shù)對照圖7.1-7、圖7.1-8時序圖,書寫I2C總線單字節(jié)讀寫函數(shù),放置在i2c.c文件中,文件中的函數(shù)說明如表7.2-1所示。序號函數(shù)名函數(shù)說明1voidi2c_delay(unsignedchari)I2C總線延時2voidi2c_start(void)I2C總線起始信號S,在SCL是高電平期間,SDA從高電平變低,該下降沿意味著傳輸?shù)钠鹗肌?voidi2c_stop(void)I2C總線終止信號P,在SCL是高電平期間,SDA從低電平變高,該上升沿意味著傳輸?shù)慕Y(jié)束。4voidi2c_sendbyte(unsignedcharbyt)總線發(fā)送函數(shù),函數(shù)輸入?yún)?shù)是發(fā)送內(nèi)容。5unsignedchari2c_waitack(void)總線等待應答函數(shù),返回值是從機應答位。6unsignedchari2c_receivebyte(void)總線接收函數(shù),返回值是接收內(nèi)容。7voidi2c_sendack(unsignedcharackbit)總線發(fā)送應答函數(shù),函數(shù)輸入?yún)?shù)是應答位電平。表7.2-1GPIO模擬I2C總線的驅(qū)動函數(shù)7.2.1.GPIO模擬I2C總線的驅(qū)動函數(shù)i2c.c文件見二維碼7.2-1。二維碼7.2-1GPIO模擬I2C總線驅(qū)動程序7.2.2.GPIO模擬I2C總線訪問PCF8591數(shù)模轉(zhuǎn)換ADC芯片PCF8591是單片、單電源低功耗8位ADC芯片,具有4個模擬輸入、一個輸出和一個串行I2C總線接口,采用8位逐次逼近式AD轉(zhuǎn)換,主要應用于電池供電、汽車、音響等模擬數(shù)據(jù)采集。ADC的最大轉(zhuǎn)換速率取決于I2C總線的最高速率。PCF8591采用I2C總線接口與CPU交換數(shù)據(jù),它將采集到的模擬量轉(zhuǎn)換成二進制數(shù)值,輸出到I2C總線上。圖7.2-1是PCF8591芯片管腳圖,圖7.2-2表明器件的通道3連接電位器,電位器電壓可調(diào),圖7.2-3是PCF8591的工作電路圖,PCF8591通過I2C總線(P20、P21)與上位機MCU通信。圖7.2-1圖PCF8591器件管腳圖
圖7.2-2
通道3電位器電壓采集7.2.2.GPIO模擬I2C總線訪問PCF8591數(shù)模轉(zhuǎn)換ADC芯片圖7.2-3圖
PCF8591工作電路圖7.2.2.GPIO模擬I2C總線訪問PCF8591數(shù)模轉(zhuǎn)換ADC芯片1.寫時序:寫時序如圖7.2-4所示,這個過程是單片機寫數(shù)據(jù)到ADC器件。由起始信號S、PCF8591器件地址(Address)、控制字節(jié)(ControlByte)、N個數(shù)據(jù)字節(jié)(DataByte),以及停止位組成。每寫完一個字節(jié),單片機都要釋放總線,接收來自PCF8591的應答。圖7.2-4PCF8591的寫時序圖7.2-5是ADC器件地址編碼,高四位固定1001,低四位可編程,最后一位表示讀寫方向,“1”表示讀器件,“0”表示寫器件。圖7.2-5ADC器件的地址編碼7.2.2.GPIO模擬I2C總線訪問PCF8591數(shù)模轉(zhuǎn)換ADC芯片圖7.2-6是控制字節(jié),規(guī)定了PCF8591的工作方式,控制字節(jié)每個位的定義:D1D0:A/D通道編號。00——通道0;01——通道1;10——通道2;11——通道3。D2:自動增益選擇,當該位是“1”時表示自動增益,否則手動增益。D5D4:模擬量輸入方式,00——四路單端輸入;01——三路差分輸入;10——兩兩單端與一路差分;11——兩路差分。D6:模擬輸出使能。當AD模擬-數(shù)字轉(zhuǎn)換時該位是“0”,當DA數(shù)字-模擬轉(zhuǎn)換時該位“1”。圖7.2-6PCF8591的控制寄存器7.2.2.GPIO模擬I2C總線訪問PCF8591數(shù)模轉(zhuǎn)換ADC芯片按照圖7.2-4書寫單片機初始化ADC器件的代碼如下:voidinit_pcf8591(void){ i2c_start(); i2c_sendbyte(0x90);//器件地址 i2c_waitack(); i2c_sendbyte(0x03);//控制字節(jié),ADC通道3模擬量輸入 i2c_waitack(); i2c_stop(); }7.2.2.GPIO模擬I2C總線訪問PCF8591數(shù)模轉(zhuǎn)換ADC芯片2.讀時序:圖7.2-7是PCF8591的讀時序,這個過程是單片機獲取ADC數(shù)據(jù)的時序,由起始位(S)、器件地址(Address)、N個轉(zhuǎn)換數(shù)據(jù)及停止位構(gòu)成。首先單片機寫器件地址,然后等待來自PCF8591的應答,接著PCF8591發(fā)送內(nèi)容到總線,每發(fā)送一個字節(jié),主機都應答一次,如果主機不應答(發(fā)送1),主機隨后發(fā)送停止位。圖7.2-7PCF8591的讀時序7.2.2.GPIO模擬I2C總線訪問PCF8591數(shù)模轉(zhuǎn)換ADC芯片按照圖7.2-7書寫獲取ADC轉(zhuǎn)換數(shù)值的函數(shù)。unsignedcharadc_pcf8591(void){ unsignedchartemp; i2c_start(); i2c_sendbyte(0x91);//器件地址 i2c_waitack(); temp=i2c_receivebyte();//讀取ADC轉(zhuǎn)換數(shù)值 i2c_sendack(1); i2c_stop(); returntemp;7.2.2.GPIO模擬I2C總線訪問PCF8591數(shù)模轉(zhuǎn)換ADC芯片 returntemp;}令模數(shù)轉(zhuǎn)換器PCF8591連接電位器電壓如圖7.2-2所示,GPIO模擬I2C總線讀取電位器電壓,圖7.2-8是電壓顯示界面,二維碼7.2-2展示了開發(fā)示范過程。圖7.2-8電壓顯示界面7.2.2.GPIO模擬I2C總線訪問PCF8591數(shù)模轉(zhuǎn)換ADC芯片二維碼7.2-2GPIO模擬I2C總線電壓采集程序?qū)崿F(xiàn)7.3.STC單片機I2C功能模塊開發(fā)技術(shù)單片機模擬I2C總線需要自己書寫I2C總線驅(qū)動函數(shù),開發(fā)工作量大。STC8x、STC32x系列單片機內(nèi)部集成了一個I2C串行總線控制器,通過配置寄存器就可以實現(xiàn)I2C通信。使用單片機I2C功能模塊的步驟是:首先規(guī)定I2C功能管腳,其次配置I2C功能模塊工作方式,最后讀出I2C模塊的寄存器數(shù)據(jù)。7.3.1.I2C管腳切換STC8x、STC32x系列單片機提供I2C總線管腳切換功能,可將SCL和SDA切換到不同的I/O口上,以方便用戶分時復用I2C總線。(1)P_SW2:寄存器名稱地址bit7bit6bit5bit4bit3bit2bit1bit0P_SW2BAHEAXFR-I2C_S[1:0]CMPQ_SS4_SS3_SS2_SI2C_S[1:0]:I2C功能腳選擇位I2C_S[1:0]SCLSDA00P1.5P1.401P2.5P2.410P7.7P7.611P3.2P3.37.3.2.I2C控制寄存器STC系列單片機提供的I2C總線提供了兩種操作模式:主機模式(SCL為輸出口,發(fā)送同步時鐘信號),和從機模式(SCL為輸入口,接收同步時鐘信號)1.I2C配置寄存器寄存器名稱地址bit7bit6bit5bit4bit3bit2bit1bit0I2CCFG7EFE80HENI2CMSSLMSSPEED[5:0]ENI2C:I2C功能使能控制位。0:禁止I2C功能;1:允許I2C功能。MSSL:I2C功能模式選擇位。0:從機模式;1:主機模式。MSSPEED[5:0]:I2C總線速度(等待時鐘數(shù)),I2C總線速度=SYSCAK/2/(MSSPEED*2+4)。只有當I2C模塊工作在主機模式時,MSSPEED參數(shù)設置的等待參數(shù)才有效。7.3.2.I2C控制寄存器2.I2C控制寄存器(1)I2C主機控制寄存器EMSI:主機模式中斷使能控制位。0:關閉主機模式的中斷;1:允許主機模式的中斷。MSCMD[3:0]主機命令。寄存器名稱地址bit7bit6bit5bit4bit3bit2bit1bit0I2CMSCR7EFE8HEMSI---MSCMD[3:0]7.3.2.I2C控制寄存器MSCMD[3:0]命令說明0000待機,無動作0001起始命令,發(fā)送START信號0010發(fā)送數(shù)據(jù)命令,SCL產(chǎn)生8個時鐘,并將I2CTXD內(nèi)容按位送到SDA0011接收ACK信號0100接收數(shù)據(jù)命令,SCL產(chǎn)生8個時鐘,按位讀取SDA數(shù)據(jù)0101發(fā)送ACK命令0110停止命令,發(fā)送STOP信號0111保留1000保留1001起始命令+發(fā)送數(shù)據(jù)命令+接收ACK命令,0001+0010+0011組合。1010發(fā)送數(shù)據(jù)命令+接收ACK命令,0010+0011組合1011接收數(shù)據(jù)命令+發(fā)送ACK(0)命令1100接收數(shù)據(jù)命令+發(fā)送NAK(1)命令7.3.2.I2C控制寄存器(2)I2C從機控制寄存器寄存器名稱地址bit7bit6bit5bit4bit3bit2bit1bit0I2CSLCRFE83H-ESTAIERXIETXIESTOI--SLRSTESTAI:從機模式時接收到START信號中斷允許位。0:禁止中斷;1:使能中斷。ERXI:從機模式時接收到1字節(jié)數(shù)據(jù)后中斷允許位。0:禁止中斷;1:使能中斷。ETXI:從機模式時發(fā)送完成1字節(jié)數(shù)據(jù)后中斷允許位。0:禁止中斷;1:使能中斷。ESTOI:從機模式時接收到STOP信號中斷允許位。0:禁止中斷;1:使能中斷。SLRST:復位從機模式。7.3.2.I2C控制寄存器3.I2C狀態(tài)寄存器(1)I2C主機狀態(tài)寄存器寄存器名稱地址bit7bit6bit5bit4bit3bit2bit1bit0I2CMSSTFE82HMSBUSYMSIF----MSACKIMSACKOMSBUSY:主機模式時I2C控制器狀態(tài)位(只讀)。0:控制器處于空閑狀態(tài);1:控制器處于忙碌狀態(tài)。MSIF:主機模式的中斷請求位(中斷標志位)。當處于主機模式的I2C控制器執(zhí)行完成寄存器I2CMSCR中MSCMD命令后產(chǎn)生中斷信號,硬件自動將此位置1,向CPU發(fā)出中斷請求,響應中斷后MSIF位必須用軟件清零。MSACKI:主機模式時,發(fā)送“0011”命令到I2CMSCR的MSCMD位后所接收到的ACK數(shù)據(jù)。MSACKO:主機模式時,準備將要發(fā)送出去的ACK信號。當發(fā)送“0101”命令到I2CMSCR的MSCMD位后,控制器會自動讀取此位的數(shù)據(jù)當做ACK發(fā)送到SDA。7.3.2.I2C控制寄存器(2)I2C從機狀態(tài)寄存器寄存器名稱地址bit7bit6bit5bit4bit3bit2bit1bit0I2CSLSTFE84HSLBUSYSTAIFRXIFTXIFSTOIF-SLACKISLACKOSLBUSY:從機模式時I2C控制器狀態(tài)位(只讀)。0:控制器處于空閑狀態(tài);1:控制器處于忙碌狀態(tài)。STAIF:從機模式時接收到START信號后的中斷請求位。從機模式的I2C控制器接收到START信號后,硬件會自動將此位置1,并向CPU發(fā)中斷請求,響應中斷后STAIF位必須用軟件清零。RXIF:從機模式時接收到1字節(jié)的數(shù)據(jù)后的中斷請求位。RXIF必須由軟件清零。TXIF:從機模式時發(fā)送完成1字節(jié)數(shù)據(jù)后的中斷請求位。TXIF也必須由軟件清零。STOIF:從機模式時接收到STOP信號后的中斷請求位。STOIF也必須由軟件清零。SLACKI:從機模式時,接收到到的ACK數(shù)據(jù)。SLACKO:從機模式時,準備將要發(fā)送出去的ACK信號7.3.2.I2C控制寄存器4.I2C數(shù)據(jù)寄存器寄存器名稱地址bit7bit6bit5bit4bit3bit2bit1bit0I2CTXDFE86HI2CRXDFE87HI2CTXD:I2C發(fā)送數(shù)據(jù)寄存器,存放將要發(fā)送的I2C數(shù)據(jù);I2CRXD:I2C接收數(shù)據(jù)寄存器,存放接收完成的I2C數(shù)據(jù)。7.3.3.I2C主機模式訪問AT24C02AT24C系列是電可擦寫存儲器EEPROM,數(shù)據(jù)的存儲和取出采用I2C總線實現(xiàn),AT24C系列產(chǎn)品有以下幾種:AT24C01:128字節(jié)(128×8位);AT24C02:256字節(jié)(256×8位);AT24C04:512字節(jié)(512×8位)AT24C08:1K字節(jié)(1K×8位);AT24C16:2K字節(jié)(2K×8位);以AT24C02為例它的讀取時序有如下規(guī)定。7.3.3.I2C主機模式訪問AT24C021.單字節(jié)的寫——寫數(shù)據(jù)到存儲單元圖7.3-1是單字節(jié)的讀時序,此處省略了SCL時鐘線,SDALine的每個小方塊都和SCL時鐘周期節(jié)拍對應,一個小方塊就是一個時鐘周期。小方塊對應一個二進制數(shù)值0或1。整個過程的時序由五部分組成,這五部分分別是:起始START位、器件地址(DeviceAddress)、存儲單元地址(WordAddress)、要存儲的數(shù)據(jù)(Data)、結(jié)束STOP位。在兩個地址、一個數(shù)據(jù)之后都有ACK應答,ACK來自從機。圖7.3-1單字節(jié)的寫時序7.3.3.I2C主機模式訪問AT24C022.單字節(jié)的讀——從存儲單元讀數(shù)據(jù)圖7.3-2是EEPROM單字節(jié)讀時序,時序中有2個START,第一個是假寫,說明I2C總線要訪問的器件和存儲單元地址,第二個是真的讀,給出器件地址,然后把數(shù)據(jù)讀出來,圖中打箭頭指示的地方都是來自從機的應答信號。圖7.3-2單字節(jié)的隨機讀時序7.3.3.I2C主機模式訪問AT24C023.連續(xù)字節(jié)的寫——CPU將多個字節(jié)寫入存儲塊圖7.3-3是連續(xù)字節(jié)寫時序,在單片機在總線上發(fā)出器件地址和存儲地址后,連續(xù)寫入數(shù)據(jù),在連續(xù)寫的過程中從機自動將存儲地址指向下一個單元。對于AT24C01和AT24C02一次裝載的字節(jié)數(shù)是8,AT24C04、AT24C08、AT24C16芯片一次裝載的字節(jié)數(shù)是16。圖7.3-3連續(xù)字節(jié)的寫時序7.3.3.I2C主機模式訪問AT24C02按照圖7.3-3的時序,對應程序如下:voidWriteNbyte(u8addr,u8*p,u8number)/*WordAddress,FirstDataAddress,Bytelenth*/{Start();//發(fā)送起始命令SendData(SLAW);//發(fā)送設備地址+寫命令RecvACK();SendData(addr);//發(fā)送存儲地址RecvACK();do7.3.3.I2C主機模式訪問AT24C02{SendData(*p++);RecvACK();}while(--number);Stop();//發(fā)送停止命令}7.3.3.I2C主機模式訪問AT24C024.連續(xù)字節(jié)的讀——CPU將存儲塊的數(shù)據(jù)讀出來圖7.3-4是連續(xù)字節(jié)讀時序,和單字節(jié)的讀一樣,也有一個“假寫”過程,然后是真的讀。圖中箭頭的地方都是主機發(fā)出的應答信號。圖7.3-4連續(xù)字節(jié)的讀時序在讀的過程中,主機應答(0),存儲器持續(xù)將下一個地址里的數(shù)據(jù)送到SDA上,當最后一個字節(jié)數(shù)據(jù)讀完后,單片機應返回“非應答”(電平1),并發(fā)出終止信號以結(jié)束讀出操作。主機回復應答信號后,要令SDA為1,釋放總線,以便開展下一次通信。7.3.3.I2C主機模式訪問AT24C02按照圖7.3-4時序圖,對應程序如下:voidReadNbyte(u8addr,u8*p,u8number)/*WordAddress,FirstDataAddress,Bytelenth*/{Start();//發(fā)送起始命令SendData(SLAW);//發(fā)送設備地址+寫命令RecvACK();SendData(addr);//發(fā)送存儲地址RecvACK();Start();//發(fā)送起始命令SendData(SLAR);//發(fā)送設備地址+讀命令7.3.3.I2C主機模式訪問AT24C02RecvACK();do{*p=RecvData();p++;if(number!=1)SendACK();//sendACK}while(--number);SendNAK();//sendnoACK Stop();//發(fā)送停止命令}任務1.I2C功能模塊應用開發(fā)任務要求:在第七屆藍橋杯單片機決賽試題中要求選手將測量到的電壓波動事件記錄到EEPROM中,當設備重新上電后,能夠從EEPROM里獲取事件發(fā)生時間、事件類型、電壓上限、電壓下限等參數(shù)和數(shù)據(jù)。為了簡化,本任務對EEPROM里任意4個存儲單元讀寫,內(nèi)容顯示在數(shù)碼管。具體要求如下:1.初始化AT24C02第1~4單元的內(nèi)容。2.當按鍵P34按下后,記錄按鍵次數(shù)。3.為了對比和調(diào)試,將讀取到的數(shù)據(jù)同時發(fā)送到單片機USB虛擬串口。任務資訊:AT24CX(X=02,04,08,16,等)是串行E2PROM芯片,圖7.3-5是AT24C02連接電路圖。圖7.3-5AT24C02的連接電路圖圖7.3-6按鍵電路任務1.I2C功能模塊應用開發(fā)采用單片機自身I2C總線模塊進行程序開發(fā),其開發(fā)步驟是:1.設置P2.4、P2.5是I2C總線;2.設置I2C功能模塊是主機模式;3.按照AT24C02的寫時序,依次發(fā)送起始信號、寫器件地址、寫單元地址、寫數(shù)據(jù)命令。4.按照AT24C02的讀時序,依次發(fā)送起始信號、寫器件地址、寫單元地址、發(fā)送起始信號、發(fā)送讀信號、讀取數(shù)據(jù)。任務1.I2C功能模塊應用開發(fā)任務參考主要代碼:/*************本地函數(shù)聲明**************/voidWriteNbyte(u8addr,u8*p,u8number);voidReadNbyte(u8addr,u8*p,u8number);voidDelay1ms(u8ms);voidDisplayScan(void);voidmain(void){P_SW2=0x90;//使能XFR訪問,I2C選擇P2.4,P2.5I2CCFG=0xe0;//使能I2C主機模式I2CMSST=0x00;/*設置USB虛擬串口*/任務1.I2C功能模塊應用開發(fā)P3M0&=~0X03;//USB數(shù)據(jù)線 P3M1|=0X03; IRC48MCR=0x80; while(!(IRC48MCR&0x01)); USBCLK=0X00; USBCON=0X90; usb_init(); IE2|=0x80; while(DeviceState!=DEVSTATE_CONFIGURED); /*顯示EEPROM初始值*/ for(i=0;i<4;i++)//顯示EEPROM初值 {任務1.I2C功能模塊應用開發(fā) dspbuf[2*i]=datam[i]&0x0f;//顯示數(shù)字小于16,個位數(shù) dspbuf[2*i+1]=datam[i]>>4&0x0f;//顯示數(shù)字小于16,十位數(shù) } while(1){if(key1==0){Delay1ms(10);//按鍵去抖 while(key1==0);//等待按鍵釋放 key_cnt++; datam[0]=key_cnt; //第一個單元存儲按鍵次數(shù)任務1.I2C功能模塊應用開發(fā) dspbuf[2*i]=datam[i]&0x0f;//顯示數(shù)字小于16,個位數(shù) dspbuf[2*i+1]=datam[i]>>4&0x0f;//顯示數(shù)字小于16,十位數(shù) } while(1){if(key1==0){Delay1ms(10);//按鍵去抖 while(key1==0);//等待按鍵釋放 key_cnt++; datam[0]=key_cnt; //第一個單元存儲按鍵次數(shù)WriteNbyte(AT_addr,datam,4); //寫數(shù)據(jù)到eeprom存儲單元 Delay1ms(2);任務1.I2C功能模塊應用開發(fā) ReadNbyte(AT_addr,datam,4);//讀EEPROM內(nèi)容, //顯示EEPROM讀出值 for(i=0;i<4;i++) { dspbuf[2*i]=datam[i]&0x0f;//顯示數(shù)字小于16,個位數(shù) dspbuf[2*i+1]=datam[i]>>4&0x0f;//顯示數(shù)字小于16,十位數(shù) } //虛擬串口同步顯示EEPROM數(shù)據(jù) USB_SendData(datam,4); } if(bUsbOutReady){usb_OUT_done();//接收應答(固定格式)} }}7.2.1.GPIO模擬I2C總線的驅(qū)動函數(shù)任務23開發(fā)過程見二維碼7.3-1。二維碼7.3-1STC單片機I2C功能模塊應用程序結(jié)論:在上面的程序中,由于單片機內(nèi)部集成了一個I2C串行總線控制器,I2C總線的起始信號、停止信號、讀寫信號都是通過配置I2C串行總線控制器的寄存器實現(xiàn),相比7.2節(jié)的開發(fā),省去了編寫I2C總線底層驅(qū)動函數(shù),本程序相對簡單明了。謝謝&提問網(wǎng)絡空間安全學院網(wǎng)絡安全基礎技術(shù)應用第八章SPI總線開發(fā)目錄CONTENT8.1.SPI總線的基本概念8.2.GPIO模擬SPI總線的開發(fā)技術(shù)8.3.STC單片機SPI功能模塊開發(fā)技術(shù)8.1.SPI總線的基本概念SPI接口是SerialPeripheralInterface的縮寫,顧名思義就是串行外圍設備接口。SPI接口是Motorola公司首先提出的全雙工同步串行接口通信協(xié)議,采用主從模式架構(gòu),支持多從設備應用,一般只支持單主設備。SPI總線一般有4根信號線:MOSI,MISO,SCK,SS。在使用的時候,時鐘由主設備控制,數(shù)據(jù)在時鐘脈沖下按位傳輸,高位在前低位在后,SPI接口有2根單向數(shù)據(jù)線,可以實現(xiàn)全雙工通信,數(shù)據(jù)速率可達幾Mbps。8.1.1.SPI總線結(jié)構(gòu)SPI的四根總線分別是串行數(shù)據(jù)輸出線、輸入線、時鐘線、設備選擇線。MOSI:MasterOutputSlaveInput主器件數(shù)據(jù)輸出,從器件數(shù)據(jù)輸入。MISO:MasterInputSlaveOutput主器件數(shù)據(jù)輸入,從器件數(shù)據(jù)輸出。SCK:時鐘信號,由主設備控制發(fā)出。/SS:從設備選擇信號,由主設備控制。有些器件也用“CS”表示。8.1.1.SPI總線結(jié)構(gòu)圖8.1-1展示了主機和從機之間的連接關系。主機(也稱主設備)和從機(也稱從設備)的MOSI、MISO、SCK管腳互相連接,主設備的SS接VCC,從設備的SS接地。因為只有一個從設備,所以從設備的SS接地,意味著從設備始終都處于通信狀態(tài)。因此在只有一個從設備的情況下會省略SS,SPI總線變成三線制。SCK是時鐘脈沖,由主機控制,沿著SCK的上升沿或者下降沿,MOSI、MISO的數(shù)據(jù)串行輸出,實現(xiàn)數(shù)據(jù)交換。
圖8.1-1主機和從機的電路連接8.1.2.SPI總線的傳輸模式根據(jù)時鐘極性(CPOL)及相位(CPHA)不同可以組合成4種工作模式:SPI0,SPI1,SP2,SP3。其中使用的最為廣泛的是SPI0和SPI3方式。(1)SPI0:CPOL=0,CPHA=0(2)SPI1:CPOL=0,CPHA=1(3)SPI2:CPOL=1,CPHA=0(4)SPI3:CPOL=1,CPHA=1時鐘極性(CPOL)定義了時鐘空閑狀態(tài)電平:CPOL=0:時鐘空閑狀態(tài)為低電平。CPOL=1:時鐘空閑狀態(tài)為高電平。時鐘相位(CPHA)定義數(shù)據(jù)的采樣時間:CPHA=0:在時鐘的第一個跳變沿(上升沿或下降沿)進行數(shù)據(jù)采樣。CPHA=1:在時鐘的第二個跳變沿(上升沿或下降沿)進行數(shù)據(jù)采樣。8.1.2.SPI總線的傳輸模式SPI接口有四種不同的數(shù)據(jù)傳輸時序,取決于CPOL和CPHA這兩位的組合。圖8.1-2中表現(xiàn)了這四種時序,從圖中也可以看出CPHA=0與CHPA=1,采樣和輸出先后順序正好相反。。圖8.1-2SPI總線的工作模式8.2.GPIO模擬SPI總線的開發(fā)技術(shù)SPI總線把接收和發(fā)送分成了兩根線,通信速度快,和I2C總線一樣,通常用于芯片間通信。很多芯片都具有SPI接口,當MCU沒有SPI功能模塊時,利用通用輸入輸出管腳模擬SPI總線協(xié)議。8.2.1.GPIO模擬SPI總線的驅(qū)動函數(shù)對照圖8.1-2時序圖,書寫SPI總線單字節(jié)讀寫函數(shù),讀寫的時候低位在前,高位在后。以SPI0工作模式為例,SCK默認狀態(tài)是低電平,在上升沿采樣,在下降沿輸出,SPI是全雙工通信,所以發(fā)送和接收是同時進行的。(1)SPI0模式下主機的讀寫函數(shù):主機在MOSI總線上寫數(shù)據(jù),在MISO總線上讀數(shù)據(jù)。unsignedcharSPIMaster_RWByte(unsignedchardata){unsignedchari;for(i=0;i<8;i++){sck=0;MOSI=data&0x01;//數(shù)據(jù)的低位輸出到MOSIdata>>=1;//數(shù)據(jù)右移,高位移到低位8.2.1.GPIO模擬SPI總線的驅(qū)動函數(shù)sck=1;//拉高SCKdata|=(MISO<<8);//讀MISO到data最高位,補充data低位空缺。sck=0;}return(data);//返回讀出的字節(jié)數(shù)據(jù)}(2)SPI0模式下從機的讀寫函數(shù):從機在MOSI總線讀數(shù)據(jù),在MISO總線寫數(shù)據(jù)unsignedcharSPISlave_RWByte(unsignedchardata){unsignedchari;for(i=0;i<8;i++){8.2.1.GPIO模擬SPI總線的驅(qū)動函數(shù)if(sck==0){ MISO=data&0x01;//從機數(shù)據(jù)的低位輸出到MISO}while(sck==0);data<<=1;If(sck==1){data|=(MOSI<<8);//從機讀MOSI到data最高位,補充data高位空缺。while(sck==1);}}return(data);}8.2.2.GPIO模擬SPI總線訪問DS1302日歷芯片DS1302是DALLAS公司推出的日歷芯片,內(nèi)含有一個實時時鐘/日歷和31字節(jié)靜態(tài)RAM,利用簡化的SPI總線與單片機通信。DS1302提供秒、分、時、日、周、月、年的信息,每月的天數(shù)和閏年自動調(diào)整,時鐘可以選擇12小時制或24小時制。DS302有12個寄存器,其中有7個寄存器與日期和時間相關,其余都是控制寄存器。要使用DS1302,首先將日期和時間等初始化數(shù)據(jù)寫入DS1302的寄存器,設置時間格式,然后開啟DS1302計時。當DS1302初始化設置完并開啟計時后,單片機只要讀出DS1302里的日期或時間即可。圖8.2-1是DS1302的DIP封裝圖和管腳說明,圖8.2-2是芯片工作電路圖,圖8.2-3是DS1302應用電路。圖8.2-1中的I/O數(shù)據(jù)線是雙線數(shù)據(jù)線,它將SPI總線的MOSI和MISO兩根線合并成一根線,收發(fā)不能同時進行,是半雙工通信。8.2.2.GPIO模擬SPI總線訪問DS1302日歷芯片圖8.2-1DS1302芯片管腳圖圖8.2-3DS1302應用電路圖8.2-2芯片工作電路圖8.2.2.GPIO模擬SPI總線訪問DS1302日歷芯片圖8.2-3中SPI的三根線分別和單片機P17、P23、P13連接。DS1302采用雙電源供電模式,可以由VCC電源供電(連接VCC2管腳),也可以由電池供電(連接VCC2管腳),在VCC主電源失效時由電池保持時間和日期數(shù)據(jù)。RST是芯片復位和片選管腳,低電平時,芯片復位,讀寫無效;高電平時,片選有效,開始數(shù)據(jù)傳輸。SCK管腳為芯片提供時鐘脈沖。I/O是數(shù)據(jù)輸入輸出管腳,用于傳輸及接收數(shù)據(jù)。芯片連接32.768KHz外部晶振。表8.2-1列出了DS1302的寄存器。ReadWritebit7bit6bit5bit4bit3bit2bit1bit0說明81h80hCH10SecondsSeconds秒:00-59,CH=1:時鐘暫停83h82h
10MinutesMinutes分:00-5985h84h12/24010Hour時:00-23/01-12AM/PM87h86h0010DateDate日:01-28/29/30/3189h88h00010MonthMonth月:01-128Bh8Ah00000Day星期:1-78Dh8Ch10YearYear年:00-998Fh8EhWP0000000控制寄存器,WP=1:寫保護,不允許器件寫入91h90hTCSDSRS涓流充電選擇表8.2-1DS1302和日期時間有關的寄存器列表8.2.2.GPIO模擬SPI總線訪問DS1302日歷芯片訪問DS1302,首先要說明訪問的存儲單元地址,然后在總線上傳送數(shù)據(jù)。因此一個完整的讀或?qū)懼辽儆?個字節(jié)構(gòu)成。1.讀時序:圖8.2-4是讀時序,對應SPI0工作模式,第1個字節(jié)寫地址,CPU控制I/O線;第2個字節(jié)讀數(shù)據(jù),由DS1302發(fā)送數(shù)據(jù)到I/O線。圖8.2-4單個字節(jié)讀時序8.2.2.GPIO模擬SPI總線訪問DS1302日歷芯片2.寫時序:圖8.2-5是寫時序,對應SPI0工作模式,2個字節(jié)都是CPU控制I/O線。圖8.2-5單個字節(jié)寫時序8.2.2.GPIO模擬SPI總線訪問DS1302日歷芯片2.寫時序:圖8.2-5是寫時序,對應SPI0工作模式,2個字節(jié)都是CPU控制I/O線。圖8.2-5單個字節(jié)寫時序8.2.2.GPIO模擬SPI總線訪問DS1302日歷芯片DS1302的讀寫時序是三線半雙工通信,一個時鐘周期內(nèi)只有一個方向的數(shù)據(jù),主機單個字節(jié)的讀寫函數(shù)如下所示。/*****主機單個字節(jié)的寫過程*****/voidwrite_Ds1302_Byte(unsignedchardata){ unsignedchari; for(i=0;i<8;i++) { SCK=0; SDA=data&0x01;//數(shù)據(jù)低位輸出到IO總線上 data>>=1;//數(shù)據(jù)右移,高位移到低位 SCK=1;
8.2.2.GPIO模擬SPI總線訪問DS1302日歷芯片 }}/*****主機單個字節(jié)的讀過程*****/unsignedcharread_Ds1302_Byte(){ unsignedchari,data; for(i=0;i<8;i++) { SCK=0; data>>=1; data|=(SDA)<<8; //讀SDA數(shù)據(jù)到data最高位 SCK=1; 8.2.2.GPIO模擬SPI總線訪問DS1302日歷芯片 }return(data);}
/*****圖8.2-4時序DS1302完整的讀過程***/unsignedcharRead_Ds1302(unsignedcharaddress){ unsignedchari,temp=0x00; Write_Ds1302_Byte(address);//寫地址return(read_Ds1302_Byte());}/*****圖8.2-5時序DS1302完整的寫過程***/ 8.2.2.GPIO模擬SPI總線訪問DS1302日歷芯片voidWrite_Ds1302(unsignedcharaddress,unsignedchardata){ Write_Ds1302_Byte(address); //寫地址 Write_Ds1302_Byte(data); //寫數(shù)據(jù)}基于GPIO模擬SPI總線,讓單片機與DS1302日歷芯片交換數(shù)據(jù),數(shù)碼管分兩屏顯示日期和時間,圖8.2-6是日歷顯示界面,二維碼8.2-1展示了開發(fā)示范過程。 圖8.2-6日歷顯示界面8.2.2.GPIO模擬SPI總線訪問DS1302日歷芯片二維碼8.2-1GPIO模擬SPI總線讀日歷芯片的程序?qū)崿F(xiàn)8.3.STC單片機SPI功能模塊開發(fā)技術(shù)STC單片機從15系列開始就提供SPI總線功能,與SPI相關的寄存器有SPI狀態(tài)寄存器、SPI控制寄存器、SPI數(shù)據(jù)寄存器,通過這三個寄存器就可以完成SPI數(shù)據(jù)的傳輸。8.3.1.SPI管腳切換對于SPI總線端口分配,STC15x、STC8x、STC32x系列單片機提供了切換模式,可將SS、MOSI、MISO、SCLK切換到不同的I/O口上,以方便用戶將靈活應用管腳。(1)P_SW:SPI功能腳切換寄存器名稱地址Bit7Bit6Bit5Bit4Bit3Bit2B
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 單位管理制度呈現(xiàn)合集【職工管理】十篇
- 《全面質(zhì)量管理ol》課件
- 《沙盤游戲治療》課件
- 第5單元 國防建設與外交成就(A卷·知識通關練)(解析版)
- 某磚混結(jié)構(gòu)住宅樓招標文件
- 《園林景觀小品設計》課件
- 明確財務數(shù)據(jù)分析目標的路徑計劃
- 公園保安工作職責概述
- 2023年項目部安全管理人員安全培訓考試題【必考】
- 教師暑假培訓心得體會800字(九篇)
- 十六烷安全技術(shù)說明書(msds)
- Stevens-Johnson綜合征及中毒性表皮壞死松解癥課件
- 醫(yī)療廢物處置流程圖3個
- 通信專業(yè)實務:傳輸與接入(有線)
- 水下攝影技巧
- 醫(yī)院衛(wèi)生院安全生產(chǎn)領導責任清單
- 體育文獻綜述范文體育文獻綜述范文八篇
- 六年級下冊《國學經(jīng)典誦讀》教案
- 電力安全風險分級管控與隱患排查治理雙重預防機制建設工作方案
- 城市管理學期末考試復習題及答案
- 工程項目管理(第五版)叢培經(jīng) 第一章
評論
0/150
提交評論