使用USB低速設備如何傳送大于8位元組的資料給主機?
USB 協定規定USB低速設備一次最大傳送8Byte,而向游戲控制器一類設備傳送資料時,可能需要一次傳送更多位元組,這就需要分多次傳送。
例如如果傳送10Byte,用戶可以使用以下方式:
BTS1 UE1R.4 //判斷是否有USB 端點1請求?
JMP Main_Loop //沒有端點1請求,跳到主程序
//有端點1請求
EP1_WR_RAM_addr_set #0x8 //寫端點1FIFO地址
EP1_WR_RAM_data Buffer0 //寫數據到FIFO
EP1_WR_RAM_addr_set #0x9 //FIFO address + 1
EP1_WR_RAM_data Buffer1 //寫數據到FIFO
EP1_WR_RAM_addr_set #0xA
EP1_WR_RAM_data Buffer2
EP1_WR_RAM_addr_set #0xB
EP1_WR_RAM_data Buffer3
EP1_WR_RAM_addr_set #0xC ;
EP1_WR_RAM_data Buffer4
EP1_WR_RAM_addr_set #0xD
EP1_WR_RAM_data Buffer5
EP1_WR_RAM_addr_set #0xE
EP1_WR_RAM_data Buffer6
EP1_WR_RAM_addr_set #0xF
EP1_WR_RAM_data Buffer7
MOV A,#88H //寫完8位元組到FIFO,傳送8Byte
MOV UE1R,A
Wait:
BTS1 UE1R.4 //等待主機請求
JMP Wait
EP1_WR_RAM_addr_set #0x8 //寫端點1FIFO地址
EP1_WR_RAM_data Buffer8 //寫第9Byte數據到FIFO
EP1_WR_RAM_addr_set #0x9 //FIFO address + 1
EP1_WR_RAM_data Buffer9 //寫第10Byte數據到FIFO
MOV A,#82H //寫完2位元組到FIFO,傳送2Byte
MOV UE1R,A
Main_Loop:
.........................................
例如如果傳送10Byte,用戶可以使用以下方式:
BTS1 UE1R.4 //判斷是否有USB 端點1請求?
JMP Main_Loop //沒有端點1請求,跳到主程序
//有端點1請求
EP1_WR_RAM_addr_set #0x8 //寫端點1FIFO地址
EP1_WR_RAM_data Buffer0 //寫數據到FIFO
EP1_WR_RAM_addr_set #0x9 //FIFO address + 1
EP1_WR_RAM_data Buffer1 //寫數據到FIFO
EP1_WR_RAM_addr_set #0xA
EP1_WR_RAM_data Buffer2
EP1_WR_RAM_addr_set #0xB
EP1_WR_RAM_data Buffer3
EP1_WR_RAM_addr_set #0xC ;
EP1_WR_RAM_data Buffer4
EP1_WR_RAM_addr_set #0xD
EP1_WR_RAM_data Buffer5
EP1_WR_RAM_addr_set #0xE
EP1_WR_RAM_data Buffer6
EP1_WR_RAM_addr_set #0xF
EP1_WR_RAM_data Buffer7
MOV A,#88H //寫完8位元組到FIFO,傳送8Byte
MOV UE1R,A
Wait:
BTS1 UE1R.4 //等待主機請求
JMP Wait
EP1_WR_RAM_addr_set #0x8 //寫端點1FIFO地址
EP1_WR_RAM_data Buffer8 //寫第9Byte數據到FIFO
EP1_WR_RAM_addr_set #0x9 //FIFO address + 1
EP1_WR_RAM_data Buffer9 //寫第10Byte數據到FIFO
MOV A,#82H //寫完2位元組到FIFO,傳送2Byte
MOV UE1R,A
Main_Loop:
.........................................