在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<abbr id="27omo"></abbr>

<menu id="27omo"><dl id="27omo"></dl></menu>
    • <label id="27omo"><tt id="27omo"></tt></label>

      新聞中心

      EEPW首頁(yè) > 手機(jī)與無(wú)線通信 > 牛人業(yè)話 > USB筆記三:PDIUSBD12基本指令程序

      USB筆記三:PDIUSBD12基本指令程序

      作者: 時(shí)間:2015-02-03 來(lái)源:網(wǎng)絡(luò) 收藏

        經(jīng)過(guò)特權(quán)的整理,以圈圈的程序代碼為基礎(chǔ),結(jié)合周立功的《PDID12固件編程與驅(qū)動(dòng)開發(fā)》一書,把D12的最底層的代碼子程序做了較詳細(xì)的注釋和整理,PDID12的硬件提取層應(yīng)該說(shuō)才是真正意思上的最底層,其次是命令層,這應(yīng)該是編程入門的突破口,再有其它的操作無(wú)非都是基于這些基本的子程序進(jìn)行的。以下的代碼應(yīng)該結(jié)合這個(gè)文檔進(jìn)行理解,請(qǐng)參考附件http://share.eepw.com.cn/share/download/id/234488。(這個(gè)文檔應(yīng)該是周立功書上摘抄的)

      本文引用地址:http://www.biyoush.com/article/269394.htm


        #define USB_COMMAND_ADD 1

        //USB_A0=USB_COMMAND_ADD:總線命令操作

        #define USB_DATA_ADD 0

        //USB_A0=USB_DATA_ADD:總線數(shù)據(jù)操作

        /*********************PDIUSBD12硬件提取層********************/

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

        //函數(shù):write_usb_command

        //說(shuō)明:寫USB命令

        //入口:uchar usb_command:待寫入的命令

        //返回:無(wú)

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

        void write_usb_command(uchar usb_command)

        {

        USB_A0=USB_COMMAND_ADD; //命令操作

        USB_DATA=usb_command;

        USB_WR=0;

        USB_WR=1;

        USB_DATA=0xFF;

        }

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

        //函數(shù):write_a_usb_data

        //說(shuō)明:寫一字節(jié)USB數(shù)據(jù)

        //入口:uchar usb_data:待寫入的數(shù)據(jù)

        //返回:無(wú)

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

        void write_a_usb_data(uchar usb_data)

        {

        USB_A0=USB_DATA_ADD; //數(shù)據(jù)操作

        USB_DATA=usb_data;

        USB_WR=0;

        USB_WR=1;

        USB_DATA=0XFF;

        }

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

        //函數(shù):read_a_usb_data

        //說(shuō)明:讀一字節(jié)USB數(shù)據(jù)

        //入口:無(wú)

        //返回:uchar temp:從D12讀出的數(shù)據(jù)

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

        uchar read_a_usb_data(void)

        {

        uchar temp;

        USB_A0=USB_DATA_ADD; //數(shù)據(jù)操作

        USB_RD=0;

        temp=USB_DATA;

        USB_RD=1;

        return temp;

        }

        /*********************PDIUSBD12硬件提取層********************/

        /***********************PDIUSBD12命令層**********************/

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

        //函數(shù):set_usb_addr

        //說(shuō)明:設(shè)置USB地址/使能:指令為0xd0

        //入口:uchar addr:設(shè)置的新地址

        //返回:無(wú)

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

        void set_usb_addr(uchar addr)

        {

        write_usb_command(0xd0);

        write_a_usb_data(0x80|addr); //把bit8置高表示使能

        }

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

        //函數(shù):set_endpoint_enable

        //說(shuō)明:設(shè)置端點(diǎn)使能:命令為0xd8

        //入口:無(wú)

        //返回:無(wú)

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

        void set_endpoint_enable(void)

        {

        write_usb_command(0xd8);

        write_a_usb_data(0x01);

        }

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

        //函數(shù):set_mode

        //說(shuō)明:設(shè)置模式命令:指令為0xf3

        //入口:uchar bconfig:配置字節(jié)信息

        // uchar bclkdiv:時(shí)鐘分頻因數(shù)字節(jié)

        //返回:無(wú)

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

        void set_mode(uchar bconfig,uchar bclkdiv)

        {

        write_usb_command(0xf3);

        write_a_usb_data(bconfig);

        write_a_usb_data(bclkdiv);

        }

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

        //函數(shù):set_dma

        //說(shuō)明:設(shè)置DMA命令:指令為0xfb

        //入口:uchar bmode:設(shè)置DMA字節(jié)

        //返回:無(wú)

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

        void set_dma(uchar bmode)

        {

        write_usb_command(0xfb);

        write_a_usb_data(bmode);

        }

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

        //函數(shù):read_interrupt_register

        //說(shuō)明:讀USB中斷寄存器:指令為0xf4

        //入口:無(wú)

        //返回:uchar inter_reg:中斷寄存器第一字節(jié)

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

        uchar read_interrupt_register(void)

        {

        uchar inter_reg;

        uchar inter_reg2;

        write_usb_command(0xf4);

        inter_reg=read_a_usb_data(); //讀第一字節(jié)

        inter_reg2=read_a_usb_data(); //讀第二字節(jié)

        return inter_reg; //返回第一字節(jié)

        }

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

        //函數(shù):select_endpoint

        //說(shuō)明:選擇端點(diǎn):指令為0x00+endp

        // 該命令將內(nèi)部指針初始化到選擇的緩沖區(qū)

        // 起始位置。

        //入口:uchar endp:選擇端點(diǎn)0-5

        //返回:uchar state:bit0--1表示緩沖區(qū)滿,0表示緩沖區(qū)空

        // bit1--1表示端點(diǎn)處于停止?fàn)顟B(tài)

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

        uchar select_endpoint(uchar endp)

        {

        uchar state;

        write_usb_command(0x00+endp);

        state=read_a_usb_data();

        return state;

        }

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

        //函數(shù):read_last_status

        //說(shuō)明:讀取端點(diǎn)最后處理狀態(tài),命令為0x40+endp

        // 該命令同時(shí)復(fù)位中斷寄存器中的相應(yīng)位,

        // 并將狀態(tài)清零,表示已讀取。

        //入口:uchar endp:選擇端點(diǎn)0-5

        //返回:uchar read_a_usb_data():最后處理狀態(tài)寄存器

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

        uchar read_last_status(uchar endp)

        {

        write_usb_command(0x40+endp);

        return read_a_usb_data();

        }

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

        //函數(shù):set_endpoint_status

        //說(shuō)明:設(shè)置端點(diǎn)狀態(tài):命令為0x40+endp

        //入口:uchar endp:選擇端點(diǎn)0-5

        // uchar status:設(shè)置狀態(tài)值,bit1-bit7為保留位

        // bit0=1--表示端點(diǎn)處于停止?fàn)顟B(tài)

        //返回:無(wú)

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

        void set_endpoint_status(uchar endp,uchar status)

        {

        write_usb_command(0x40+endp);

        write_a_usb_data(status);

        }

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

        //函數(shù):send_resume

        //說(shuō)明:發(fā)送恢復(fù)命令:命令為0xf6

        //入口:無(wú)

        //返回:無(wú)

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

        void send_resume(void)

        {

        write_usb_command(0xf6);

        }

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

        //函數(shù):read_endpoint_status

        //說(shuō)明:讀端點(diǎn)狀態(tài):命令為0x80+endp

        //入口:uchar endp:選擇端點(diǎn)0-5

        //返回:uchar read_a_usb_data():當(dāng)前端點(diǎn)狀態(tài)信息

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

        uchar read_endpoint_status(uchar endp)

        {

        write_usb_command(0x80+endp);

        return read_a_usb_data();

        }

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

        //函數(shù):clear_buffer

        //說(shuō)明:緩沖區(qū)清零:命令為0xf2

        //入口:uchar endp:選擇端點(diǎn)0-5

        //返回:uchar read_a_usb_data():當(dāng)前端點(diǎn)狀態(tài)信息

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

        void clear_buffer(void)

        {

        write_usb_command(0xf2);

        }

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

        //函數(shù):validate_buffer

        //說(shuō)明:使緩沖區(qū)有效:命令為0xfa

        //入口:無(wú)

        //返回:無(wú)

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

        void validate_buffer(void)

        {

        write_usb_command(0xfa);

        }

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

        //函數(shù):

        //說(shuō)明:讀緩沖區(qū):命令為0xf0

        //入口:uchar endp:選擇端點(diǎn)

        // uchar len:緩沖區(qū)數(shù)據(jù)長(zhǎng)度

        // uchar * buff:緩沖數(shù)據(jù)數(shù)組

        //返回:uchar j:緩沖數(shù)據(jù)字節(jié)數(shù)

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

        uchar read_endpoint_buff(uchar endp,uchar len,uchar * buff)

        {

        uchar i,j;

        read_last_status(endp); //讀endp端點(diǎn)最后處理狀態(tài)寄存器,同時(shí)復(fù)位中斷寄存器的相應(yīng)位

        if(!(select_endpoint(endp)&0x01)) //端點(diǎn)endp緩沖區(qū)為空則返回

        {

        return 0;

        }

        if((read_endpoint_status(endp)&0x60)!=0x60) //兩個(gè)緩沖區(qū)沒(méi)有都滿,才能清中斷

        {

        read_last_status(endp); //清中斷

        }

        write_usb_command(0xf0); //讀緩沖區(qū)命令,讀nB

        read_a_usb_data(); //字節(jié)1,保留,可為任意值

        j=read_a_usb_data(); //字節(jié)2,數(shù)據(jù)字節(jié)的長(zhǎng)度

        if(j>len) //數(shù)據(jù)字節(jié)長(zhǎng)度最大130B

        {

        j=len;

        }

        for(i=0;i

        {

        USB_RD=0;

        *(buff+i)=USB_DATA;

        USB_RD=1;

        }

        clear_buffer(); //清緩沖區(qū)

        return j;

        }

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

        //函數(shù):

        //說(shuō)明:寫緩沖區(qū):命令為0xf0

        //入口:uchar endp:選擇端點(diǎn)

        // uchar len:緩沖區(qū)數(shù)據(jù)長(zhǎng)度

        // uchar * buff:緩沖數(shù)據(jù)數(shù)組

        //返回:uchar len:緩沖數(shù)據(jù)長(zhǎng)度(最大130B)

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

        uchar write_endpoint_buff(uchar endp,uchar len,uchar * buff)

        {

        uchar i;

        read_last_status(endp); //讀endp端點(diǎn)最后處理狀態(tài)寄存器,同時(shí)復(fù)位中斷寄存器的相應(yīng)位

        select_endpoint(endp); //選擇端點(diǎn)

        write_usb_command(0xf0); //寫緩沖區(qū)指令,寫nB

        write_a_usb_data(0); //第1字節(jié)保留,總為0

        write_a_usb_data(len); //第2字節(jié),寫入數(shù)據(jù)長(zhǎng)度

        for(i=0;i

        {

        USB_DATA=*(buff+i);

        USB_WR=0;

        USB_WR=1;

        }

        USB_DATA=0xFF;

        validate_buffer(); //使緩沖區(qū)有效

        return len;

        }

        /***********************PDIUSBD12命令層**********************/

      樹莓派文章專題:樹莓派是什么?你不知道樹莓派的知識(shí)和應(yīng)用

      可控硅相關(guān)文章:可控硅工作原理


      比較器相關(guān)文章:比較器工作原理




      關(guān)鍵詞: USB PDIUSBD12

      評(píng)論


      相關(guān)推薦

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

      關(guān)閉