基于DM9000A的網(wǎng)絡(luò)接口設(shè)計(jì)
單片機(jī)數(shù)據(jù)發(fā)送的具體程序如下所示:
3.3 數(shù)據(jù)接收
可以采用中斷的方式來(lái)完成對(duì)數(shù)據(jù)的接收。當(dāng)DM9000A接收到數(shù)據(jù)并通過(guò)CRC校驗(yàn)后,將產(chǎn)生一個(gè)接收中斷信號(hào),單片機(jī)在中斷發(fā)生時(shí)可以將整個(gè)數(shù)據(jù)包讀出,并按照使用的網(wǎng)絡(luò)協(xié)議來(lái)處理數(shù)據(jù)。DM9000A內(nèi)存的0C00h~3FFFh是數(shù)據(jù)接收緩沖區(qū)。芯片在接收到數(shù)據(jù)包后,會(huì)在數(shù)據(jù)包的前面自動(dòng)加上4個(gè)字節(jié)的數(shù)據(jù),接收數(shù)據(jù)包時(shí)首先要讀取這4個(gè)字節(jié)來(lái)確定數(shù)據(jù)包的狀態(tài),第一個(gè)字節(jié)“01H”表示接下來(lái)的是有效數(shù)據(jù)包,且數(shù)據(jù)保存在接收緩沖區(qū)中;若為“00H”則表示沒有數(shù)據(jù)包,中斷程序可以直接返回;若為其他值則表示出現(xiàn)異常,需要重新初始化芯片。第2個(gè)字節(jié)則為這個(gè)數(shù)據(jù)包的相關(guān)信息,其格式與RSR寄存器的含義一致,可以用來(lái)判斷本數(shù)據(jù)包是否出現(xiàn)異常和出現(xiàn)了什么異常。第3和4個(gè)字節(jié)是存放這個(gè)封包的長(zhǎng)度大小(不包括前4個(gè)字節(jié)),在讀取數(shù)據(jù)包時(shí)需要用這個(gè)長(zhǎng)度來(lái)進(jìn)行接收控制。
同數(shù)據(jù)發(fā)送類似,單片機(jī)從DM9000A中讀取數(shù)據(jù)也只需要讀取MRCMD寄存器中的值即可,讀取一個(gè)字節(jié)數(shù)據(jù)后,芯片自動(dòng)將下一個(gè)字節(jié)數(shù)據(jù)移到這個(gè)寄存器中。數(shù)據(jù)包的接收過(guò)程分2步:先讀取MRCMDX寄存器,判斷是否存在正確的數(shù)據(jù)包;如有數(shù)據(jù)包,根據(jù)數(shù)據(jù)包的長(zhǎng)度信息依次讀取讀MRCMD寄存器,將整個(gè)數(shù)據(jù)包讀取出來(lái)。其中第1步需要讀取兩次MRCMDX寄存器,因?yàn)榈?次讀到的值總為0。單片機(jī)數(shù)據(jù)接收程序如下:
評(píng)論