日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁 > 單片機 > 單片機
[導(dǎo)讀]首先是對于端點的數(shù)據(jù)處理#ifndef __USBEP2_H_#define __USBEP2_H_#include "usb.h"#include "usbhw.h"#include "msc.h"#include "mscuser.h"void usb_ep2_in_process(void);void usb_ep2_out_process(void);#endif#

首先是對于端點的數(shù)據(jù)處理

#ifndef __USBEP2_H_

#define __USBEP2_H_

#include "usb.h"

#include "usbhw.h"

#include "msc.h"

#include "mscuser.h"

void usb_ep2_in_process(void);

void usb_ep2_out_process(void);

#endif

#include "usbep2.h"

//批量輸入事件

void usb_ep2_in_process(void)

{

switch(BulkStage)

{

caseMSC_BS_DATA_IN:

switch(CBW.CB[0])

{

caseSCSI_READ10:

MSC_MemoryRead();//讀取數(shù)據(jù)并等待下一次傳輸

break;

}

break;

caseMSC_BS_DATA_IN_LAST:

MSC_SetCSW();//上一次傳輸并且傳輸已經(jīng)完成

break;

caseMSC_BS_DATA_IN_LAST_STALL:

USB_SetStallEP(MSC_EP_IN);

MSC_SetCSW();

break;

caseMSC_BS_CSW:

BulkStage=MSC_BS_CBW;//簡單的進行狀態(tài)切換

break;

}

}

//批量輸出事件

void usb_ep2_out_process(void)

{

BulkLen=USB_ReadEP(MSC_EP_OUT,BulkBuf);//讀取緩存

switch(BulkStage)//根據(jù)階段判定

{

caseMSC_BS_CBW://最開始的階段必然是命令階段

MSC_GetCBW();//獲取并處理cbw命令

break;

caseMSC_BS_DATA_OUT://數(shù)據(jù)輸出階段

switch(CBW.CB[0])//分辨寫入指令

{

caseSCSI_WRITE10:

MSC_MemoryWrite();

break;

caseSCSI_VERIFY10:

MSC_MemoryVerify();

break;

}

break;

default://不支持的狀態(tài)

USB_SetStallEP(MSC_EP_OUT);

CSW.bStatus=CSW_PHASE_ERROR;

MSC_SetCSW();

break;

}

}

然后再在子程序中對命令詳細分析

#ifndef __MSCUSER_H_

#define __MSCUSER_H_

#include "msc.h"

#include "usbhw.h"

#include "memory.h"

//批量傳輸節(jié)點的最大包長度

#define MSC_MAX_PACKET 64

//批量傳輸節(jié)點地址

#define MSC_EP_IN 0x82

#define MSC_EP_OUT 0x02

extern uint8_t BulkStage; //傳輸狀態(tài),指明下一次如何傳輸

extern uint8_t BulkLen; //輸出接點,主機輸出的數(shù)據(jù)長度

extern uint8_t BulkBuf[MSC_MAX_PACKET];//數(shù)據(jù)緩存中心

extern MSC_CBW CBW; //cbw塊

extern MSC_CSW CSW; //csw塊

extern uint32_t MemOK; /* 測試mem是否完好 */

#define MSC_DEBUG 0

#if MSC_DEBUG

#define msc_debug_printf(format,args...) printf(format,##args) //變參宏定義

#else

#define msc_debug_printf(x,...) while(0);

#endif

//枚舉過程中的重要節(jié)點

extern uint32_t MSC_Reset(void);

extern uint32_t MSC_GetMaxLUN(void);

//msc設(shè)備的方法

extern void MSC_GetCBW(void);

extern void MSC_SetCSW(void);

void MSC_MemoryRead(void);

void MSC_MemoryWrite(void);

void MSC_MemoryVerify(void);

#endif

#include "mscuser.h"

uint32_t MemOK=__TRUE; /* 測試mem是否完好 */

uint32_t Offset; /* 讀取寫入的定位 */

uint32_t Length; /* 讀取寫入的長度 */

uint8_t BulkStage; /* 批量傳輸?shù)碾A段, 數(shù)據(jù)階段 命令階段 狀態(tài)階段 */

uint8_t BulkBuf[MSC_MAX_PACKET];/* 讀取批量端點傳輸來的數(shù)據(jù) */

uint8_t BulkLen; /* 傳輸長度 */

MSC_CBW CBW; /*CBW結(jié)構(gòu)體 */

MSC_CSW CSW; /*CSW結(jié)構(gòu)體 */

#if NORFLASH

u8 usb_mac_global_buffer[MSC_MAX_PACKET];

#endif

#if NANDFLASH

u8 usb_mac_global_buffer[MSC_MAX_PACKET];

#endif

//msc設(shè)備復(fù)位

uint32_t MSC_Reset(void)

{

BulkStage=MSC_BS_CBW;

return(__TRUE);

}

//獲取標(biāo)號

uint32_t MSC_GetMaxLUN(void)

{

EP0Buf[0]=0; //0為一個設(shè)備

return(__TRUE);

}

//設(shè)備讀取數(shù)據(jù),在in階段發(fā)送出去

void MSC_MemoryRead(void)

{

uint32_t n;

if(Length>MSC_MAX_PACKET)//根據(jù)長度來計算,不能大于包長度

{

n=MSC_MAX_PACKET;

}

else

{

n=Length;

}

if((Offset+n)>MSC_MemorySize)//緩沖區(qū)最大長度

{

n=MSC_MemorySize-Offset;

BulkStage=MSC_BS_DATA_IN_LAST_STALL;//傳輸失敗的發(fā)送

}

#if NORFLASH

NOR_FLASH_Read_Buffer_Mal(Offset,usb_mac_global_buffer,n);//讀取數(shù)據(jù)

USB_WriteEP(MSC_EP_IN,(u8*)usb_mac_global_buffer,n);

#endif

#if NANDFLASH

while(nandReady==0);

nandReady=0;

NAND_Read_Addr_Mal(Offset,usb_mac_global_buffer,n);

USB_WriteEP(MSC_EP_IN,(u8*)usb_mac_global_buffer,n);

nandReady=1;

#endif

Offset+=n;

Length-=n;//傳輸完成后對指針進行相應(yīng)的處理

CSW.dDataResidue-=n;

if(Length==0)

{

BulkStage=MSC_BS_DATA_IN_LAST;//數(shù)據(jù)傳輸成功

}

if(BulkStage!=MSC_BS_DATA_IN)//上一次傳輸為0 ,命令通過

{

CSW.bStatus=CSW_CMD_PASSED;

}

}

u8 norflash_buffer[2048]={0};

//寫入數(shù)據(jù)到設(shè)備

void MSC_MemoryWrite(void)

{

if((Offset+BulkLen)>MSC_MemorySize)//防止超界

{

BulkLen=MSC_MemorySize-Offset;

BulkStage=MSC_BS_CSW;

USB_SetStallEP(MSC_EP_OUT);

}

#if NORFLASH

NOR_FLASH_W

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

在處理SIP的INVITE請求時,如何區(qū)分它們來自9013端口還是62885端口。

關(guān)鍵字: 端口 請求 響應(yīng)

  U 盤即閃存盤,是一種用閃存進行數(shù)據(jù)存儲的介質(zhì),通常使用USB 插頭。U 盤體積極小、重量輕、可熱插拔也可以重復(fù)寫入。U 盤所儲存的數(shù)據(jù),現(xiàn)今仍大多通過計算機提取并進行處理,這也局限了U 盤

關(guān)鍵字: u盤 stc12c5a60s2 音頻播放器

  引 言   近年來,由于我國社會經(jīng)濟的快速發(fā)展和人們生活方式的轉(zhuǎn)變,心血管病發(fā)病率及相關(guān)危險因素呈不斷上升趨勢,人們也越來越注意自己的身心健康。過去測量血壓必須到醫(yī)院,由醫(yī)生用水銀血

關(guān)鍵字: 電子血壓計 脈搏波 lpc1788 s0012a

你想在U盤里存儲多個ISO文件,然后在使用U盤引導(dǎo)啟動時,自由選擇從哪個ISO中進行啟動并進行下一步操作么嗎?想你的U盤里有多個不同的PE系統(tǒng)么?以前操作起來復(fù)雜困難,不過有了Ventoy,一切都變得輕松起來。

關(guān)鍵字: u盤 裝機

優(yōu)盤,自1998年優(yōu)盤被發(fā)明以來,隨著個人生產(chǎn)數(shù)據(jù)的結(jié)構(gòu)變化以及場景的多元化,優(yōu)盤在存儲介質(zhì)和接口上迭代速度越來越快,隨之也衍生出介于不同介質(zhì)和場景的優(yōu)盤產(chǎn)品。“思聰同款2TB優(yōu)盤”、“生肖優(yōu)盤”、“OTG優(yōu)盤”,金士頓...

關(guān)鍵字: u盤 金士頓

近日,小米終于正式發(fā)布了TV Stick(電視棒)產(chǎn)品,目前僅面向海外市場。配置方面,四核ARM A53架構(gòu)處理器、Mali-450 GPU、1GB RAM、8GB ROM,運行Android 9.0 TV系統(tǒng),支持藍牙...

關(guān)鍵字: u盤 小米

隨身移動存儲方面,U盤的地位似乎還無可撼動。 日前,PNY(必恩威)更新了Elite-X Fit家族產(chǎn)品,將最大容量從256GB翻番到512GB,也就是可存儲超過9萬張2000萬像素照片。 這款產(chǎn)品采

關(guān)鍵字: pny u盤

有時應(yīng)用需要檢查USB設(shè)備的加載與卸除消息,如U盤的插上與拔出。一種辦法是以輪詢的方式調(diào)用設(shè)備接口嘗試訪問設(shè)備,但這樣的做法效率很低,并且實時性不高。本文將介紹更為通用的方法,通過系統(tǒng)API函數(shù)

關(guān)鍵字: api函數(shù) sd卡 USB u盤

LED控制卡是顯示屏的核心部件,相當(dāng)于電腦的cpu。負責(zé)從電腦串口或者u盤接收信息,置入幀存儲器,按分區(qū)驅(qū)動方式生成LED顯示屏所需的串行顯示數(shù)據(jù)和掃描控制時序。LED顯示屏的畫面都是通過它轉(zhuǎn)碼

關(guān)鍵字: led顯示屏 u盤

LED控制卡是一個很大的類別,根據(jù)各種應(yīng)用場合或者功能要求的不同,有包括很多細類: 1、通用串口LED控制卡,需要通過電腦的串口或者USB口連接顯示屏來修改顯示節(jié)目; 2、LED

關(guān)鍵字: led顯示屏 u盤 控制卡
關(guān)閉