ucos操作系統(tǒng)在ARM上的移植(共19頁)_第1頁
ucos操作系統(tǒng)在ARM上的移植(共19頁)_第2頁
ucos操作系統(tǒng)在ARM上的移植(共19頁)_第3頁
ucos操作系統(tǒng)在ARM上的移植(共19頁)_第4頁
ucos操作系統(tǒng)在ARM上的移植(共19頁)_第5頁
已閱讀5頁,還剩15頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、精選優(yōu)質(zhì)文檔-傾情為你奉上UC/OS-II嵌入式系統(tǒng)在ARM上的移植UC/OS-II操作系統(tǒng)是一款完全公開的源代碼,它非常精簡,整個操作系統(tǒng)的代碼只有幾千行,是專門針對于嵌入式開發(fā)而產(chǎn)生的一款代碼。它有幾個特點,分別是可移植性(Portable)、可固化(ROMable)、可裁剪(Scalable)、多任務(wù)、可確定性、任務(wù)棧、系統(tǒng)服務(wù)、中斷管理、穩(wěn)定性可靠性。UC/OS-II主要就是一個內(nèi)核,由ANSIC語言編寫而成。負責(zé)任務(wù)管理和任務(wù)調(diào)度,沒有文件系統(tǒng)和界面系統(tǒng)。它的代碼是公開的,系統(tǒng)的實時性強、移植性好、可多任務(wù)。UC/OS-II作為基于優(yōu)先級的搶占式多任務(wù)的實時操作系統(tǒng),包含了實時內(nèi)核、

2、任務(wù)管理、時間管理、任務(wù)間通信同步和內(nèi)存管理的功能。它使得任務(wù)的獨立性,不相互干涉,非常的準時和高效,且易于設(shè)計和擴展。UO/OS-II共有16個內(nèi)核文件,11個與CPU類型無關(guān),就是說可以直接使用不需要修改。還有3個內(nèi)核文件與CPU有關(guān)系,要根據(jù)需要作出相應(yīng)的改動。剩下的兩個內(nèi)核文件和具體的應(yīng)用有關(guān)。如圖所示UC/OS-II的16個內(nèi)核文件的層次。應(yīng)用程序 與處理器類型無關(guān)的內(nèi)核代碼OSCORE.C OS_FLAG.COS_MBOX.C OS_MEN.COS_MUTEX.C OS_Q.COS_SEM.C OS_TASK.CC/OS-II.COS_TIME.C C/OS-II.C 與應(yīng)用有關(guān)的

3、內(nèi)核配置文件OS_CFG.HINCLUDE.H與處理器類型有關(guān)的內(nèi)核代碼OS_CPU.H OS_CPU.ASM OS_CPU_C.CCPU定時器 軟件硬件C/OS-II內(nèi)核文件多任務(wù)操作的核心是系統(tǒng)調(diào)度器,利用TCB來管理任務(wù)調(diào)度功能。它的主要功能是保存任務(wù)的當前態(tài)、優(yōu)先級、等待事件、代碼起始地址、初始堆棧指針等。程序的設(shè)計關(guān)鍵就是確定劃分多任務(wù)的問題,以及任務(wù)優(yōu)先級和任務(wù)通信。優(yōu)先級的意思是每個任務(wù)都是無限循環(huán)的,有運行態(tài)度、就緒態(tài)、休眠態(tài)、掛起態(tài)和中斷五種狀態(tài)。當有高一級優(yōu)先級的任務(wù)就緒后,低優(yōu)先級立即停止運行,轉(zhuǎn)為掛起態(tài)或就緒態(tài)。這就是可剝奪型的內(nèi)核。當中斷一個高優(yōu)先級任務(wù),中斷時掛起,

4、中斷結(jié)束后任務(wù)繼續(xù)運行,并立即剝奪低優(yōu)先級的任務(wù)。對于這種可剝奪型內(nèi)核,CPU的使用時可以確定的,可優(yōu)化任務(wù)級響應(yīng)。在很多單片機或ARM板上很容易就可以移植UC/OS-II。當然本次設(shè)計使用的TQ2440,也可以完美的移植它。移植程序在網(wǎng)上都可以找得到,所以設(shè)計中就不做解釋了。本次設(shè)計實現(xiàn)的是串口協(xié)議和網(wǎng)口協(xié)議組合成的一個數(shù)據(jù)網(wǎng)關(guān)。其主要的流程圖如下所示:以太網(wǎng)現(xiàn)場數(shù)據(jù)網(wǎng)RJ45接口IP分組封幀RS232接口封幀解幀解幀開始系統(tǒng)初始化OSInit()OS_InitMisc()混合變量初始化OS_InitRdyList()就緒表初始化OS_InitTCBList()任務(wù)控制塊初始化OS_Init

5、EventList()事件控制塊初始化根據(jù)延時或消息調(diào)度運行OS_FlagInit()事件標志初始化OS_MemInit()內(nèi)存管理OS_SemInit()消息初始化OS_InitTaskIdle()創(chuàng)建空閑任務(wù)定時器初始化串行口初始化創(chuàng)建任務(wù)TASK_UipRec 以太網(wǎng)接收 優(yōu)先級:4TASK_UipTimeOut 定時任務(wù) 優(yōu)先級:3TASK_UipProcess:uip協(xié)議處理 優(yōu)先級: 2OSStart()啟動調(diào)度開始運行UART中斷DM9000外部中斷斷 如圖所示可以很清楚的看出內(nèi)核操作系統(tǒng)對于整個系統(tǒng)的控制過程,下面我們要介紹一下UC/OS-II里面的一些程序。用戶應(yīng)用程序任務(wù)定

6、義代碼如下:void MyTask( void *pdata) /開始定義用戶任務(wù) for(;) . void main()TargetInit(); /完成初始化目標開發(fā)板。OSInit (); /完成初始化UCOS-II。OSTimeSet(0); /完成初始化系統(tǒng)時基。OSTaskCreate (MainTask,(void *)0, &MainTaskStkMainTaskStkLengh - 1, MainTaskPrio); /開始創(chuàng)建系統(tǒng)初始任務(wù)。OSStart (); /整個任務(wù)開始。return 0;void Task0(void *pdata) /主任務(wù)建立:tak

7、s0 和 task1#if OS_CRITICAL_METHOD = 3/* 分配CPU狀態(tài)寄存器*/OS_CPU_SR cpu_sr;#endifOS_ENTER_CRITICAL();Timer0Init();/初始化報時信號ISRInit(); /初始化中斷優(yōu)先級 OS_EXIT_CRITICAL();OSPrintfInit();/用戶任務(wù)給串口 DM9000_init();OSStatInit(); while(1)OSPrintf("nEnter Main Taskn");/測試Dm9000/打印DM9000寄存器OSTimeDly(OS_TICKS_PER_S

8、EC);需要注意的是,C/OS-II的應(yīng)用程序要使用空閑任務(wù)OSTaskldle(),而它是不可刪除的系統(tǒng)文件。下面開始對應(yīng)用程序進行移植了。本次設(shè)計是在ARM開發(fā)板上實現(xiàn)串口、網(wǎng)口數(shù)據(jù)轉(zhuǎn)換的的功能。在TQ2440上有串口和網(wǎng)口。通信過程簡單的描述就是PC串口發(fā)送數(shù)據(jù)給ARM板,ARM接到串口數(shù)據(jù)后,從網(wǎng)口再傳給PC。相反也是同樣的道理,由網(wǎng)口發(fā)送數(shù)據(jù),有ARM控制由串口發(fā)回數(shù)據(jù)。首先是TCP/IP協(xié)議的移植。在編寫移植程序前,有必要解釋一下基本的協(xié)議棧作用和意義。就常見的網(wǎng)絡(luò)通信方式一般來說有兩種:1、UART-RS232,此時只需要pc上有串口調(diào)試助手即可。2、TCP/IP,這時候和普通p

9、c與pc通信一樣 可以用socket套接字編程也可用別人寫好的軟件偵聽。而現(xiàn)在我們要實現(xiàn)的是串口控制單片機與PC機的通信,在這里用PC來代替以太網(wǎng)。接下來還要介紹一下以太網(wǎng)接口。以太網(wǎng)技術(shù)如今已經(jīng)相當?shù)某墒炝耍湎鄳?yīng)的網(wǎng)絡(luò)產(chǎn)品價格低廉、技術(shù)完善。而數(shù)據(jù)總線如今越來越難以滿足人們?nèi)找嫣嵘男枰?,這時以太網(wǎng)控制網(wǎng)絡(luò)技術(shù)得到了快速的發(fā)展,并形成了現(xiàn)場總線的新標準。加上國內(nèi)大部分局域網(wǎng)是以太網(wǎng),給予以太網(wǎng)實現(xiàn)現(xiàn)場總線有了雄厚的物質(zhì)基礎(chǔ)。以太網(wǎng)的接口就是以太網(wǎng)同信的基礎(chǔ),是通信介質(zhì)通信的中間處理部件,實現(xiàn)報文的發(fā)送與接收功能,位于TCP/IP協(xié)議棧的數(shù)據(jù)鏈路層。每一個以太網(wǎng)接口(有時候也叫網(wǎng)卡),在連通

10、后就可以隨時的發(fā)送和接收網(wǎng)絡(luò)上的數(shù)據(jù),執(zhí)行EEE802.3標準。TCP/IP對應(yīng)的ISO結(jié)構(gòu)如圖所示:應(yīng)用層數(shù)據(jù)鏈路層會話層傳輸層網(wǎng)絡(luò)層應(yīng)用層物理層網(wǎng)絡(luò)接口層 傳輸層 網(wǎng)絡(luò)層表示層 TCP/IP協(xié)議棧而單片機與計算機的TCP/IP協(xié)議的實現(xiàn)也有很大的不同,原本在計算機里編寫的程序可以不考慮代碼的大小和效率,但在嵌入式開發(fā)板上都要考慮到這些問題。在操作系統(tǒng)、內(nèi)存分配、指針、參數(shù)傳遞、協(xié)議支持以及硬件接口的設(shè)計方面有些不同。首先就是操系統(tǒng),嵌入式的特點之一就是簡潔高效,有很強的專業(yè)功能。相對而言計算機上的操作系統(tǒng)的側(cè)重點就是兼容性,所以資源要求全面支持,所以很復(fù)雜。其次就是內(nèi)存上的分配,計算機像w

11、indows系統(tǒng)它的內(nèi)存分配是動態(tài)的,而在單片機上卻不能同樣如此,應(yīng)為RAM的容量所限,所以其中存放以太網(wǎng)的數(shù)據(jù)包是固態(tài)的。由于ARM相對于單片機的能力而言有了很大的提升,所以可以突破單片機的一些約束。如下圖所示,TCP/IP協(xié)議棧中的內(nèi)容,從上往下分別對應(yīng)應(yīng)用層、傳輸層、網(wǎng)絡(luò)層和網(wǎng)絡(luò)接口層。用戶進程用戶進程用戶進程TCPUDPICMPIPARP硬件接口 TCP/IP協(xié)議棧在本次設(shè)計中采用Lwip協(xié)議棧來實現(xiàn)ARM與以太網(wǎng)的連接。完成移植后,需要介紹一下以太網(wǎng)的初始化過程和數(shù)據(jù)收發(fā)過程。LWIP的初始化要在UC/OS-II之后,在其它任務(wù)創(chuàng)建之前。因為LWIP要對以太網(wǎng)協(xié)議棧初始化以及新線程的

12、建立,LWIP初始化如圖所示。LwIP_Init()Sys_mbox_new()Low_level _Init()Tcpip_Init()EMACInit()Low_level_output()netif->linkoutputlwip_init()Ethernetif_Init()netif->outputSys_thread_new () 以太網(wǎng)初始化流程(1)(3)(4)(8)(2)(7)(9)(5)(6)(10)(11)etharp_output ()netif->inputtcpip_input ()(12)(13)(14)指向指向指向LWIP程序可以實現(xiàn)很多功能,

13、在本設(shè)計中沒有實現(xiàn)他的全部功能。而簡單的PING通需要DM9000來實現(xiàn)。以太網(wǎng)的接收是通過中斷方式,如果有數(shù)據(jù)進入以太網(wǎng)中斷函數(shù)。其主要任務(wù)就是讀取和分析數(shù)據(jù)包。如果數(shù)據(jù)有效則在Tcpip_input()函數(shù)把數(shù)據(jù)發(fā)送出去,并在LWIP初始化創(chuàng)建的線程中就可以得到此消息。然后通過ip_input()函數(shù)進入傳輸層后,再把把數(shù)據(jù)傳到應(yīng)用層。具體流程如下圖所示:Mbox方式傳遞數(shù)據(jù),tcpip_thread()消息識別分類通過網(wǎng)絡(luò)接口函數(shù)netif->output直接指向netconn_write ()tcp_write ()tcp_enqueuet()tcp_output ()應(yīng)用層TC

14、PIP_APIMSG ()tcpip_apimsg()do_write ()以太網(wǎng)數(shù)據(jù)發(fā)送流程etharp_output ()etharp_send_ip ()ETH_TxPkt_ChainMode ()low_level_output ()ip_output ()ip_output_if ()通過網(wǎng)絡(luò)接口函數(shù)netif->linkoutput直接指向ETH_IRQHandlert()Ethernetif_input()以太網(wǎng)數(shù)據(jù)接收流程Tcpip_input()Low_level_input()ethernet_input()EMACReadPacket ()GetInputPacke

15、tLen()tcp_input ()tcp_process ()ip_input ()update_arp_entry ()etharp_ip_input ()tcp_receive ()TCP_EVENT_RECV ()recv_tcp ()netconn_recv ()應(yīng)用層Mbox方式傳遞數(shù)據(jù),在tcpip_thread()中消息識別分類Recv_mbox方式進行數(shù)據(jù)傳遞通過網(wǎng)絡(luò)接口函數(shù)netif->intput直接指向?qū)P?專注-專業(yè)為什么要選擇DM9000網(wǎng)絡(luò)驅(qū)動器呢?如今嵌入式中大量使用10/100M的以太網(wǎng)卡,實際上并不實用。因為它不能既滿足快速傳輸速率又滿足成本控制。這時

16、,DM9000作為一種綜合低成本的單一快速以太網(wǎng)控制芯片就有了很高的實用價值。它具有通用的接口,設(shè)計簡單,可滿足不同系統(tǒng)的軟件驅(qū)動。DM9000程序的體系結(jié)構(gòu)可以分為網(wǎng)絡(luò)協(xié)議接口、設(shè)備接口層、功能層及媒介層。下面是DM9000的部分驅(qū)動程序的編寫。定義DM9000:#include "config.h"#define DM_ADD (*(volatile unsigned short *) 0x)#define DM_CMD (*(volatile unsigned short *) 0x)#define Printf OSPrintfuint8 Buffer1000;/定

17、義了一個1000字節(jié)的接收發(fā)送緩沖區(qū)uint8 host_mac_addr6= 0xff, 0xff, 0xff, 0xff, 0xff, 0xff ; /主機的MAC地址uint8 mac_addr6 = 0x0a, 0x1b, 0x2c, 0x3d, 0x4e, 0x5f ; /開發(fā)板 0a,1b,2c,3d,4e,5f ,這實際上是一個軟地址,在本設(shè)計中不需要特指。uint8 ip_addr4 = 192, 168, 1, 6;uint8 host_ip_addr4 = 192, 168, 1, 100 ;uint16 packet_len;/接收、發(fā)送數(shù)據(jù)包的長度,單位為字節(jié)uint8

18、 arpsendbuf60=0xff,0xff,0xff,0xff,0xff,0xff,/以太網(wǎng)目標地址0x0a,0x1b,0x2c,0x3d,0x4e,0x5f,/以太網(wǎng)源地址0x08,0x06,/幀類型:ARP幀0x00,0x01,/硬件類型:以太網(wǎng)0x08,0x00,/協(xié)議類型:IP協(xié)議0x06,/硬件地址長度:6字節(jié)0x04,/協(xié)議地址長度:4字節(jié)0x00,0x00,/操作: ARP請求0x0a,0x1b,0x2c,0x3d,0x4e,0x5f,/發(fā)送端硬件地址192, 168, 1, 6, /發(fā)送端協(xié)議地址0x00,0x00,0x00,0x00,0x00,0x00,/接收端硬件地址1

19、92, 168, 1, 100/接收端協(xié)議地址;#define DM9KS_ID0x90000A46#define DM9KS_VID_L0x28#define DM9KS_VID_H0x29#define DM9KS_PID_L0x2A#define DM9KS_PID_H0x2B#define DM9KS_BASE_ADDR_ETH00x/nGCS4#define DM9KS_Index(*(volatile unsigned short *)(DM9KS_BASE_ADDR_ETH0 + 0x300)#define DM9KS_Data(*(volatile unsigned short

20、 *)(DM9KS_BASE_ADDR_ETH0 + 0x304)接下是來對DM9000進行初始化的程序部分:void DM9000_init(void)uint32 i;/Test_DM9000AE();IOSetInit(); /設(shè)置中斷EINIT7/初始化設(shè)置步驟: 1dm9000_reg_write(DM9000_GPCR, 0x01);/設(shè)置GPCR(1EH) bit0=1,使DM9000的GPIO3為輸出。dm9000_reg_write(DM9000_GPR, 0x00);/GPR bit0=0 使DM9000的GPIO3輸出為低以激活內(nèi)部PHY。udelay(5000);/延時

21、2ms以上等待PHY上電。/初始化設(shè)置步驟: 2dm9000_reg_write(DM9000_NCR, 0x03);/軟件復(fù)位udelay(3000);/延時20us以上等待軟件復(fù)位完成dm9000_reg_write(DM9000_NCR, 0x00);/復(fù)位完成,設(shè)置正常工作模式。dm9000_reg_write(DM9000_NCR, 0x03);/第二次軟件復(fù)位,為了確保軟件復(fù)位完全成功。此步驟是必要的。udelay(3000);dm9000_reg_write(DM9000_NCR, 0x00); /以上完成了DM9000的復(fù)位操作/初始化設(shè)置步驟: 3dm9000_reg_wri

22、te(DM9000_NSR, 0x2c);/清除各種狀態(tài)標志位dm9000_reg_write(DM9000_ISR, 0xbf);/清除所有中斷標志位/以上清除標志位/初始化設(shè)置步驟: 4 dm9000_reg_write(DM9000_RCR, 0x39);/接收控制 dm9000_reg_write(DM9000_TCR, 0x00);/發(fā)送控制 dm9000_reg_write(DM9000_BPTR, 0x3f); dm9000_reg_write(DM9000_FCTR, 0x38);/接收FIFO門限3k 8k dm9000_reg_write(DM9000_FCR, 0xff)

23、; dm9000_reg_write(DM9000_SMCR, 0x00); /以上是功能控制 /初始化設(shè)置步驟: 5for(i=0; i<6; i+)dm9000_reg_write(DM9000_PAR + i, mac_addri);/mac_addr自己定義一下吧,6個字節(jié)的MAC地址/以上存儲MAC地址(網(wǎng)卡物理地址)到芯片中去,這里沒有用EEPROM,所以需要自己寫進去/初始化設(shè)置步驟: 6dm9000_reg_write(DM9000_NSR, 0x2c);/清除各種狀態(tài)標志位dm9000_reg_write(DM9000_ISR, 0x3f);/清除所有中斷標志位/初始化

24、設(shè)置步驟: 7dm9000_reg_write(DM9000_IMR, 0x81);/中斷使能/中斷使能(或者說中斷屏蔽),即開啟我們想要的中斷,關(guān)閉不想要的,這里只開啟的一個接收中斷udelay(10000);/延時2ms以上等待PHY上電。 /PrintfDM9000Reg();Printf("DM9000初始化完畢rn");接下來是數(shù)據(jù)包的接收和發(fā)送流程圖和程序:DM9000收到封包,置于接收內(nèi)存的0C00h-3FFFh。若超過最大值時,會自動把位置移到0C0h0位置。每個封包有4字節(jié)是存放一些與封包相關(guān)的信息。若內(nèi)存的第1字節(jié)值為“01h”,表明封包已經(jīng)在內(nèi)存中了。

25、在讀取其它字節(jié)前,先要確定第2個字節(jié),則是這個封包的相關(guān)信息。如下圖是DM9000接收封包流程:開始初始化MRCMDX=0x01?讀前4個字節(jié)封包正確時ARP或IP包?剩下的數(shù)據(jù)返回1無新包接收錯誤返回0NNNYYY DM9000接收封包流程如圖可以看出,DM9000從網(wǎng)絡(luò)中接到一個數(shù)據(jù)包后,在數(shù)據(jù)包前面加了4個字節(jié),分別為“01H”、“status”、“LENL”(包長的低8位)、“LENH”(包長的高8位)。這4個字節(jié)來確定數(shù)據(jù)包的狀態(tài),“01H”表示接下來的是有效數(shù)據(jù)包,“00H”則表示沒有數(shù)據(jù)包,其它值則表示沒有正確初始化,并重新初始化。若數(shù)據(jù)包長度小于60字節(jié),則DM9000芯片會自

26、動為不足的字節(jié)補上0。同時,在接收到的包后程序還會自動添加4個CRC校驗字節(jié)。于是,接收到的數(shù)據(jù)包至少為64字節(jié)。也根據(jù)TCP/IP協(xié)議從首部字節(jié)中找出有效字節(jié)數(shù),這就是TCP/IP協(xié)議棧的功能了。具體程序如下:/接受數(shù)據(jù)包/參數(shù):datas為接收到是數(shù)據(jù)存儲位置(以字節(jié)為單位)/返回值:接收成功返回數(shù)據(jù)包類型,不成功返回0uint32 receivepacket(uint8 *datas)uint16 i,tmp,status,len;uint8 ready;uint32 st;ready = 0;/希望讀取到"01H"status = 0;/數(shù)據(jù)包狀態(tài)len = 0;

27、/數(shù)據(jù)包長度 if(dm9000_reg_read(DM9000_ISR) & 0x01) dm9000_reg_write(DM9000_ISR, 0x01);/清除接收中斷標志位 ready = dm9000_reg_read16(DM9000_MRCMDX); / 第一次讀取,一般讀取到的是 00HPrintf("ready1 = %xrn",ready); if(ready & 0x0ff) != 0x01) ready = dm9000_reg_read16(DM9000_MRCMDX); / 第二次讀取,總能獲取到數(shù)據(jù) Printf("

28、ready2 = %xrn",ready); if(ready & 0x01) != 0x01) if(ready & 0x01) != 0x00) /若第二次讀取到的不是01H或00H ,則表示沒有初始化成功 dm9000_reg_write(DM9000_IMR, 0x80);/屏蔽網(wǎng)卡中斷 DM9000_init(); /重新初始化 dm9000_reg_write(DM9000_IMR, 0x81);/打開網(wǎng)卡中斷 return 0; / status = dm9000_reg_read16(DM9000_MRCMD); DM_ADD = DM9000_MRC

29、MD; st = DM_CMD; status = st; len = 64;/ DM_CMD; Printf("st=%x status=%x len= %xrn",st,status,len); if( (len < 1522)/!(status & 0xbf) && for(i=0; i<len; i+=2)/ 16 bit mode udelay(20); tmp = DM_CMD; datasi = tmp & 0x0ff; datasi + 1 = (tmp >> 8) & 0x0ff; elser

30、eturn 0;if(len > 1000) return 0;/ if( (HON( ETHBUF->type ) != ETHTYPE_ARP) && (HON( ETHBUF->type ) != ETHTYPE_IP) )/return 0; packet_len = len;return len;在發(fā)送封包之前,需要將其中的數(shù)據(jù)存放在DM9000傳送內(nèi)存0000h0BFFh。當超過0BFFh時,位置自動回到0000h的位置。封包的數(shù)據(jù)存放在MWCND中,芯片會吧數(shù)據(jù)自動的存入傳送內(nèi)存的。其封包的大小存放在低字節(jié)的TXPLL和高字節(jié)的TXPLH中。然后

31、把TCR bit()設(shè)置成1,開始傳送封包。完成后,將是否完成的信息存入TSRI、TSRII中。其順序為TSRI->TERII->TSRI循環(huán)。故需按照NSR bit-3來判斷完成進度。以下是發(fā)送數(shù)據(jù)包的流程圖和程序:開始初始化包長不小于60字節(jié)?設(shè)置源端物理地址將數(shù)據(jù)依次寫入MWCMD寄存器將封包長度寫入TXPLL和TXPLH中啟動發(fā)送等待發(fā)送結(jié)束發(fā)送成功?返回設(shè)定長度為60字節(jié)查錯重發(fā)NYN最多發(fā)重發(fā)5次 DM9000發(fā)送封包流程以上是發(fā)送數(shù)據(jù)包,過程很簡單。/發(fā)送數(shù)據(jù)包/參數(shù):datas為要發(fā)送的數(shù)據(jù)緩沖區(qū)(以字節(jié)為單位),length為要發(fā)送的數(shù)據(jù)長度(兩個字節(jié))。void

32、 DM9000_sendPcket(uint8 *datas, uint32 length)uint32 len,i;uint8 tmp;Printf("發(fā)送數(shù)據(jù)rn");dm9000_reg_write(DM9000_IMR,0x80);/先禁止網(wǎng)卡中斷,防止在發(fā)送數(shù)據(jù)時被中斷干擾len = length;/把發(fā)送長度寫入/*這兩句是將要發(fā)送數(shù)據(jù)的長度告訴DM9000的寄存器*/ dm9000_reg_write(DM9000_TXPLH, (len>>8) & 0x0ff); dm9000_reg_write(DM9000_TXPLL, len &a

33、mp; 0x0ff); DM_ADD = DM9000_MWCMD;/將要發(fā)送的數(shù)據(jù)寫到DM9000的內(nèi)部SRAM中的寫FIFO中 for(i=0; i<len; i+=2)/16 bit mode udelay(2); DM_CMD = datasi | (datasi+1<<8); dm9000_reg_write(DM9000_TCR, 0x01);/發(fā)送數(shù)據(jù)到以太網(wǎng)上 while(1)/等待數(shù)據(jù)發(fā)送完成 uint8 data; data = dm9000_reg_read(DM9000_TCR);/DM9000_NSR if(data&0x01) = 0x00

34、) break; tmp = dm9000_reg_read(DM9000_NSR); if(tmp & 0x01) = 0x04) if(dm9000_reg_read(DM9000_TSR1)&0xfc) = 0x00) Printf("TSR1成功rn"); else Printf("TSR1失敗rn"); else if(dm9000_reg_read(DM9000_TSR2)&0xfc) = 0x00) Printf("TSR2成功rn"); else Printf("TSR2失敗rn&qu

35、ot;); dm9000_reg_write(DM9000_NSR, 0x2c);/清除狀態(tài)寄存器,由于發(fā)送數(shù)據(jù)沒有設(shè)置中斷,因此不必處理中斷標志位 dm9000_reg_write(DM9000_IMR, 0x81);/DM9000網(wǎng)卡的接收中斷使能Printf("發(fā)送數(shù)據(jù)完成rn");TQ2440串口初始化程序:static int whichUart=0;void Uart_Init(int pclk,int baud) int i; if(pclk = 0) pclk = PCLK; rUFCON0 = 0x0; /UART channel 0 FIFO control register, FIFO disable rUFCON

溫馨提示

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

評論

0/150

提交評論