飛思卡爾筆記之SCI_第1頁
飛思卡爾筆記之SCI_第2頁
飛思卡爾筆記之SCI_第3頁
飛思卡爾筆記之SCI_第4頁
飛思卡爾筆記之SCI_第5頁
已閱讀5頁,還剩4頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、作者:盛多錚單位:安徽師范大學電子信息工程系說明:文檔僅供學習和參考用,任何商業使用務必經過作者本人同意,否者將承擔法律責任寒假的時候開始接觸飛思卡爾系列單片機,市場上還沒有以MC9S12XS128為例介紹的書籍,我買了一本蘇州大學王宜懷老師寫的嵌入式系統一一使用HCS12微控制器的設計與應用,這本書寫的很好,各模塊的編程都講解的很詳細。但是書畢竟好多地方還是翻譯手冊的,固然沒有手冊寫的那么詳細,而且書中的例子是以DG128為例給出的。由于自己的英文水平也不是那么的好,只能一邊參考中文書籍,一邊對照著9s128的Datasheet看。為了讓后來的飛思卡爾學習者在入門的時候少走些彎路,這里將自己

2、在各模塊學習時候的一些收獲總結如下,僅供參考。個人覺得SCI模塊還是很簡單的,設計到的寄存器不是很多,所以就先講SCI模塊的應用吧。不論是哪個模塊的應用,在編寫程序的時候總是要設計到MCU的初始化,所謂MCUinit,無非是設置總線的時鐘,設置PLL,決定是否允許IRQ中斷和看門狗。所以要講SCI模塊的編程,還得先介紹一下CRG模塊的知識。下面是手冊上給出的關于CRG模塊的寄存器:Figure8*2givesanoverviewonallS12XECRGregisters.Bit7654321BHOR0x0000SYHRWR0x0001REFDVwR0x0002POSTDIVWR0x0003C

3、RGFLGWR0x£)004CRGINTWR0x0005CLKSELWR0x0006PLLCTLWR0x0007RTICTLWR0x0008COPCTLWrR(IxflOOeFORBYP2W,ROkOOOActctl2wROxOOOBARMCOPW2FORBYPandCTCTLsVCQFRQI1:0SYNDIV5:0REFFRQ1:0|REFDIV5:000aPOSTDIV4:0|RTIFPORFLVRFLOCKIFLOCKILAFSCMIFSCMRTIE00LOCKIE00SCMIE0PLLSELPSTPXCLKS0PLLWAI0RTIWAICOPWAICMEPLLONFM1FM0

4、FSTWKPPREPCESCMERTDECRTR6RTR5RTR4RTR3RTR2RTR1RTROWCOPRSBCKa00CR2CR1CR0WRTKfASK000000000000000Q0000D000Bit7BiiaBttSBit4Bit2Bit1BitOreintgfidedlkjrfactorytestpurpo&esonly.=Unimpleiment&dorReserved在編程時經常要用到的寄存器有:CRG合成器寄存器(SYNR)CRG參考分頻寄存器,(REFDV)CRG標志寄存器(CRGFLG)CRG時鐘選擇寄存器(CLKSEL)PLL控制寄存器(PLLCTL)

5、看門狗控制寄存器(COPCTL)實時中斷寄存器(RTICTL)S12XECRGPostDividerRegister(POSTDIV,這個寄存器不知道中文名稱叫什么,反正也不影響編程呵呵)根據需要設置的時鐘頻率來設置SYNR和REFDV,其計算公式為f=v(SYNDIV-l)VCO'黑TOSCX(REFDIV*1)f=PLL2xPOSTDIV/_fPLI.BUS其中在POSTDV寄存器的值設為0時,fVCO和fPLL相等,比如說,外部晶振是9.8304MHZ,SYNR和REFDIV的值分別為1和0,貝UBUS的頻率為19.6608MHZ。對于CRGFLG寄存器,手冊上給出的關于各位的描

6、述是這樣的:FieldDescription7RTIFRealTimeInterruptFlagRTIFisto1attheendofltieRTIperiod.Thisflagcanionlybeclearedbywritonga1.Writinga0hasnoeffectIfenabted(RTIE-1),RTIFcausesaninterruptrequest0RTItime-outhasnotyetoccurred.1RTItims<nuthasoccurred.6PORFPoweronResotFlagPORFissetto1whenapowGironresetoccurs.T

7、hisflagcanonlybeclearedbywritinga1.Writinga0has.noeffect.0Ptweronresethas.notoccurred1Roweronresethasoccurred.5LVRFLewVoltageResetFlagLVRFissetto1whenalewvoltageresetoccursThisflagcanonly!>eclearedfrywritingaLWritinga0hasnoeffect.0LowvoltagsrGsethasnotoccurred.1Lowvoltageresethasoccurred4LOCKIFIP

8、LLLockInterruplFlagLOCKIF伶to*/fbenLQCKstatusbitchanges.ThiHagcnonlybeclearedbywritinga1,Wriiina0hasnoeffectIfenabledLOCKIE-1.LOCKIFcausesaninterruptrequest.0NcchangeinLOCKbiL1LOCKbithaschanged.3LOCKLockStatusBitLOCKreflectsIhecurrentstateofIPLLlockcondition.ThisbitisdearedinSelfClockModa.Writsshaven

9、oeffect.0VCOCLKisnolwithinIhedesiredtoleranceoftheJargetfrequency.1VCOCLKiswithintiledesiredtoleranceofthetarg-elfrequency.2ILAFIllegalAddressResetFlagHLAFIssetto1whenanIllegaladdressresetoouraRefertoS12XMMCBlotikGuidefardetais.Thisflagcanonlybaclearedbywritinga1.Writinga0hasnoeffect.0Illegaladdress

10、re&ethasnotoccijrrecl.1Illegaladdressreselhasoccurred.1SCMIFSelfClockModeInl&iTuptFlag一SCMIFi$s,etto1whenSCM孰alusbitchangesThis(lagcanonlybectearedbywritinga1,Writinga0hasnoeffectIfenabled(SCMIE-1),SCMIFcausesaninlerruptrequesl.0NochangeinSCMbit1SCMbithaschainged.0SCMSelfClockModeStatusBitSC

11、M陽fleetsitiBcurrentclockingmode.Writ&shavenoeffeot.0MCUisoperatingnomalllywithOSCCLKavailable1MCUisoperatinghSelfClockModewithOSCCLKInanunknownstaleAllclocksarederivedfromPLLCLKrunningatitsminimumfrequency£鋪儲.一般在初始化MCU的時候用的較多的是LOCK位,該位反應了VCOCLK是否已經達到了我們所期望的在誤差允許范圍的頻率值,也就是說PLL模塊是否已經穩定,該位為1時才

12、能將總線的時鐘源選擇為PLL時鐘。對于時鐘選才I寄存器CLKSEL,編程時用的最多的是第7位(PLLSEL),該位用于確定系統的時鐘來源。為0:總線時鐘來源于外部晶振;為1;總線時鐘來源于PLL模塊。還有一個使用較多的寄存器是PLL控制寄存器(PLLCTL),常用的是寄存器的第6位,用于設置PLL是否打開。對于入門者而言,了解這么多已經基本能滿足單片機初始化編程的需要了呵呵。講這么多了,都知道說的再多都沒有具體的例子實在,下面是SCI模塊中MCU初始化程序:/MCUInit.cXS128芯片初始化函數功能:/芯片初始化設置:通過設置CLKSEL寄存器,確定內部時鐘的時鐘源;通過PLL/編程,設

13、置PLLCLK;通過設置COPCTL,設置是否允許看門狗。/(1)外部晶振=9.8304MHZ,BusClock=19.6608MHZ/(2)禁止看門狗/參數:無/返回:無頭文件#includeMCUInit.h"/芯片初始化頭文件VoidMCUInit(void)/禁止總中斷DISABLE_INTERRUPTS;在PLL穩定前設置系統時鐘來源于OSCCLKCLKSEL&=0x7f;此時BUSClock=OSCCLK/2/禁止PLLPLLCTL&=0xbf;/PLLCTL.6(PLLON)設為0,關PLL根據需要的時鐘頻率設置SYNR和REFDV寄存器計算公式:PLL

14、CLK=2*OSCCLK*(SYNR+1)/(REFDV+1)SYNR=0x01;REFDV=0x00;/打開PLLPLLCTL|=(1<<6);/等待PLL模塊達到穩定狀態,然后將系統的時鐘源設為PLL模塊While(!(CRGFLG&(1<<7);CLKSEL|=(1<<7);關閉看門狗COPCTL=0x00;好了,至此我想聰明的你已經基本掌握了與MCU初始化相關的內容了吧,下面我們正式開始SCI模塊的介紹吧。串口通信是單片機與外部通信的一種重要方式,9s12XS128單片機內置2個串彳T口SCI0和SCI1,分別是PS0(RXD0),PS1(T

15、XD0),PS2(RXD1),PS3(TXD1)。關于串口通信方面的一些基礎知識就不多做介紹,這里主要就編程方面的相關應用展開。首先介紹相關的寄存器1、波特率寄存器Table1d=2.SCiBDHandSCIBDLFieldDescriptionsHoldDescription7IRENInfraredEnableBit-Thisbitenablas'disablesthsinfranadmoduOation/demodulationsubmodule.0IRdbaUed1IRenabledTNP1:0TransmitterNarrowPuIkqBits=Theseanablewhet

16、hertheSCItransmitsa1/16,3/16,1/32or1!4narrowpulseSeeTable14-3.4:07:0SeR12:QSCIBaudRateBitsThebaudratefortheSCI由detenrinedbythebitsinthisregisterThebaudrateiscalculaTedtwodifferentwaysdapandingnnthestateofitisIRENbit.Thefernxjlasfor«lcuistirig(hebaudrateare.WhenIREN=Dthen,SCIbaudrate=SCIbusclock

17、5BR12,0)WhenREN=1than,SCIbaudrate=SCIbusdock132xSBR12:1)Note:Thebaudgansrator-isdisabledafterresetandnotstart0duntilthaTEbitorthsREbitissatforthaFirsitime.ThebaudralegeneralorIsdisabledwhen(S0R12.D-0andIREN=0)or(SBR12:1)=0andIREN=i).Note:WritingtoSCiBDHhasnoEffectwithoutwritingtoSCIBDL.becauBewritin

18、gtoSCiBDHpintsthedat日inatemporarylocationuntilSCIBDLisrittsnto.9S12XS128的波特率寄存器由SCIBDH和SCIBDL兩部分組成,其中波特率的值由SC舊DH得第五位和SCIBDL的8位組成的13位的SBR來確定,當SCIBDH.7(IREN)為0時,波特率的計算公式為波特率=總線頻率/(16*SBR12:0)一般總線頻率是已知的,所以可以根據想要得到的波特率來計算出SBR的值。例如:當總線時鐘為19.6608時,要想波特率為9600,則SBR=19660800/(16*9600)=128,化為二進制為10000000,所以SC

19、IBDH=0x00,SCIBDL=0x80。這里要注意編程時要先寫入SCIBDL的值,然后才能寫SCIBDH。2、SCI控制寄存器1765*321QLOOPSSCISWAIRSRCMWAKEILTPEPT00000000Figure14-5.SCIControlReglfitar1(SCICR1)SCICR1主要用于設置是否選擇循環模式,是否允許SCI,字符長度選擇,喚醒方式選擇,奇偶校驗相關設置。一般在編程日配置成0x00,即設置允許SCI,正常碼輸出,8位數據,無校驗。3、SCI控制寄存器276543210T匠TCIERIEILIETERERWUSBK00000000Figure14-9.

20、SCIControlRegister2(SCICR2)SCICR2主要用于設置是否使能相關中斷請求以及是否使能接收和發送,復位時所有的位都為0,即禁止所有中斷,連接收(SCICR2.2)和發送(SCICR2.3)本身也是禁止的,所以在SCI初始化時一般向SCICR2寫入0x0C,即禁止中斷,只使能發送和接收。4、SCI狀態寄存器(SCISR1)75432i0TORETCRDRFIDLEORNFFEPF110D0aD0UnimplemeniedorReservsdFigure14*10,SCIStatusRegister1(SCISR1)對于SCI狀態寄存器,我們使用最多的是第7位和第5位,分別

21、是發送數據寄存器空標志位和接收數據滿標志位,用于判斷數據是否可以發送下一幀的數據和是否已接收到數據。TDRE=1,說明數據已經移至移位寄存器中,可以向數據寄存器中寫入新的數據;RDRF=1,說明可以接收數據了。如果你還想對其他位的作具體的了解,那就去看原版的手冊吧呵呵。OOOO5、數據寄存器(SCIDRH,SCIDRL)Table14-13.SCIDRHandSCIDRLFieldDescriptionsFWdDescriptionSCIDRH7RSReceivedBit8R8&theninthbtreceivedwrenIheSCI唇configured七9*ttdataformat

22、(M=i).SCIDRHT8TransmitBit8-T6istheninthcazabittransmittedwhentt用SCIisconfigdredfor9-bitdataformat三1).SCIDRL7:0印劃TR:01R7:R0Receivedbt&seventhroughzerofor9»bitor樂占:daisformatsT7;T0-bitstevftnthroughzerofor9*bhor6-DIformats從表中不難看出哈,對于SCIDRH,只有最高的兩位是有意義的,分別用于9位數據格式傳數下(M=1)的最高位數據的發送和接收(但是一般情況下我們

23、并不使用這個寄存器)。SCIDRL用于8位數據的發送和接收。好了,花了這么多的篇幅無非是結合手冊簡單的介紹了幾個與編程相關的寄存器,下面我們來看看SCI模塊應用的步驟吧:TheS(,"asosetsaHag.iheIransmitUatmnygisiterqmptyfljg丁DRE%e'tfrytimeittrsindatafrnmthebuffetSCIDRHL)tothetransmiucrshiftrctiisier.ThetransmitdriverroutinemayrzspnndluthisflagbywritinganotherbytetotheTtansmit

24、terbmfifer(SCIDRHSCIDRL),whiletheshiftregisterisstillshiftinguulthefirstbyte.TcinitiateanSCILrarLinissiun;1. ConfiguretheSCI:u) Seleclabaudrale.Writeihisvalueto(heSCIbaudregisiers(SCI0DHL)tobeginthebaudnitecncratcjr.RememberbaLthebauilrulegcntTHturisdisablrdwhenihcbaudniteiszmj.Writing田theSCIBDI1hds

25、noefituwithuutalsowritingtuSCIBDL.v) WritetoSCICRItoconfigurewordlength,parity,andotherconliguratidnbits(LOOPS,RSRJV.WAKEJLT,吒,PTj,w) Enablelhetransmilter,intemipls,receive,andwakeupdsrequired,byrilinglotheSCHCR2registerbiis(TIECIEIEJLIEERE.R.WL-,SBK).Apreamblectridlechantcterwill"曾beshiftedout

26、什fihctransmillrrshiftrcislrr.2. TransmitProcedureforeachbyte:a) PolltheTDREflagbyreadingtheSC1SRIorresponding)theTDREinierrupt.Keepinmindthatthe丁DREbiireliftstoone.b) IftheTDREflagisset,writethedatatobetransmittedtoSCIDRHL,wheretheninthhitiswritlentutheTBbitinSCIDFt.IIifthrSCIisin9-bitdalaIbrmaLAnew

27、transmissiunwillnulresuhuntiltheTDREflaghasbeencleared.3. Repealstep2foreachsubsequentiransmissicn.上面的英文很簡單,這里故意作此安排,目的是讓大家知道,手冊上的有些東西還是能看懂的,有的時候要慢慢地試著去習慣原版的內容。下面給出例子程序/SCl.c串口通信功能:將串口接收到的數據發送出去/函數:SCIInit,SCISend1,SCISendN,SCIRev1,SCIRevN/SCIInit:SCI模塊初始化功能:開SCI0,關SCI1;8位數據幀格式;正常碼輸出;波特率為9600;使能首發;/查詢方式收發/VoidSCIInit(Void)(SCI0BDL=0x80;設置波特率為9600,其中總線時鐘為19.6606MHZSCI0BDH=0x00;SCI0CR1=0x00;/允許SCI,設置8位數據格式,無奇偶校驗SCI0CR2=0x0C;t=SCI0DRL;讀SCI0數據寄存器(清0)t=SCI0SR1;讀SCI0狀態寄存器(清0)/SCISend1發送一字節的數據功能:串行發送一字節/參數:A:要發送的數據返回:無/VoidSCISend1(ucharA)(if(SCI0SR1&(1<<7)!=0)(SCI0DRL=A;Break;/

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論