C8051單片機(jī)在交流變頻調(diào)速系統(tǒng)中的應(yīng)用
首先,先給大家一個(gè)中文的C8051的資料,天天看英文資料,看的人頭都大了。下邊是中文資料的下載地址:
(pdf格式的)
本文簡要介紹了以標(biāo)準(zhǔn)8051為內(nèi)核的新型單片機(jī) Cygnal C8051的功能,詳細(xì)說明了以C8051單片機(jī)為控制核心構(gòu) 成閉環(huán)變頻調(diào)速系統(tǒng)的方法。經(jīng)過測試,系統(tǒng)安全可靠,控制性 能優(yōu)良。
一、Cygnal C8051單片機(jī)概述
C8051 是美國Cygnal公司生產(chǎn)的、與標(biāo)準(zhǔn)51兼容的高速單片機(jī), 是全集成混合信號(hào)SOC(system on chip)單片機(jī)。Cygnal C8051 單 片機(jī)片內(nèi)資源主要有:高速的(20~25MIPS)與8051全兼容的微控制 器內(nèi)核、8/12 位8 通道輸入ADC、2 路12 位DAC、16 位可編程定時(shí)/ 計(jì)數(shù)器列陳(PCA)、3~5 個(gè)通用定時(shí)器、8~64 個(gè)通用I/O 口、8~ 64KB FLASH內(nèi)部程序存儲(chǔ)器、256B~4KB內(nèi)部數(shù)據(jù)RAM、片內(nèi)電源 監(jiān)測、片內(nèi)看門狗定時(shí)器、片內(nèi)時(shí)鐘源以及帶有I2C/SMBus、SPI、1~ 2 個(gè)UART串行總線等。片內(nèi)JTAG仿真電路提供全速、非插入式(不 使用在片資源)的電路內(nèi)仿真。C8051F 的JTAG接口不僅支持Flash ROM的讀/ 寫操作及非侵入式在系統(tǒng)調(diào)試,它的JTAG邏輯還為在系 統(tǒng)測試提供邊界掃描功能。通過邊界寄存器的編程控制,可對(duì)所有器 件引腳、SFR 總線和I/O口弱上拉功能實(shí)現(xiàn)觀察和控制。 C8051單片機(jī)采用開關(guān)網(wǎng)絡(luò)以硬件方式實(shí)現(xiàn)I/O端口的靈活配置。 在這種通過交叉開關(guān)配置的I/O 端口系統(tǒng)中,單片機(jī)外部為通用I/O 口,如P0 口、P1 口和P2 口。內(nèi)有輸入/ 輸出的電路單元通過相應(yīng)的 配置寄存器控制的交叉開關(guān)配置到所選擇的端口上。
二、C8051的PWM功能實(shí)現(xiàn)原理
C8051單片機(jī)有PWM功能和捕捉功能,這些功能都包含在一個(gè)稱 為可編程計(jì)數(shù)器列陳PCA 中。PCA 包含一個(gè)16 位的定時(shí)/ 計(jì)數(shù)器和 5個(gè)捕捉/比較模塊。16位的PCA專用定時(shí)/計(jì)數(shù)器由PCA0H和PCA0L 組成,其時(shí)鐘可以為系統(tǒng)時(shí)鐘的12 分頻、系統(tǒng)時(shí)鐘的4 分頻、定時(shí)器 0溢出、被定義ECI引腳的外部時(shí)鐘源,可通過設(shè)置PCA0MD寄存器獲 得。每個(gè)捕捉/ 比較模塊都有一個(gè)1 6 位的模塊寄存器,分別為 PCA0CPHn和PCA0CPLn,都有邊沿觸發(fā)捕捉、比較、高速輸出、PWM 四種工作方式,通過PCA0CPMn進(jìn)行設(shè)置。 在PWM工作方式中,系統(tǒng)不斷將PCA計(jì)數(shù)器的PCA0L的值與該 模塊的PCA0CPLn的常數(shù)值進(jìn)行比較。當(dāng)兩者相等時(shí),在CEXn引腳上 輸出“1”,當(dāng)PCA0L溢出時(shí),在CEXn 引腳上輸出“0”,并且自動(dòng)將 保存在PCA0CPHn中的常數(shù)值送入PCA0CPLn。 在引腳CEXn引腳上輸出的PWM波實(shí)際是對(duì)計(jì)數(shù)器的PCA時(shí)鐘的 256 分頻,其占空比α為 α=[256 -(PCA0CPLn)]/256 可見,8 位PWM波的分辨率為1/256。利用高速輸出工作方式和 軟件可實(shí)現(xiàn)8~16 位的PWM波。 通過對(duì)交叉開關(guān)控制寄存器XBR0的有效設(shè)置,CEXn上的PWM 波就由P0 或P1 口的有關(guān)端口輸出。
三、基于C8051單片機(jī)的三相交流變頻調(diào)速系統(tǒng)主要硬件設(shè) 計(jì)
交流變頻調(diào)速系統(tǒng)原理框圖如圖所示,從結(jié)構(gòu)上主要分為控制部 分和執(zhí)行部分。 控制部分主要由C8051 單片機(jī)、時(shí)鐘電路、通訊接口、鍵盤與顯 示電路、光電耦合、IPM逆變器、整流模塊、轉(zhuǎn)速檢測和故障檢測、報(bào) 警電路等組成。執(zhí)行部分為三相異步交流電動(dòng)機(jī)。 系統(tǒng)的工作原理為:電機(jī)的轉(zhuǎn)速由轉(zhuǎn)速傳感器轉(zhuǎn)換成矩形脈沖信 號(hào),經(jīng)光電隔離后進(jìn)入單片機(jī)計(jì)數(shù)器,由計(jì)數(shù)器值獲得電機(jī)的實(shí)際轉(zhuǎn) 速,與設(shè)定轉(zhuǎn)速比較,經(jīng)Fuzzy-PID控制器調(diào)節(jié)后,單片機(jī)產(chǎn)生的PWM 波經(jīng)6N137線性光耦進(jìn)行電氣隔離后作用于逆變模塊IPM(intelligent Power module),實(shí)現(xiàn)電機(jī)的閉環(huán)變頻調(diào)速?;魻栯娏?、電壓傳感器 將檢測到的逆變模塊的三相輸出電流、電壓信號(hào),經(jīng)采樣保持后進(jìn)入 單片機(jī),完成A/D轉(zhuǎn)換后,由CPU進(jìn)行處理。逆變模塊工作時(shí)所需要 的直流電壓信號(hào)由整流電路對(duì)380V電源進(jìn)行全橋整流得到。
C8051F320單片機(jī)簡介
C8051F320是由美國Cygnal公司推出的C8051F系列單片機(jī)中的一款小型單片機(jī)。它是集成的混合信號(hào)片上系統(tǒng)SOC(System on chip),具有與MCS-51內(nèi)核及指令集完全兼容的微控制器,除了具有標(biāo)準(zhǔn)8051的數(shù)字外設(shè)部件之外,片內(nèi)還集成了數(shù)據(jù)采集和控制系統(tǒng)中常用的模擬部件和其它數(shù)字外設(shè)及功能部件。內(nèi)部Flash存儲(chǔ)器可實(shí)現(xiàn)在系統(tǒng)編程,既可作程序存儲(chǔ)器也可作非易失性數(shù)據(jù)存儲(chǔ)。片內(nèi)JTAG仿真電路提供全速的電路內(nèi)仿真,不占用片內(nèi)用戶資源。支持?jǐn)帱c(diǎn)、單步、觀察點(diǎn)、運(yùn)行和停止等調(diào)試命令,并支持存儲(chǔ)器和寄存器校驗(yàn)和修改。
C8051F320片內(nèi)自帶有USB收發(fā)器和控制處理器是它區(qū)別與同一系列產(chǎn)品的一大特點(diǎn)。用C8051F320來進(jìn)行USB技術(shù)開發(fā)既方便又快捷。
C8051F320單片機(jī)簡介
1.功能部件及特點(diǎn)
(1)模擬外設(shè) 10位的ADC(±1LSB INL):其最大可編程轉(zhuǎn)換速率可達(dá)200kbps,可多達(dá)17個(gè)外部輸入,可編程為單端輸入或差分輸入,內(nèi)置一個(gè)溫度傳感器(±3℃);2個(gè)模擬比較器;2.4V的內(nèi)部電壓基準(zhǔn);精確的Vdd監(jiān)視器和欠壓檢測器。
(2)USB功能控制模塊 滿足USB2.0協(xié)議;可在全速(12 Mbps)或低速(1.5 Mbps)下運(yùn)行;集成有一個(gè)時(shí)鐘恢復(fù)源,對(duì)于全速或低速傳輸均可不用外部晶振;支持8個(gè)靈活通用的端點(diǎn);內(nèi)置一個(gè)1K的USB專用緩沖存儲(chǔ)器;集成了一個(gè)USB接收器,不需要外部電阻。
(3)片內(nèi)調(diào)試模塊 片內(nèi)調(diào)試電路提供全速、非侵入式的在系統(tǒng)調(diào)試(不需仿真器);支持端點(diǎn)、單步、觀察點(diǎn)、堆棧監(jiān)視器;可以觀察/修改存儲(chǔ)器和寄存器;比使用仿真芯片、目標(biāo)仿真頭和仿真插座的仿真系統(tǒng)有更好的性能。
(4)工作溫度范圍:0~70℃
(5)高速8051微控制器內(nèi)核 采用流水線指令結(jié)構(gòu),其70%的指令的執(zhí)行時(shí)間為一個(gè)或兩個(gè)系統(tǒng)時(shí)鐘周期;速度可達(dá)25 MIPS(時(shí)鐘頻率為25MHz時(shí))。
(6)存儲(chǔ)器 1280字節(jié)的內(nèi)部數(shù)據(jù)RAM(1K+256);16K字節(jié)的可以在系統(tǒng)編程的Flash閃速存儲(chǔ)器。
(7)數(shù)字外設(shè) 25個(gè)字節(jié)寬的端點(diǎn)I/O;所有口線均耐5V電壓;可同時(shí)使用UART串口、硬件SMBusTM、SPITM;帶有4個(gè)可編程的16位計(jì)數(shù)器/定時(shí)器陣列;帶有5個(gè)捕捉/比較模塊的通用16位計(jì)數(shù)器/定時(shí)器。
(8)時(shí)鐘源 內(nèi)部晶振,精度為0.25;支持所有USB和UART模式;外部晶振器:晶體、RC、C或外部時(shí)鐘;內(nèi)置一個(gè)針對(duì)USB控制器的片上時(shí)鐘乘法器。
(9)供電電壓 片上的參考電源校準(zhǔn)器支持USB總線電源操作;校準(zhǔn)器的Bypass模式支持USB內(nèi)部電源操作。
(10)性能特點(diǎn) C8051F320在保持CISC結(jié)構(gòu)及指令系統(tǒng)不變的情況下,對(duì)指令運(yùn)行實(shí)行流水作業(yè),推出了CIP-51的CPU模式,從而大大提高了指令運(yùn)行速度,使8051兼容機(jī)系列進(jìn)入了8位高速單片機(jī)行列。
傳統(tǒng)的單片機(jī)I/O端口大都是固定為某個(gè)特殊功能的輸入/輸出口,可以是單功能或多功能,I/O端口可編程選擇為單向/雙向以及上拉、開漏等。這種固定方式既占用較多引腳,配置又不夠靈活。C8051F320采用開關(guān)網(wǎng)絡(luò)以硬件方式實(shí)現(xiàn)I/O端口的靈活配置,如圖1所示。在這種通過交叉開關(guān)配置的I/O端口系統(tǒng)中,單片機(jī)外部為通用I/O口,如P0口、P1口和P2口。內(nèi)有輸入/輸出的電路單元通過相應(yīng)的配置寄存器控制的交叉開關(guān)配置到所選擇的端口上。
C8051F320還提供了一個(gè)完整而先進(jìn)的時(shí)鐘系統(tǒng),如圖2所示。在這個(gè)系統(tǒng)中,片內(nèi)設(shè)置有一個(gè)可編程的時(shí)鐘振蕩器(無需外部器件),可提供2、4、8和16 MHz時(shí)鐘的編程設(shè)定。外部振蕩器可選擇4種方式。當(dāng)程序運(yùn)行時(shí),可實(shí)現(xiàn)內(nèi)外時(shí)鐘的動(dòng)態(tài)切換。編程選擇的時(shí)鐘輸出CYSCLK除供片內(nèi)使用外,還可從隨意選擇的I/O端口輸出。
C8051F320在8位單片機(jī)中率先配置了標(biāo)準(zhǔn)的EC2接口(IEEE1149.1)。在上位機(jī)軟件支持下,通過串行的EC2接口直接對(duì)產(chǎn)品系統(tǒng)進(jìn)行仿真調(diào)試。C8051F的EC2接口不僅支持Flash ROM的讀/寫操作及非侵入式在系統(tǒng)調(diào)試,還為在系統(tǒng)測試提供邊界掃描功能。通過邊界寄存器的編程控制,可對(duì)所有器件引腳、SFR總線和I/O口弱上拉功能實(shí)現(xiàn)觀察和控制。
C8051F320把80C51單一的外部復(fù)位發(fā)展成多源復(fù)位:上電復(fù)位、掉電復(fù)位、外部引腳復(fù)位、軟件復(fù)位、時(shí)鐘檢測復(fù)位、比較器0復(fù)位和引腳配置復(fù)位。眾多的復(fù)位源為保障系統(tǒng)的安全、操作的靈活性以及零功耗系統(tǒng)設(shè)計(jì)帶來極大的好處。
2.引腳及封裝
圖3為其引腳圖。其中,Vdd為數(shù)字電源;GND為模擬地;REGIN為5V校準(zhǔn)器的輸入端;RST/C2CK為設(shè)備的復(fù)位引腳或EC2調(diào)試接口的時(shí)鐘信號(hào);P3.0/C2D為端口3.0或EC2調(diào)試接口的雙向信號(hào)引腳;VBUS為USB總線輸入腳;D+為USB的D+;D-為USB的D-;P0.2/XTAL1為端口0.2或外部晶振輸入;P0.3/XTAL2為端口0.3或外部晶振輸出;P0.6/CNVSTR為端口0.6或ADC0外部轉(zhuǎn)換開始輸入腳;P0.7/VRFF為端口0.7或外部參考電源的輸入端或輸出端;P0.0、P0.1、P0.4、P0.5、P1.0~P1.7、P2.0~P2.7 均為相應(yīng)的端口引腳。
3.電氣特性
校準(zhǔn)器的輸入電壓(REGIN引腳)為4.0~5.25V;Vdd(電壓校準(zhǔn)器的輸出)為3.0~3.6V(通常取3.3V);VREG偏流(電壓校準(zhǔn)器有效時(shí))為70μA;CPU和USB運(yùn)行時(shí)的供給電流為18mA(CPU時(shí)鐘為24MHz,USB時(shí)鐘為48MHz時(shí))或9mA(CPU時(shí)鐘為12MHz,USB時(shí)鐘為6 MHz時(shí));內(nèi)部晶振頻率為12.0MHz;USB時(shí)鐘頻率為48.0MHz(全速)、6.0MHz(低速)。
典型的USB應(yīng)用
C8051F320是一款完全集成的混合信號(hào)系統(tǒng)級(jí)芯片,片內(nèi)集成了數(shù)據(jù)采集和控制系統(tǒng)中常用的模擬部件和其它數(shù)字外設(shè)及功能部件。其中值得我們注意的是,它集成有一個(gè)USB接口,所以我們也可將其看成是一款帶USB接口的微處理器。C8051F320與市場上同類帶USB接口的微處理器相比較,它內(nèi)部強(qiáng)大的功能模塊大大簡化了USB技術(shù)的開發(fā),還能很好地縮短開發(fā)周期。下面介紹它的一個(gè)典型的USB技術(shù)應(yīng)用。
在這個(gè)應(yīng)用中,主機(jī)通過C8051F320芯片中USB接口與C8051F320通訊,來控制信號(hào)燈的狀態(tài),檢測開關(guān)按鈕的狀態(tài),并采集分壓器和片內(nèi)溫度傳感器中的數(shù)據(jù)。在整個(gè)通訊中,我們還要使用EC2適配器來進(jìn)行系統(tǒng)調(diào)試。系統(tǒng)的電路原理圖見圖4。
在該應(yīng)用系統(tǒng)中,SW1按鈕開關(guān)連接到C8051F320的復(fù)位引腳。按一下SW1,設(shè)備將進(jìn)入硬件復(fù)位狀態(tài)。將J15跳線的兩引腳連接上后,C8051F320就在外部電源的模式下開始工作。如果要讓320在自己供電的模式下運(yùn)行,就需在斷開J15的同時(shí),連接上J12的兩個(gè)引腳。J4是該應(yīng)用系統(tǒng)的調(diào)試接口。將串行適配器EC2通過該接口連接到C8051F320,可實(shí)現(xiàn)在線調(diào)試和Flash編程的寫入和擦除(EC2的說明和使用請(qǐng)參見Cygnal公司的產(chǎn)品數(shù)據(jù)手冊(cè))。J14是USB(通用串行總線)連接器,通過它就可將USB接口和C8051F320芯片連接起來。我們常將USB電纜的一端接上J14,另一端接在計(jì)算機(jī)的USB通訊口上。這樣就能實(shí)現(xiàn)數(shù)據(jù)傳輸任務(wù)。將J12跳線的兩引腳連接上后,外部電容就連接到了C8051F320的P0.7腳。C8051F320的P1.7引腳上連接有一個(gè)滑動(dòng)電阻,只要將J13接上,C8051F320就可從P1.7腳采集到邏輯信號(hào)。實(shí)際應(yīng)用中,我們要進(jìn)行USB技術(shù)開發(fā)和應(yīng)用,其硬件部分可在圖4的基礎(chǔ)上根據(jù)需要進(jìn)行擴(kuò)展。
完整的USB應(yīng)用系統(tǒng)除了必要的硬件部分,還包括軟件部分,圖5、圖6為主程序流程圖及USB中斷服務(wù)程序流程圖。軟件部分分為三大塊:在C8051F320設(shè)備上運(yùn)行的固件程序,在主機(jī)上運(yùn)行的USB設(shè)備驅(qū)動(dòng)程序,一個(gè)主機(jī)應(yīng)用程序。主機(jī)應(yīng)用程序通過USB接口與C8051F320通訊,允許用戶觀察并改變C8051F320設(shè)備上的I/O外設(shè)的狀態(tài)。在運(yùn)行主機(jī)應(yīng)用程序前,我們要先安裝設(shè)備的USB驅(qū)動(dòng)程序。當(dāng)設(shè)備通過USB接口與主機(jī)連接好后,應(yīng)用程序就開始枚舉,并通過端點(diǎn)0、1和2來完成設(shè)備與主機(jī)之間的數(shù)據(jù)傳輸。在USB協(xié)議中,端點(diǎn)0數(shù)據(jù)包被定義為控制數(shù)據(jù)包,端點(diǎn)1和2分別用來輸入數(shù)據(jù)和輸出數(shù)據(jù)。數(shù)據(jù)包用來顯示各個(gè)端口引腳上的邏輯值。在上述應(yīng)用系統(tǒng)中,P1.7腳上分壓器的輸出邏輯值就通過應(yīng)用程序中的端點(diǎn)1數(shù)據(jù)包來傳輸?shù)街鳈C(jī),從而主機(jī)讀出數(shù)據(jù)并在用戶界面上顯示出來。在本刊的網(wǎng)站上給出了源程序,供讀者參考。
C8051F320是一款性能優(yōu)化的SOC高速單片機(jī),也是一個(gè)功能強(qiáng)大的USB接口器件。在開發(fā)和應(yīng)用其USB技術(shù)時(shí),與同類產(chǎn)品相比,它在性能、速度、方便性以及成本等方面都具有很大的優(yōu)勢(shì)。
//-----------------------------------------------------------------------------
// Blinky.c
//-----------------------------------------------------------------------------
// Copyright (C) 2005 Silicon Laboratories, Inc.
//
// AUTH: HF
// DATE: 06 NOV 02
//
// MOD: BD
// DATE: 12 APR 04
// - changed timer 2 setup of CKCON
// from: CKCON &= ~0x60;
// to: CKCON &= ~0x30;
//
// This program flashes the green LED on the C8051F32x target board about
// five times a second using the interrupt handler for Timer2.
//
// Target: C8051F32x
//
// Tool chain: KEIL Eval 'c'
//
//-----------------------------------------------------------------------------
// Includes
//-----------------------------------------------------------------------------
#include
//-----------------------------------------------------------------------------
// 16-bit SFR Definitions for 'F32x
//-----------------------------------------------------------------------------
sfr16 TMR2RL = 0xca; // Timer2 reload value
sfr16 TMR2 = 0xcc; // Timer2 counter
//-----------------------------------------------------------------------------
// Global CONSTANTS
//-----------------------------------------------------------------------------
#define SYSCLK 24500000 / 8 // SYSCLK frequency in Hz
sbit LED = P2^2; // LED='1' means ON
sbit SW2 = P2^0; // SW2='0' means switch pressed
//-----------------------------------------------------------------------------
// Function PROTOTYPES
//-----------------------------------------------------------------------------
void SYSCLK_Init (void);
void PORT_Init (void);
void Timer2_Init (int counts);
void Timer2_ISR (void);
//-----------------------------------------------------------------------------
// MAIN Routine
//-----------------------------------------------------------------------------
void main (void) {
// disable watchdog timer
PCA0MD &= ~0x40; // WDTE = 0 (clear watchdog timer
// enable)
SYSCLK_Init (); // Initialize system clock to
// 24.5MHz
PORT_Init (); // Initialize crossbar and GPIO
Timer2_Init (SYSCLK / 12 /2); // Init Timer2 to generate
// interrupts at a 10Hz rate.
EA = 1; // enable global interrupts
while (1) { // spin forever
}
}
//-----------------------------------------------------------------------------
// SYSCLK_Init
//-----------------------------------------------------------------------------
//
// This routine initializes the system clock to use the internal 24.5MHz / 8
// oscillator as its clock source. Also enables missing clock detector reset.
//
void SYSCLK_Init (void)
{
OSCICN = 0x80; // configure internal oscillator for
// its lowest frequency
RSTSRC = 0x04; // enable missing clock detector
}
//-----------------------------------------------------------------------------
// PORT_Init
//-----------------------------------------------------------------------------
//
// Configure the Crossbar and GPIO ports.
// P3.3 - LED (push-pull)
//
void PORT_Init (void)
{
XBR0 = 0x00; // no digital peripherals selected
XBR1 = 0x40; // Enable crossbar and weak pull-ups
P2MDOUT |= 0x04; // enable LED as a push-pull output
}
//-----------------------------------------------------------------------------
// Timer2_Init
//-----------------------------------------------------------------------------
//
// Configure Timer2 to 16-bit auto-reload and generate an interrupt at
// interval specified by
//
void Timer2_Init (int counts)
{
TMR2CN = 0x00; // Stop Timer2; Clear TF2;
// use SYSCLK/12 as timebase
CKCON &= ~0x30; // Timer2 clocked based on T2XCLK;
TMR2RL = -counts; // Init reload values
TMR2 = 0xffff; // set to reload immediately
ET2 = 1; // enable Timer2 interrupts
TR2 = 1; // start Timer2
}
//-----------------------------------------------------------------------------
// Interrupt Service Routines
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// Timer2_ISR
//-----------------------------------------------------------------------------
// This routine changes the state of the LED whenever Timer2 overflows.
//
void Timer2_ISR (void) interrupt 5
{
TF2H = 0; // clear Timer2 interrupt flag
LED = ~LED; // change state of LED
}
c8051f020的smbus總線完全符合國際系統(tǒng)管理總線IEE 1.1版標(biāo)準(zhǔn),與I2C完全兼容,可方便地與smbus總線接口和I2C接口器件通信,它由一根雙向數(shù)據(jù)線sdl 和scl時(shí)鐘線構(gòu)成,可與不同速度的器件通信,因此具有很好的兼容性(通過延長scl低電平時(shí)間實(shí)現(xiàn)),smbus可工作在主發(fā)送器/主接收器/從接收器/從發(fā)送器幾種模式.c8051f320的smbus具有五個(gè)SFR,它們是:SMBUS0CN SMBUS0STA SMBUS0ADDR SMBUS0CR SMBUS0DA,下面是它的工作過程. (1)先復(fù)習(xí)一下I2C總線協(xié)議,I2C總線可工作在兩種方試,從主器件到從器件的寫,從從器件到主器件的讀,兩種操作都由主器件發(fā)起,不過,沒有必要指定一個(gè)器件為主器件,任何一個(gè)發(fā)起指令的器件都將成為主器件,一次操作包括一個(gè)開始條件(以SCL的高電平,SDL的低電平表示),一個(gè)地址字節(jié)(7-1為7位器件地址,0為方向位:1為讀,0為寫),一個(gè)或多個(gè)字節(jié)數(shù)據(jù),和一個(gè)停止條件(由SCL的高電平,SDL的高電平表示)組成.另外,每個(gè)器件在接收到數(shù)據(jù)后必需應(yīng)答(ACK),用SCL高電平SCL的低電平表示,否則回答NACK,用SCL高電平SDL的高電平來表示.其時(shí)序如下圖 (2)關(guān)于總線仲裁 主器件只有在總線空閑時(shí)才能占用總線,(一個(gè)停止位后或當(dāng)SCL和SDL保持高電平超過一定時(shí)間,我們就認(rèn)為總線是空閑的,此時(shí)總線可以發(fā)起操作),當(dāng)兩個(gè)或多個(gè)器件同時(shí)發(fā)起操作時(shí),總線仲裁機(jī)制將保證有且只有一個(gè)器件贏得總線,具體的過程是它們繼續(xù)發(fā)起條件,直到當(dāng)一個(gè)器件發(fā)送高電平,而另一個(gè)器件發(fā)送低電平時(shí),由于總線是開漏輸出,于是總線被拉低,于是發(fā)送高電平的器件檢測到低電平而主動(dòng)放棄總線而變成從器件,而發(fā)送低電平的器件贏得總線并繼續(xù)發(fā)送數(shù)據(jù). (3)AUX開關(guān) 在使用smbus總線時(shí),需要根據(jù)器件優(yōu)先權(quán)正確設(shè)置交叉開關(guān),例:如果使用UART0而不使用SPI總線,則SMBUS占用P0^2和P0^3,具體情況具體處理.優(yōu)先權(quán)譯碼表如下圖所示. (4)SFR描述 1.SMB0CN:SMBus0 控制寄存器 復(fù)位值 BUSY ENSMB STA STO SI AA FTE TOE 00000000 位7 位6 位5 位4 位3 位2 位1 位0 (可位尋址) SFR地址: 0xC0 位 7: BUSY:忙狀態(tài)標(biāo)志 0:SMBus0 空閉 1:SMBus0 忙 位 6: ENSMB:SMBus0 使能 該位使能/禁止 SMBus0 串行接口 0:禁止 SMBus 1:使能 SMBus 位 5: STA:SMBus0 起始標(biāo)志 0:不發(fā)送起始條件。 1:當(dāng)作為主器件時(shí),若總線空閉,則發(fā)送出一個(gè)起始條件。 (如果總線不空閑, 在收到停止條件后再發(fā)送起始條件。 )如果 STA 被置 1,而此時(shí)已經(jīng)發(fā)送或接 收了一個(gè)或多個(gè)字節(jié)并且沒有收到停止條件,則發(fā)送一個(gè)重復(fù)起始條件。為保 證操作正確,應(yīng)在對(duì) STA位置 1 之前,將 STO標(biāo)志清 0。 位 4: STO:SMBus0 停止標(biāo)志 0:不發(fā)送停止條件。 1:將 STO置為邏輯 1 將發(fā)送一個(gè)停止條件。當(dāng)收到停止條件時(shí),硬件將 STO 清為邏輯 0。如果 STA 和 STO 都被置位,則發(fā)送一個(gè)停止條件后再發(fā)送一個(gè) 起始條件。在從方式,置位 STO標(biāo)志將導(dǎo)致 SMBus 的行為象收到了停止條件 一樣。 位 3: SI:SMBus0 串行中斷標(biāo)志 當(dāng) SMBus0 進(jìn)入 27 種可能狀態(tài)之一時(shí)該位被硬件置位。 (狀態(tài)碼 0xF8 不使 SI 置位。 )當(dāng) SI 中斷被允許時(shí),該位置 1 將導(dǎo)致 CPU 轉(zhuǎn)向 SMBus0 中斷服務(wù)程 序。該位不能被硬件自動(dòng)清 0,必須用軟件清除。 位 2: AA:SMBus0 確認(rèn)標(biāo)志 該位定義在 SCL 線應(yīng)答周期內(nèi)返回的應(yīng)答類型。 0:在應(yīng)答周期內(nèi)返回“非確認(rèn)” (SDA線高電平) 。 1:在應(yīng)答周期內(nèi)返回“確認(rèn)” (SDA線低電平) 。 位 1: FTE:SMBus0 空閉定時(shí)器使能位 0:無 SCL 高電平超時(shí)。 1:當(dāng) SCL 高電平時(shí)間超過由 SMB0CR 規(guī)定的極限值時(shí)發(fā)生超時(shí)。 位 0: TOE:SMBus0 超時(shí)使能位 0:無 SCL 低電平超時(shí)。 1:當(dāng) SCL 處于低電平的時(shí)間超過由定時(shí)器 3(如果被允許)定義的極限值時(shí) 發(fā)生超時(shí)。 2.SMB0CR:SMBus0 時(shí)鐘速率寄存器 R/W R/W R/W R/W R/W R/W R/W R/W 復(fù)位值 00000000 位7 位6 位5 位4 位3 位2 位1 位0 SFR地址:0xCF 位 7-0: SMB0CR.[7:0]:SMBus0 時(shí)鐘速率預(yù)設(shè)值 SMB0CR 時(shí)鐘速率寄存器用于控制主方式下串行時(shí)鐘 SCL 的頻率。存儲(chǔ)在 SMB0CR 寄存器中的 8位字預(yù)裝一個(gè)專用的 8位定時(shí)器。該定時(shí)器向上計(jì)數(shù), 當(dāng)計(jì)滿回到 0x00 時(shí) SCL 改變邏輯狀態(tài)。 SMB0CR[7:0]的值應(yīng)根據(jù)下面的方程設(shè)置,其中 SMB0CR 是 SMB0CR 寄存器 中的 8 位無符號(hào)數(shù)值。SYSCLK 是系統(tǒng)時(shí)鐘頻率(單位為 Hz) 。 SMB0CR<(288-0.85xSYSCLK)/1.125E6 SCL 信號(hào)的高電平和低電平時(shí)間由下式給出: TLOW=(256-SMB0CR)/SYSCLK THIGH=(258-SMB0CR)/SYSCLK+625NS 使用相同的 SMB0CR 值,總線空閑超時(shí)周期由下式給出。 TBFT=10X(256-SMB0CR)+1/SYSCLK (3)SMB0DAT:SMBus0 數(shù)據(jù)寄存器 R/W R/W R/W R/W R/W R/W R/W R/W 復(fù)位值 00000000 位7 位6 位5 位4 位3 位2 位1 位0 SFR地址:0xC2 位 7-0: SMB0DAT:SMBus0 數(shù)據(jù) SMB0DAT 寄存器保存要發(fā)送到 SMBus0 串行接口上的一個(gè)數(shù)據(jù)字節(jié),或剛從 SMBus0 串行接口接收到的一個(gè)字節(jié)。一旦 SI 串行中斷標(biāo)志(SMB0CN.3)被 置為邏輯 1,CPU 即可讀或?qū)懺摷拇嫫?。?dāng) SI 標(biāo)志位不為 1 時(shí),系統(tǒng)可能正 在移入/移出數(shù)據(jù),此時(shí) CPU不應(yīng)訪問該寄存器。 (4)SMB0ADR:SMBus0 地址寄存器 復(fù)位值 SLV6 SLV5 SLV4 SLV3 SLV2 SLV1 SLV0 GC 00000000 位7 位6 位5 位4 位3 位2 位1 位0 SFR地址:0xC3 位 7-1: SLV6-SLV0:SMBus0 從地址 這些位用于存放 7 位從地址,當(dāng)器件工作在從發(fā)送器或從接收器方式時(shí), SMBus0 將應(yīng)答該地址。SLV6 是地址的最高位,對(duì)應(yīng)從 SMBus0 收到的地址 字節(jié)的第一位。 位 0: GC:全局呼叫地址使能 該位用于使能全局呼叫地址(0x00)識(shí)別。 0:忽略全局呼叫地址。 1:識(shí)別全局呼叫地址。 (5) SMB0STA:SMBus 狀態(tài)寄存器 復(fù)位值 STA7 STA6 STA5 STA4 STA3 STA2 STA1 STA0 11111000 位7 位6 位5 位4 位3 位2 位1 位0 SFR地址:0xC1 位 7-3: STA7-STA3:SMBus0 狀態(tài)代碼 這些位含有 SMBus0 狀態(tài)代碼。共有 28 個(gè)可能的狀態(tài)碼,每個(gè)狀態(tài)碼對(duì)應(yīng)一 個(gè) SMBus 狀態(tài)。在 SI 標(biāo)志(SMB0CN.3)置位時(shí),SMB0STA 中的狀態(tài)碼有 效。 當(dāng) SI標(biāo)志為邏輯 0時(shí), SMB0STA 中的內(nèi)容無定義。 任何時(shí)候向 SMB0STA 寄存器寫入將導(dǎo)致不確定的結(jié)果。 位 2-0: STA2-STA0:當(dāng) SI 標(biāo)志位為邏輯 1 時(shí),這三個(gè) SMB0STA 最低位的讀出值總 是為邏輯 0。 下面是smbus0的狀態(tài)碼,用這個(gè)狀態(tài)碼去判斷中斷服務(wù)程序該做什么 下面是例程,由于小弟才能力有限,未免有過多錯(cuò)誤,還請(qǐng)多多指教,這個(gè)程序是讀取pcf8563的秒時(shí)間,并把它顯示在s012864上面.(由于字?jǐn)?shù)限制,接下篇)
接上篇c8051f020smbus總線應(yīng)用
2008-05-04 22:45
#include sbit a0 =P2^0; sbit wr_rw=P2^4; sbit cs1=P2^1; sbit rd_EN=P2^3; sbit rst=P2^5; sbit bal=P3^0; //-----------------------------------------------// //---------define smbus0/i2c state constant------// //-----------------------------------------------// #define SMB_BUS_ERROR 0x60 //BUS error #define SMB_BUS_DSACK_R 0x28 //Data sent and recive ACK #define SMB_BUS_DSNACK_R 0x30 //Data sent and recive NACK #define SMB_BUS_STR 0x08 //Start condition sent and recive ACK #define SMB_BUS_STRR 0x10 //repeat start condition #define SMB_BUS_ADD_W_ACK 0x18 //address and write #define SMB_BUS_ADD_R_ACK 0x40 //address and reader #define SMB_BUS_NACK 0x30 //DATA sent reciver NACK #define SMB_BUS_ADD_W_NACK 0x20 //address sent and recive NACK #define SMB_BUS_ADD_R_NACK 0x48 //address sent and recive NACK #define SMB_BUS_DRACK_t 0x50 //Data recive and ACK sent #define SMB_BUS_DRNACK_t 0x58 //Data recive and NACK sent #define SMB_BUS_CMLOST 0X38 //can not get the bus free bit smb_busy; char OUT; char OUTADD; char IN; char watch; char count; char intdata; //------------------define pcf8563 address----------------------// #define PCF8563_READ 0xa3 //PCF8563 READ COMMAND #define PCF8563_WRITE 0xa2 //PCF8563 WRITE COMMAND #define PCF8563_CONTROLA 0X00 //Pcf8563 control reg1 #define PCF8563_CONTROLB 0X01 //pcf8563 control reg2 #define PCF8563_CLKOUT 0x0d //pcf8563 clkout reg #define PCF8563_TCON 0X0E //CONTENT CONTROL reg #define PCF8563_TCT 0x0f //TIMER value #define PCF8563_SEC 0X02 //SECOND CON #define PCF8563_MIN 0X03 //MIN con #define PCF8563_HOU 0x04 //HOU con #define PCF8563_DAY 0x05 //DAY con #define PCF8563_WEK 0X06 //WEK con #define PCF8563_MON 0x07 //MON CON #define PCF8563_YEAR 0X08 //YEAR con #define PCF8563_MINALR 0x09 //MIN alarming #define PCF8563_HOUALR 0X0A //HOUR alarming #define PCF8563_DAYALR 0X0B //DAY alarming #define PCF8563_WEKALR 0X0C //WEK alarming //--------------predeine time const----------// void SM_SEND(char address,char outpackage) { while (smb_busy); smb_busy=1; SMB0CN=0X44; OUTADD=address; OUT=outpackage; STA=1; } char SM_RECEIVE(char addr) { while (smb_busy); // 等待總線空閑 smb_busy = 1; //占用SMBus(設(shè)置為忙) SMB0CN = 0x44; // 允許SMBus,應(yīng)答周期發(fā)ACK OUTADD=addr; STA = 1; // 啟動(dòng)傳輸過程 while (smb_busy); // 等待傳輸結(jié)束 return IN; } void SMBUS_ISR(void) interrupt 7 { watch=SMB0STA; switch(watch) { case SMB_BUS_STR: SMB0DAT=OUTADD; STA=0; break; case SMB_BUS_ADD_W_ACK: SMB0DAT=OUT; break; case SMB_BUS_ADD_W_NACK: STO=1; STA=1; break; case SMB_BUS_DSACK_R: STO=1; smb_busy=0; break; case SMB_BUS_DSNACK_R: STO=1; STA=1; break; case SMB_BUS_CMLOST: STO=1; STA=1; break; case SMB_BUS_ADD_R_ACK: AA=0; break; case SMB_BUS_ADD_R_NACK: STA=1; break; case SMB_BUS_DRACK_t: STO=1; smb_busy=0; break; case SMB_BUS_DRNACK_t: IN=SMB0DAT; STO=1; smb_busy=0; break; default: STO=1; smb_busy=0; break; } SI=0; } void Delayl(void) { int x; for(x = 0;x < 5000;x) x++; } void delay() { unsigned char data i=5; while(i-->0); } void wdata80(unsigned char dat) { cs1=0; a0=1; //數(shù)據(jù) wr_rw=0;//寫 rd_EN=1; delay(); P1=dat; delay(); rd_EN=0; } void w_com80(unsigned char x) { cs1=0; a0=0;//命令 wr_rw=0;//寫 rd_EN=1;//ENABLE delay(); P1=x; delay(); rd_EN=0; } void w_com(unsigned char x) { w_com80(x); } void display_clr(void)//P是圖片數(shù)據(jù)的首地址 { unsigned char seg; unsigned char page; for(page=0xb0;page<0xb9;page++) //寫頁地址共 8 頁 0xb0----0xb8 { w_com(page); w_com(0x10); //列地址,高低字節(jié)兩次寫入,從第 0 列開始 w_com(0x00); for(seg=0;seg<128;seg++)//寫 128 列 { cs1=0; a0=1; //數(shù)據(jù) wr_rw=0;//寫 rd_EN=1; delay(); P1=0x00; delay(); rd_EN=0; } } } void display_map(unsigned char *p)//P是圖片數(shù)據(jù)的首地址 { unsigned char seg; unsigned char page; for(page=0xb0;page<0xb3;page++) //寫頁地址共 8 頁 0xb0----0xb8 { w_com(page); w_com(0x10); //列地址,高低字節(jié)兩次寫入,從第 0 列開始 w_com(0x00); for(seg=0;seg<10;seg++)//寫 128 列 { wdata80(*p++); } } } unsigned char code Bmp0[]= { /*------------------------------------------------------------------------------ ; 若數(shù)據(jù)亂碼,請(qǐng)檢查字模格式設(shè)置,注意選擇正確的取模方向和字節(jié)位順序。 ; 源文件 / 文字 : 0 ; 寬×高(像素): 10× ; 字模格式/大小 : 單色點(diǎn)陣液晶字模,縱向取模,字節(jié)倒序/30字節(jié) ; 數(shù)據(jù)轉(zhuǎn)換日期 : 2008-4-19 13:56:21 ------------------------------------------------------------------------------*/ //寬的像素?cái)?shù),高的像素?cái)?shù),寬的字節(jié)數(shù),參數(shù)設(shè)置可選 0x00,0x00,0xE0,0x78,0x08,0x04,0x08,0xF0,0x00,0x00,0x00,0x00,0x1F,0x78,0x40,0x40, 0x60,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, }; unsigned char code Bmp1[]= { /*------------------------------------------------------------------------------ ; 若數(shù)據(jù)亂碼,請(qǐng)檢查字模格式設(shè)置,注意選擇正確的取模方向和字節(jié)位順序。 ; 源文件 / 文字 : 1 ; 寬×高(像素): 10× ; 字模格式/大小 : 單色點(diǎn)陣液晶字模,縱向取模,字節(jié)倒序/30字節(jié) ; 數(shù)據(jù)轉(zhuǎn)換日期 : 2008-4-19 13:50:59 ------------------------------------------------------------------------------*/ //寬的像素?cái)?shù),高的像素?cái)?shù),寬的字節(jié)數(shù),參數(shù)設(shè)置可選 0x00,0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x7F,0x40, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, }; unsigned char code Bmp2[]= { /*------------------------------------------------------------------------------ ; 若數(shù)據(jù)亂碼,請(qǐng)檢查字模格式設(shè)置,注意選擇正確的取模方向和字節(jié)位順序。 ; 源文件 / 文字 : 2 ; 寬×高(像素): 10×19 ; 字模格式/大小 : 單色點(diǎn)陣液晶字模,縱向取模,字節(jié)倒序/30字節(jié) ; 數(shù)據(jù)轉(zhuǎn)換日期 : 2008-4-19 13:51:30 ------------------------------------------------------------------------------*/ //寬的像素?cái)?shù),高的像素?cái)?shù),寬的字節(jié)數(shù),參數(shù)設(shè)置可選 0x00,0x00,0x18,0x08,0x0C,0x08,0xF8,0x00,0x00,0x00,0x00,0x00,0x60,0x70,0x4C,0x46, 0x41,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, }; unsigned char code Bmp3[]= { /*------------------------------------------------------------------------------ ; 若數(shù)據(jù)亂碼,請(qǐng)檢查字模格式設(shè)置,注意選擇正確的取模方向和字節(jié)位順序。 ; 源文件 / 文字 : 3 ; 寬×高(像素): 10× ; 字模格式/大小 : 單色點(diǎn)陣液晶字模,縱向取模,字節(jié)倒序/30字節(jié) ; 數(shù)據(jù)轉(zhuǎn)換日期 : 2008-4-19 13:52:05 ------------------------------------------------------------------------------*/ //寬的像素?cái)?shù),高的像素?cái)?shù),寬的字節(jié)數(shù),參數(shù)設(shè)置可選 0x00,0x00,0x00,0x08,0x08,0x08,0xD8,0x20,0x00,0x00,0x00,0x00,0x40,0x40,0x41,0x41, 0x63,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, }; unsigned char code Bmp4[]= { /*------------------------------------------------------------------------------ ; 若數(shù)據(jù)亂碼,請(qǐng)檢查字模格式設(shè)置,注意選擇正確的取模方向和字節(jié)位順序。 ; 源文件 / 文字 : 4 ; 寬×高(像素): 10× ; 字模格式/大小 : 單色點(diǎn)陣液晶字模,縱向取模,字節(jié)倒序/30字節(jié) ; 數(shù)據(jù)轉(zhuǎn)換日期 : 2008-4-19 13:53:00 ------------------------------------------------------------------------------*/ //寬的像素?cái)?shù),高的像素?cái)?shù),寬的字節(jié)數(shù),參數(shù)設(shè)置可選 0x00,0x00,0x00,0xC0,0x20,0x10,0xFC,0x00,0x00,0x00,0x00,0x0C,0x0F,0x0C,0x0C,0x0C, 0x7F,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, }; unsigned char code Bmp5[]= { /*------------------------------------------------------------------------------ ; 若數(shù)據(jù)亂碼,請(qǐng)檢查字模格式設(shè)置,注意選擇正確的取模方向和字節(jié)位順序。 ; 源文件 / 文字 : 5 ; 寬×高(像素): 10×19 ; 字模格式/大小 : 單色點(diǎn)陣液晶字模,縱向取模,字節(jié)倒序/30字節(jié) ; 數(shù)據(jù)轉(zhuǎn)換日期 : 2008-4-19 13:53:33 ------------------------------------------------------------------------------*/ //寬的像素?cái)?shù),高的像素?cái)?shù),寬的字節(jié)數(shù),參數(shù)設(shè)置可選 0x00,0x00,0xC0,0xF0,0x88,0x88,0x08,0x00,0x00,0x00,0x00,0x00,0x40,0x40,0x40,0x41, 0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, }; unsigned char code Bmp6[]= { /*------------------------------------------------------------------------------ ; 若數(shù)據(jù)亂碼,請(qǐng)檢查字模格式設(shè)置,注意選擇正確的取模方向和字節(jié)位順序。 ; 源文件 / 文字 : 6 ; 寬×高(像素): 10×19 ; 字模格式/大小 : 單色點(diǎn)陣液晶字模,縱向取模,字節(jié)倒序/30字節(jié) ; 數(shù)據(jù)轉(zhuǎn)換日期 : 2008-4-19 13:54:18 ------------------------------------------------------------------------------*/ //寬的像素?cái)?shù),高的像素?cái)?shù),寬的字節(jié)數(shù),參數(shù)設(shè)置可選 0x00,0x00,0xC0,0x60,0x10,0x08,0x08,0x04,0x00,0x00,0x00,0x00,0x3F,0x41,0x41,0x41, 0x63,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, }; unsigned char code Bmp7[]= { /*------------------------------------------------------------------------------ ; 若數(shù)據(jù)亂碼,請(qǐng)檢查字模格式設(shè)置,注意選擇正確的取模方向和字節(jié)位順序。 ; 源文件 / 文字 : 7 ; 寬×高(像素): 10×19 ; 字模格式/大小 : 單色點(diǎn)陣液晶字模,縱向取模,字節(jié)倒序/30字節(jié) ; 數(shù)據(jù)轉(zhuǎn)換日期 : 2008-4-19 13:54:57 ------------------------------------------------------------------------------*/ //寬的像素?cái)?shù),高的像素?cái)?shù),寬的字節(jié)數(shù),參數(shù)設(shè)置可選 0x00,0x00,0x18,0x08,0x08,0x08,0xF8,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x07, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, }; unsigned char code Bmp8[]= { /*------------------------------------------------------------------------------ ; 若數(shù)據(jù)亂碼,請(qǐng)檢查字模格式設(shè)置,注意選擇正確的取模方向和字節(jié)位順序。 ; 源文件 / 文字 : 8 ; 寬×高(像素): 10×19 ; 字模格式/大小 : 單色點(diǎn)陣液晶字模,縱向取模,字節(jié)倒序/30字節(jié) ; 數(shù)據(jù)轉(zhuǎn)換日期 : 2008-4-19 13:55:21 ------------------------------------------------------------------------------*/ //寬的像素?cái)?shù),高的像素?cái)?shù),寬的字節(jié)數(shù),參數(shù)設(shè)置可選 0x00,0x00,0x78,0x88,0x04,0x08,0xF8,0x20,0x00,0x00,0x00,0x00,0x7C,0x43,0x43,0x47, 0x4C,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, }; unsigned char code Bmp9[]= { /*------------------------------------------------------------------------------ ; 若數(shù)據(jù)亂碼,請(qǐng)檢查字模格式設(shè)置,注意選擇正確的取模方向和字節(jié)位順序。 ; 源文件 / 文字 : 9 ; 寬×高(像素): 10×19 ; 字模格式/大小 : 單色點(diǎn)陣液晶字模,縱向取模,字節(jié)倒序/30字節(jié) ; 數(shù)據(jù)轉(zhuǎn)換日期 : 2008-4-19 13:55:48 ------------------------------------------------------------------------------*/ //寬的像素?cái)?shù),高的像素?cái)?shù),寬的字節(jié)數(shù),參數(shù)設(shè)置可選 0x00,0x00,0xF0,0x08,0x04,0x08,0x38,0xE0,0x00,0x00,0x00,0x00,0x03,0x42,0x64,0x32, 0x0F,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, }; void config (void) { //Local Variable Definitions //---------------------------------------------------------------- // Watchdog Timer Configuration // // WDTCN.[7:0]: WDT Control // Writing 0xA5 enables and reloads the WDT. // Writing 0xDE followed within 4 clocks by 0xAD disables the WDT // Writing 0xFF locks out disable feature. // // WDTCN.[2:0]: WDT timer interval bits // NOTE! When writing interval bits, bit 7 must be a 0. // // Bit 2 | Bit 1 | Bit 0 //------------------------ // 1 | 1 | 1 Timeout interval = 1048576 x Tsysclk // 1 | 1 | 0 Timeout interval = 262144 x Tsysclk // 1 | 0 | 1 Timeout interval = 65636 x Tsysclk // 1 | 0 | 0 Timeout interval = 16384 x Tsysclk // 0 | 1 | 1 Timeout interval = 4096 x Tsysclk // 0 | 1 | 0 Timeout interval = 1024 x Tsysclk // 0 | 0 | 1 Timeout interval = 256 x Tsysclk // 0 | 0 | 0 Timeout interval = 64 x Tsysclk // //------------------------ WDTCN = 0x07; // Watchdog Timer Control Register WDTCN = 0xDE; // Disable WDT WDTCN = 0xAD; WDTCN = 0xFF; // Disable WDT Lockout //---------------------------------------------------------------- // CROSSBAR REGISTER CONFIGURATION // // NOTE: The crossbar register should be configured before any // of the digital peripherals are enabled. The pinout of the // device is dependent on the crossbar configuration so caution // must be exercised when modifying the contents of the XBR0, // XBR1, and XBR2 registers. For detailed information on // Crossbar Decoder Configuration, refer to Application Note // AN001, "Configuring the Port I/O Crossbar Decoder". //---------------------------------------------------------------- // Configure the XBRn Registers XBR0 = 0x05; // XBAR0: Initial Reset Value XBR1 = 0x00; // XBAR1: Initial Reset Value XBR2 = 0xC0; // XBAR2: Initial Reset Value // Select Pin I/0 // NOTE: Some peripheral I/O pins can function as either inputs or // outputs, depending on the configuration of the peripheral. By default, // the configuration utility will configure these I/O pins as push-pull // outputs. // Port configuration (1 = Push Pull Output) P0MDOUT = 0x00; // Output configuration for P0 P1MDOUT = 0xff; // Output configuration for P1 P2MDOUT = 0xff; // Output configuration for P2 P3MDOUT = 0x03; // Output configuration for P3 P74OUT = 0xff; // Output configuration for P4-7 P1MDIN = 0xff; // Input configuration for P1 // View port pinout // The current Crossbar configuration results in the // following port pinout assignment: // Port 0 // P0.0 = unassigned (Open-Drain Output/Input) // P0.1 = unassigned (Open-Drain Output/Input) // P0.2 = unassigned (Open-Drain Output/Input) // P0.3 = unassigned (Open-Drain Output/Input) // P0.4 = unassigned (Open-Drain Output/Input) // P0.5 = unassigned (Open-Drain Output/Input) // P0.6 = unassigned (Open-Drain Output/Input) // P0.7 = unassigned (Open-Drain Output/Input) // Port 1 // P1.0 = unassigned (Open-Drain Output/Input)(Digital) // P1.1 = unassigned (Open-Drain Output/Input)(Digital) // P1.2 = unassigned (Open-Drain Output/Input)(Digital) // P1.3 = unassigned (Open-Drain Output/Input)(Digital) // P1.4 = unassigned (Open-Drain Output/Input)(Digital) // P1.5 = unassigned (Open-Drain Output/Input)(Digital) // P1.6 = unassigned (Open-Drain Output/Input)(Digital) // P1.7 = unassigned (Open-Drain Output/Input)(Digital) // Port 2 // P2.0 = unassigned (Open-Drain Output/Input) // P2.1 = unassigned (Open-Drain Output/Input) // P2.2 = unassigned (Open-Drain Output/Input) // P2.3 = unassigned (Open-Drain Output/Input) // P2.4 = unassigned (Open-Drain Output/Input) // P2.5 = unassigned (Open-Drain Output/Input) // P2.6 = unassigned (Open-Drain Output/Input) // P2.7 = unassigned (Open-Drain Output/Input) // Port 3 // P3.0 = unassigned (Open-Drain Output/Input) // P3.1 = unassigned (Open-Drain Output/Input) // P3.2 = unassigned (Open-Drain Output/Input) // P3.3 = unassigned (Open-Drain Output/Input) // P3.4 = unassigned (Open-Drain Output/Input) // P3.5 = unassigned (Open-Drain Output/Input) // P3.6 = unassigned (Open-Drain Output/Input) // P3.7 = unassigned (Open-Drain Output/Input) EMI0CF = 0x20; // External Memory Configuration Register //---------------------------------------------------------------- // Comparators Register Configuration // // Bit 7 | Bit 6 | Bit 5 | Bit 4 | Bit 3 | Bit 2 | Bit 1 | Bit 0 //------------------------------------------------------------------ // R/W | R | R/W | R/W | R/W | R/W | R/W | R/W //------------------------------------------------------------------ // Enable | Output | Rising | Falling| Positive | Negative // | State | Edge | Edge | Hysterisis | Hysterisis // | Flag | Int. | Int. | 00: Disable | 00: Disable // | | Flag | Flag | 01: 5mV | 01: 5mV // | | | | 10: 10mV | 10: 10mV // | | | | 11: 20mV | 11: 20mV // ---------------------------------------------------------------- CPT0CN = 0x00; // Comparator 0 Control Register CPT1CN = 0x00; // Comparator 1 Control Register //Comp1 marker //---------------------------------------------------------------- // Oscillator Configuration //---------------------------------------------------------------- OSCXCN = 0x00; // EXTERNAL Oscillator Control Register OSCICN = 0x07; // Internal Oscillator Control Register //---------------------------------------------------------------- // Reference Control Register Configuration //---------------------------------------------------------------- REF0CN = 0x00; // Reference Control Register //---------------------------------------------------------------- // ADC Configuration //---------------------------------------------------------------- AMX0CF = 0x60; // AMUX Configuration Register AMX0SL = 0x00; // AMUX Channel Select Register ADC0CF = 0xF8; // ADC Configuration Register ADC0CN = 0x00; // ADC Control Register ADC0LTH = 0x00; // ADC Less-Than High Byte Register ADC0LTL = 0x00; // ADC Less-Than Low Byte Register ADC0GTH = 0xFF; // ADC Greater-Than High Byte Register ADC0GTL = 0xFF; // ADC Greater-Than Low Byte Register AMX1SL = 0x00; // AMUX1 Channel Select Register ADC1CF = 0xF8; // ADC1 Configuration Register ADC1CN = 0x00; // ADC1 Control Register //---------------------------------------------------------------- // DAC Configuration //---------------------------------------------------------------- DAC0CN = 0x00; // DAC0 Control Register DAC0L = 0x00; // DAC0 Low Byte Register DAC0H = 0x00; // DAC0 High Byte Register DAC1CN = 0x00; // DAC1 Control Register DAC1L = 0x00; // DAC1 Low Byte Register DAC1H = 0x00; // DAC1 High Byte Register //---------------------------------------------------------------- // SPI Configuration //---------------------------------------------------------------- SPI0CN = 0x00; // SPI Control Register SPI0CFG = 0x00; // SPI Configuration Register SPI0CKR = 0x00; // SPI Clock Rate Register //---------------------------------------------------------------- // UART Configuration //---------------------------------------------------------------- SCON0 = 0x00; // Serial Port Control Register SADEN0 = 0x00; // Serial 0 Slave Address Enable SADDR0 = 0x00; // Serial 0 Slave Address Register PCON = 0x00; // Power Control Register SCON1 = 0x00; // Serial Port 1 Control Register SADEN1 = 0x00; // Serial 1 Slave Address Enable SADDR1 = 0x00; // Serial 1 Slave Address Register //---------------------------------------------------------------- // SMBus Configuration //---------------------------------------------------------------- SMB0CN = 0x40; // SMBus Control Register SMB0ADR = 0x00; // SMBus Address Register SMB0CR = 0xEC; // SMBus Clock Rate Register //---------------------------------------------------------------- // PCA Configuration //---------------------------------------------------------------- PCA0MD = 0x00; // PCA Mode Register PCA0CN = 0x00; // PCA Control Register PCA0H = 0x00; // PCA Counter/Timer High Byte PCA0L = 0x00; // PCA Counter/Timer Low Byte //Module 0 PCA0CPM0 = 0x00; // PCA Capture/Compare Register 0 PCA0CPL0 = 0x00; // PCA Counter/Timer Low Byte PCA0CPH0 = 0x00; // PCA Counter/Timer High Byte //Module 1 PCA0CPM1 = 0x00; // PCA Capture/Compare Register 1 PCA0CPL1 = 0x00; // PCA Counter/Timer Low Byte PCA0CPH1 = 0x00; // PCA Counter/Timer High Byte //Module 2 PCA0CPM2 = 0x00; // PCA Capture/Compare Register 2 PCA0CPL2 = 0x00; // PCA Counter/Timer Low Byte PCA0CPH2 = 0x00; // PCA Counter/Timer High Byte //Module 3 PCA0CPM3 = 0x00; // PCA Capture/Compare Register 3 PCA0CPL3 = 0x00; // PCA Counter/Timer Low Byte PCA0CPH3 = 0x00; // PCA Counter/Timer High Byte //Module 4 PCA0CPM4 = 0x00; // PCA Capture/Compare Register 4 PCA0CPL4 = 0x00; // PCA Counter/Timer Low Byte PCA0CPH4 = 0x00; // PCA Counter/Timer High Byte //---------------------------------------------------------------- // Timer Configuration //---------------------------------------------------------------- CKCON = 0x00; // Clock Control Register TH0 = 0x00; // Timer 0 High Byte TL0 = 0x00; // Timer 0 Low Byte TH1 = 0x00; // Timer 1 High Byte TL1 = 0x00; // Timer 1 Low Byte TMOD = 0x00; // Timer Mode Register TCON = 0x00; // Timer Control Register RCAP2H = 0x00; // Timer 2 Capture Register High Byte RCAP2L = 0x00; // Timer 2 Capture Register Low Byte TH2 = 0x00; // Timer 2 High Byte TL2 = 0x00; // Timer 2 Low Byte T2CON = 0x00; // Timer 2 Control Register TMR3RLL = 0x00; // Timer 3 Reload Register Low Byte TMR3RLH = 0x00; // Timer 3 Reload Register High Byte TMR3H = 0x00; // Timer 3 High Byte TMR3L = 0x00; // Timer 3 Low Byte TMR3CN = 0x00; // Timer 3 Control Register RCAP4H = 0x00; // Timer 4 Capture Register High Byte RCAP4L = 0x00; // Timer 4 Capture Register Low Byte TH4 = 0x00; // Timer 4 High Byte TL4 = 0x00; // Timer 4 Low Byte T4CON = 0x00; // Timer 4 Control Register //---------------------------------------------------------------- // Reset Source Configuration // // Bit 7 | Bit 6 | Bit 5 | Bit 4 | Bit 3 | Bit 2 | Bit 1 | Bit 0 //------------------------------------------------------------------ // R | R/W | R/W | R/W | R | R | R/W | R //------------------------------------------------------------------ // JTAG |Convert | Comp.0 | S/W | WDT | Miss. | POR | HW // Reset |Start | Reset/ | Reset | Reset | Clock | Force | Pin // Flag |Reset/ | Enable | Force | Flag | Detect| & | Reset // |Enable | Flag | & | | Flag | Flag | Flag // |Flag | | Flag | | | | //------------------------------------------------------------------ // NOTE! : Comparator 0 must be enabled before it is enabled as a // reset source. // // NOTE! : External CNVSTR must be enalbed through the crossbar, and // the crossbar enabled prior to enabling CNVSTR as a reset source //------------------------------------------------------------------ RSTSRC = 0x00; // Reset Source Register //---------------------------------------------------------------- // Interrupt Configuration //---------------------------------------------------------------- IE = 0x80; //Interrupt Enable IP = 0x00; //Interrupt Priority EIE1 = 0x02; //Extended Interrupt Enable 1 EIE2 = 0x00; //Extended Interrupt Enable 2 EIP1 = 0x00; //Extended Interrupt Priority 1 EIP2 = 0x00; //Extended Interrupt Priority 2 // other initialization code here... } //End of config void init_pcf8563(void) { intdata=0x00; count=0x01; SM_SEND(PCF8563_WRITE,PCF8563_CONTROLA); while (smb_busy); intdata=0x00; count=0x01; SM_SEND(PCF8563_WRITE,PCF8563_CONTROLB); while (smb_busy); intdata=0x80; count=0x01; SM_SEND(PCF8563_WRITE,PCF8563_CLKOUT);//CLK輸出頻率32.768K while (smb_busy); intdata=0x00; count=0x01; SM_SEND(PCF8563_WRITE,PCF8563_MINALR);//分報(bào)警無效 while (smb_busy); intdata=0x00; count=0x01; SM_SEND(PCF8563_WRITE,PCF8563_HOUALR);//時(shí)報(bào)警無效 while (smb_busy); intdata=0x00; count=0x01; SM_SEND(PCF8563_WRITE,PCF8563_DAYALR);//日?qǐng)?bào)警無效 while (smb_busy); intdata=0x00; count=0x01; SM_SEND(PCF8563_WRITE,PCF8563_WEKALR);//星期報(bào)警無效 } void main(void) { char IND; char CHG; config(); rst=0; delay(); rst=1; delay(); w_com80(0xaf); w_com80(0x40); w_com80(0xa0); w_com80(0xa6); w_com80(0xa4); w_com80(0xa2); w_com80(0xc8); w_com80(0x2f); w_com80(0x25); w_com80(0x81); w_com80(0x15); display_clr();小弟不知道為什么每次配置好so16824以后,每次都要全屏清空一下,不然會(huì)花屏; P3=0x02; smb_busy=0; while(1) { SM_SEND(PCF8563_WRITE,PCF8563_SEC); IND=SM_RECEIVE(PCF8563_READ); CHG=IND&0x0f; switch (CHG) { case 0x00: display_map(&Bmp0); break; case 0x01: display_map(&Bmp1); break; case 0x02: display_map(&Bmp2); break; case 0x03: display_map(&Bmp3); break; case 0x04: display_map(&Bmp4); break; case 0x05: display_map(&Bmp5); break; case 0x06: display_map(&Bmp6); break; case 0x07: display_map(&Bmp7); break; case 0x08: display_map(&Bmp8); break; case 0x09: display_map(&Bmp9); break; default: break; } } }
BTF320開發(fā)評(píng)估板
1
BTF320開發(fā)評(píng)估板使用說明書
Version: 1.0
目錄
一BT F320開發(fā)評(píng)估板功能簡介……………………2
二BT F320開發(fā)評(píng)估板范例
三Silicon Laboratories IDE安裝配置…………5
四BT F320開發(fā)評(píng)估板使用方法……………………6
五BT F320開發(fā)評(píng)估板原理圖………………………7
BTF320開發(fā)評(píng)估板
2
一.BT F320開發(fā)評(píng)估板功能簡介
1.產(chǎn)品簡介
BT F320評(píng)估板是新華龍電子有限公司針對(duì)
推出的一款開發(fā),評(píng)估板.集成了C8051F320單片機(jī)的基本外圍電路和典型應(yīng)用電路,開
發(fā)者可通過評(píng)估板上具有的各功能擴(kuò)展接口及附帶光盤提供的完整的演示程序,迅速的掌握
C8051F320單片機(jī)的軟硬件設(shè)計(jì)(特別是USB通信的相關(guān)設(shè)計(jì)),達(dá)到縮短產(chǎn)品開發(fā)周期的
目的.
2.功能簡介:(可完成的實(shí)驗(yàn)項(xiàng)目)
·USB通信(片上集成了USB控制器)·SMBUS,SPI接口
·AD轉(zhuǎn)換·UART通信
·FRAM讀寫(FM24系列)·可編程電壓比較器
·PCA(可編程計(jì)數(shù)器陣列)·PWM輸出
·2X2鍵盤掃描·2X16LCD驅(qū)動(dòng)
3. C8051F320片上資源:
·16k FLASH·1280byte RAM
·USB2.0控制器·4個(gè)16位定時(shí)器/計(jì)數(shù)器
·內(nèi)置溫度傳感器·SMBUS,增強(qiáng)型SPI接口
·UART串口·16位的可編程計(jì)數(shù)陣列(PCA)
·可編程片內(nèi)電壓比較器
4.開發(fā)板組成
●BT F320開發(fā)評(píng)估板一塊
●交叉串口線一條
●9V直流電源一個(gè)
BTF320開發(fā)評(píng)估板
3
●附帶光盤一張
5.BT F320評(píng)估板的跳線說明
J1 I/O口
J2 USB接口
J3 ADC輸入接口(信號(hào)經(jīng)由運(yùn)放電路LM324)
J4經(jīng)由LM324整理后的模擬信號(hào)與AD輸入引腳的連接跳線
J5 CP輸入引腳
J6電位器(R15)輸出與P1.7連接跳線
J7 1腳,1602LCD背光控制位2腳,P2.5 3腳,D3正極
J8 UART接口
J9外部VREF(+2.5V)
J10 1腳,P2.6 2腳,D4正極
J11 C2接口
二.BT F320開發(fā)評(píng)估板測試程序詳細(xì)說明
1,本公司提供的測試程序已經(jīng)應(yīng)用Silicon Laboratories IDE軟件編譯通過.IDE配置
參考"三.Silicon Laboratories IDE安裝配置"內(nèi)容.
2,晶振的選擇:由于C8051F320片內(nèi)集成有高精度的可編程內(nèi)部振蕩器,附帶光盤中提供的
范例程序都采用內(nèi)部晶振.但評(píng)估板上仍留有外部晶振電路,開發(fā)者可根據(jù)開發(fā)需要自行
選用.
3,測試程序說明
所有測試程序在附帶光盤的…BTF\BTF320\...目錄下,
(1)溫度測量程序(例程:adc_temp.c和lcd1602a.c)
摘要:本程序使用C8051F320芯片的片內(nèi)溫度傳感器,實(shí)現(xiàn)對(duì)芯片表面溫度進(jìn)行測量,
測量值通過LCD顯示且從UART發(fā)送至PC機(jī).
(2)模擬量(電壓)的采樣(例程:ADC1.C和lcd1602a.c)
BTF320開發(fā)評(píng)估板
4
摘要:本程序主要實(shí)現(xiàn)對(duì)模擬量(電壓)的采樣,AD轉(zhuǎn)換,LCD顯示并通過UART發(fā)送
到PC機(jī).實(shí)驗(yàn)時(shí)短接以下跳線:J4.1—J4.2;J7.1—J7.2;J9.1—J9.2
注:LMV324只對(duì)兩個(gè)通道的信號(hào)進(jìn)行調(diào)整,做ADC0應(yīng)用實(shí)驗(yàn)時(shí)一定要注意以下問題:
.在信號(hào)調(diào)理的輸入端J3-4腳(J3的第4腳)可以輸入+6/-6的電壓經(jīng)過LMV324調(diào)
理后進(jìn)行采樣,也就是該輸入通道能對(duì)調(diào)理后的+6/-6V的電壓信號(hào)進(jìn)行采樣.
.在信號(hào)調(diào)整的輸入端J3-1(J3的第1腳)可以輸入4~20毫安的電流經(jīng)過電壓跟隨
器輸入到芯片的AIN0.1腳進(jìn)行采樣.(特別強(qiáng)調(diào):該通道不能輸入+6/-6V的電壓,
雖然LMV324進(jìn)行了信號(hào)的調(diào)整,但LMV324組成的電路僅是一個(gè)電壓跟隨器,在J11-1
腳輸入多大的電壓或電流都是直接加到芯片的ADC輸入引腳.如果用戶不按該原則做
實(shí)驗(yàn),而損壞芯片本公司概不負(fù)責(zé).)
(3)比較器(例程:CP1.c)
功能:由CP的CP+,CP-的高低來控制紅色LED(D4)亮/滅(CP+>CP-則LED亮,相反滅).
可在中斷程序中設(shè)斷點(diǎn)觀察.
(4)LCD顯示(例程:lcd1602a.C)
摘要:本程序是LCD測試程序.用NLS595的并行輸出腳作為LCD的數(shù)據(jù)引腳.實(shí)驗(yàn)時(shí)短接
以下跳線:J7.1—J7.2
功能:運(yùn)行程序,顯示兩行字符"BT F320V1.0"和"www.xhl.com.cn"
(5)FRAM讀寫(例程: 24c04test.c)
摘要:本程序是I2C(SMBUS)讀寫程序,實(shí)現(xiàn)FM24C04A的讀寫操作.
(6)8位PWM(例程: pwm8.c)
摘要:PCA工作在8位脈寬調(diào)制器工作方式,在PWM引腳輸出一個(gè)占空比為00xfe的PWM
信號(hào)且重復(fù)輸出,可用示波器觀察占空比變化.
(7)鍵盤掃描(例程: key.c和lcd1602a.c)
摘要:這個(gè)程序掃描KEY1—KEY4.有按鍵按下后,返回相應(yīng)按鍵的字符:'1','2',
'3','4',并在LCD上顯示出來.實(shí)驗(yàn)時(shí)短接以下跳線:J7.1—J7.2
(8)USB測試
摘要:測試前先將J6短路環(huán)連好,把USB線接上.然后在IDE里裝載"
BTF320開發(fā)評(píng)估板
5
USBDEMO"中的項(xiàng)目文件,進(jìn)行編譯,連接,下載并運(yùn)行此程序.打
開USBtest.exe(該程序在IDE根目錄下)運(yùn)行界面如圖3.
圖3
按下S2按鍵,第一個(gè)Button變亮,再按一下變暗.
按下S3按鍵,第二個(gè)Button變亮,再按一下變暗.
選LED1,板上D4燈閃爍,選LED2,板上D3燈閃爍.
用手撥動(dòng)R15電位器,Pot指針隨之改變.
Temp指針顯示CPU內(nèi)部溫度傳感器采樣值.
三.Silicon Laboratories IDE安裝配置
1.IDE安裝:自動(dòng)運(yùn)行附帶光盤,點(diǎn)擊"安裝Silabs IDE",按提示進(jìn)行安裝即可.
2.CP210X驅(qū)動(dòng)的安裝:僅在選用U_EC2或使用CP210X芯片時(shí)需要安裝此驅(qū)動(dòng)程序.
自動(dòng)運(yùn)行附帶光盤,點(diǎn)擊"安裝CP210X驅(qū)動(dòng)",按提示進(jìn)行安裝即可
3.安裝結(jié)束,打開IDE集成開發(fā)環(huán)境,在新建或打開原有的項(xiàng)目后,點(diǎn)擊主菜單
"Options"選擇"ConnectionOptions.."選項(xiàng)(如圖2所示),進(jìn)入圖3界面.
BTF320開發(fā)評(píng)估板
6
圖2
(1)若調(diào)試器使用U_EC3/U_EC5,選擇與圖3相同選項(xiàng),點(diǎn)擊OK即可進(jìn)行連接,程序
下載和在線調(diào)試.
(2)若調(diào)試器使用U_EC2,圖3中"Serial
Adapter"框選"RS232 Serial Adapter…."一項(xiàng).
其中,"COMPORT"的選擇要參照"設(shè)備管理器"的端
口選項(xiàng)(圖4中紅色圓圈).已知紅色圓圈內(nèi)容后,點(diǎn)
擊"COMPORT"復(fù)選框,選擇"Other COM"項(xiàng),輸入
與"設(shè)備管理器"中相同的COM口值(如"3".注:
只輸入"3"),則"COMPORT"復(fù)選框的內(nèi)容為"COM3".
點(diǎn)擊OK即可進(jìn)行連接,程序下載和在線調(diào)試.
圖3
圖4
BTF320開發(fā)評(píng)估板
7
四BT F320評(píng)估開發(fā)板使用方法:
1.將調(diào)試器用10芯扁平電纜連接到評(píng)估板的C2口.
2.給評(píng)估板供電.接通電源的正確順序:首先連接好調(diào)試器和評(píng)估板,然后接通評(píng)估板電
源.不可以先提供評(píng)估板電源,再連接調(diào)試器.
3.打開IDE開發(fā)環(huán)境,選擇好調(diào)試口.使用調(diào)試器對(duì)C8051F320芯片編程和在線調(diào)試
評(píng)論