新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 牛人業(yè)話 > USB學(xué)習(xí)二:讀取ID值

        USB學(xué)習(xí)二:讀取ID值

        作者: 時(shí)間:2015-01-26 來源:網(wǎng)絡(luò) 收藏

          題記:熟悉了PDID12的硬件電路后,就應(yīng)該進(jìn)入的軟件編程部分了。我想大家在初學(xué)時(shí)都會(huì)遇到和我一樣的困惑:拿起USB協(xié)議的相關(guān)文檔埋頭苦看,看半天還是什么又枚舉又配置的看是看了,可是回頭來好像什么都不懂;理論不行咱就動(dòng)手吧,可是一找參考程序,可苦了咱,一上來就是一大堆的共同體,誰記得了啊,看了這個(gè)就忘了那個(gè),到頭來和看書好像一個(gè)效果。貌似很復(fù)雜很龐大的USB驅(qū)動(dòng),呵呵,我們不能一次性消化你,我就肢解了你再消化!那么第一個(gè)軟件程序就來個(gè)最簡單的(圈圈都給我們寫好了程序了,還愁什么),對,就讀取D12的ID值。

        本文引用地址:http://www.104case.com/article/268629.htm

          先了解下什么是ID(特權(quán)同學(xué)也是現(xiàn)學(xué)現(xiàn)賣,不好意思了):

          

        點(diǎn)擊看大圖

         

          我也不是弄得特別懂,反正最后讀出來的ID=0x1012那就對了。

          還得做個(gè)說明,我用的不是圈圈的USB板子,外圍電路搭的也不一樣,而是如筆記一里把D12做外部RAM擴(kuò)展用了。另外,由于手頭串口線恩多就是沒有一條合適的,所以通過串口精靈顯示的部分就簡單的改由1602LCD顯示ID值了。但是基本的思路都是相通的,要的就是這個(gè)!

          貼個(gè)主程序:

          ///////////////////////////////////////////////

          //函數(shù):main

          //說明:主程序

          //入口:無

          //返回:無

          ///////////////////////////////////////////////

          void main(void)

          {

          init_lcd1602(); //初始化lcd1602

          while(1)

          {

          display_id(read_d12_id()); //讀取并顯示ID值

          }

          }

          主程序一貼就知道這個(gè)實(shí)驗(yàn)會(huì)是超級簡單(入門嘛呵呵)。重點(diǎn)是來看USB的讀寫指令數(shù)據(jù)部分的驅(qū)動(dòng)程序。

          先看宏定義:

          /*D12寄存器的地址分配*/

          /*xdata ----> 可尋址片外ram (64k地址范圍:0000H-FFFFH)*/

          #define D12_DATA 0xEFF0 //偶數(shù)是數(shù)據(jù)地址

          #define D12_COMMAND 0xEFF1 //奇數(shù)是命令地址

          上面為什么如此定義呢,因?yàn)楣P記一里提到過,D12是被做外部RAM擴(kuò)展了,P0口接的是D12的8bit數(shù)據(jù)端口,而CS_N被接到了P2.4口,所以尋址時(shí)CS_N一定必須為低,也即P2=EF,P2和P1就構(gòu)成了外部RAM的地址。

          ///////////////////////////////////////////////

          //函數(shù):write_d12

          //說明:把數(shù)據(jù)或者命令送入D12

          //入口:uint addr:送入D12的地址 D12_DATA或者D12_COMMAND

          // uchar dat:送入D12的數(shù)據(jù)或者指令

          //返回:無

          ///////////////////////////////////////////////

          void write_d12(uint addr, uchar dat)

          {

          *((uchar xdata *) addr) = dat;

          //addr就是外部RAM的地址,把dat賦給這個(gè)地址即可

          }

          ///////////////////////////////////////////////

          //函數(shù):read_d12

          //說明:從D12讀出數(shù)據(jù)

          //入口:uint addr:送入D12的地址

          //返回:uchar *addr:返回一字節(jié)數(shù)據(jù)

          ///////////////////////////////////////////////

          uchar read_d12(uint addr)

          {

          return *((uchar xdata *) addr);

          //返回addr這個(gè)外部RAM上的數(shù)據(jù),addr只能是D12_DATA

          }

          再來看讀取ID這個(gè)程序是如何實(shí)現(xiàn)的:

          ///////////////////////////////////////////////

          //函數(shù):read_d12_id

          //說明:從D12讀出其ID

          //入口:無

          //返回:uint id:USB的ID值

          ///////////////////////////////////////////////

          uint read_d12_id(void)

          {

          uchar idtem1=0,idtem2=0;

          uint id="0";

          write_d12(D12_COMMAND,0xfd); //發(fā)送讀取ID的指令

          idtem1 = read_d12(D12_DATA); //讀第一個(gè)字節(jié)

          idtem2 = read_d12(D12_DATA); //讀第二個(gè)字節(jié)

          id = idtem1+(idtem2*256); //把連個(gè)字節(jié)賦給一個(gè)uint型變量

          return id; //返回讀出的ID值

          }

          顯示效果:

          

        點(diǎn)擊看大圖

         

          挺簡單的程序,但是在這個(gè)程序中,可以明白單片機(jī)是如何往D12寫指令,然后緊跟著再讀或者寫數(shù)據(jù)。在這個(gè)基礎(chǔ)上,要實(shí)現(xiàn)一個(gè)完整的USB通訊,還要繼續(xù)在寫指令和讀寫數(shù)據(jù)上做文章,在對D12初始化后,重點(diǎn)是在于讀取D12中斷寄存器然后對其進(jìn)行相應(yīng)的操作。



        關(guān)鍵詞: USB PDIUSBD12

        評論


        相關(guān)推薦

        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 安宁市| 台江县| 鹤峰县| 丹巴县| 安阳县| 广丰县| 翼城县| 化州市| 靖远县| 临沂市| 石门县| 甘谷县| 子洲县| 霍林郭勒市| 郁南县| 固阳县| 阳泉市| 巴林左旗| 桃源县| 祁阳县| 安庆市| 抚顺县| 辽宁省| 巴青县| 河源市| 乌拉特中旗| 观塘区| 班戈县| 嘉善县| 宕昌县| 永定县| 兴仁县| 广饶县| 沐川县| 和龙市| 招远市| 佛冈县| 普宁市| 攀枝花市| 吴旗县| 温宿县|