8051 vusb Tx实现
Posted huxingkeji
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了8051 vusb Tx实现相关的知识,希望对你有一定的参考价值。
; .\\Output\\usb_tx.SRC generated from: usb\\usb_tx.c ; vusb tx driver for 8051 core by crazy_code ; 2017/1/7 $NOMOD51 NAME USB_TX #include "hs6210.inc" CSEG AT 0x400 EXTRN DATA (usb_tx_count) EXTRN DATA (usb_tx_buffer_pointer) EXTRN DATA (pfix_nop) PUBLIC usb_tx #define tx_next usb_tx_count L_Bit0_Idle: // [82] clr c //清除Cy --1cycle [83] nop // --1cycle [84] inc r0 //指针前移 --1cycle [85] ->13 djnz r7, L_Bit1_Begin //不需要bit suffing, 发送下一bit --3cycle [3] inc @r1 //凑两个nop [2] dec @r1 //凑两个nop [4] mov r7, #06h // bit suffing 计数值还原 --2cycle [6] XRL P0,#03H // 插入bit_suffing --3cycle [9] sjmp L_Bit2_Begin // 发送下一bit --2cycle [11] L_Bit1_Idle: //从上次翻转到这个分支 2+1+1+3 --7cycle [7] clr c //清除Cy --1cycle [8] mov tx_next, @r0 //下一byte数据存到tx_nex --2cycle [10] ->10 nop // --1cycle [11] djnz r7, L_Bit2_Begin //不需要bit suffing, 发送下一bit --3cycle [14] inc @r1 //凑两个nop [2] dec @r1 //凑两个nop [4] mov r7, #06h // bit suffing 计数值还原 --2cycle [6] XRL P0,#03H // 插入bit_suffing --3cycle [9] sjmp L_Bit2_Begin // 发送下一bit --2cycle [11] L_Bit2_Idle: //从上次翻转到这个分支 [18] clr c //清除Cy --1cycle [19] inc @r1 // [21] ->11 djnz r7, L_Bit3_Begin //不需要bit suffing, 发送下一bit --3cycle [24] inc @r1 //凑两个nop [2] dec @r1 //凑两个nop [4] mov r7, #06h // bit suffing 计数值还原 --2cycle [6] XRL P0,#03H // 插入bit_suffing --3cycle [9] sjmp L_Bit3_Begin // 发送下一bit --2cycle [11] L_Bit3_Idle: //从上次翻转到这个分支 [28] clr c //清除Cy --1cycle [29] mov r2, tx_next //下一byte数据存到r2 --2cycle [31] ->10 nop // --1cycle [32] djnz r7, L_Bit4_Begin //不需要bit suffing, 发送下一bit --3cycle [35] inc @r1 //凑两个nop [2] dec @r1 //凑两个nop [4] mov r7, #06h // bit suffing 计数值还原 --2cycle [6] XRL P0,#03H // 插入bit_suffing --3cycle [9] sjmp L_Bit4_Begin // 发送下一bit --2cycle [11] L_Bit4_Idle: //从上次翻转到这个分支 [39] clr c //清除Cy --1cycle [40] inc @r1 // [42] ->11 djnz r7, L_Bit5_Begin //不需要bit suffing, 发送下一bit --3cycle [45] inc @r1 //凑两个nop [2] dec @r1 //凑两个nop [4] mov r7, #06h // bit suffing 计数值还原 --2cycle [6] XRL P0,#03H // 插入bit_suffing --3cycle [9] sjmp L_Bit5_Begin // 发送下一bit --2cycle [11] L_Bit5_Idle: //从上次翻转到这个分支 [49] clr c //清除Cy --1cycle [50] inc @r1 // [52] ->10 djnz r7, L_Bit6_Begin //不需要bit suffing, 发送下一bit --3cycle [55] inc @r1 //凑两个nop [2] dec @r1 //凑两个nop [4] mov r7, #06h // bit suffing 计数值还原 --2cycle [6] XRL P0,#03H // 插入bit_suffing --3cycle [9] sjmp L_Bit6_Begin // 发送下一bit --2cycle [11] L_Bit6_Idle: //从上次翻转到这个分支 [59] clr c //清除Cy --1cycle [60] inc @r1 // [62] ->10 djnz r7, L_Bit7_Begin //不需要bit suffing, 发送下一bit --3cycle [65] inc @r1 //凑两个nop [2] dec @r1 //凑两个nop [4] mov r7, #06h // bit suffing 计数值还原 --2cycle [6] XRL P0,#03H // 插入bit_suffing --3cycle [9] sjmp L_Bit7_Begin // 发送下一bit --2cycle [11] L_Bit7_Idle: //从上次翻转到这个分支 [69] clr c //清除Cy --1cycle [70] inc @r1 //凑两个nop [72] ->10 djnz r7, L_Check_End //不需要bit suffing, 发送下一bit --3cycle [75] inc @r1 //凑两个nop [2] dec @r1 //凑两个nop [4] mov r7, #06h // bit suffing 计数值还原 --2cycle [6] XRL P0,#03H // 插入bit_suffing --3cycle [9] sjmp L_Check_End // 检测是否发送完毕 --2cycle [11] L_Bit0_Begin: //从begin过来7cycle, idle过来5cycle [78] rrc a // bit0 -> СC.C --1cycle [79] jc L_Bit0_Idle // if CС.C = 1 电平保持不变 否则翻转 --3cycle [82] XRL P0,#03H // 翻转 D+ & D- --3cycle [85] mov R7, #06h // bit suffing 计数值还原 --2cycle [2] inc r0 //指针前移 --1cycle [3] L_Bit1_Begin: rrc a // bit0 -> СC.C --1cycle [4] jc L_Bit1_Idle // if CС.C = 1 电平保持不变 否则翻转 --3cycle [7] XRL P0,#03H // 翻转 D+ & D- --3cycle [10] ->10 mov R7, #06h // bit suffing 计数值还原 --2cycle [12] mov tx_next, @r0 //下一byte数据存到tx_nex --2cycle [14] L_Bit2_Begin: rrc a // bit0 -> СC.C --1cycle [15] jc L_Bit2_Idle // if CС.C = 1 电平保持不变 否则翻转 --3cycle [18] XRL P0,#03H // 翻转 D+ & D- --3cycle [21] ->11 mov R7, #06h // bit suffing 计数值还原 --2cycle [23] nop // --1cycle [24] L_Bit3_Begin: rrc a // bit0 -> СC.C --1cycle [25] jc L_Bit3_Idle // if CС.C = 1 电平保持不变 否则翻转 --3cycle [28] XRL P0,#03H // 翻转 D+ & D- --3cycle [31] ->10 mov R7, #06h // bit suffing 计数值还原 --2cycle [33] mov r2, tx_next //下一byte数据存到r2 --2cycle [35] L_Bit4_Begin: rrc a // bit0 -> СC.C --1cycle [36] jc L_Bit4_Idle // if CС.C = 1 电平保持不变 否则翻转 --3cycle [39] XRL P0,#03H // 翻转 D+ & D- --3cycle [42] ->11 mov R7, #06h // bit suffing 计数值还原 --2cycle [44] nop // --1cycle [45] L_Bit5_Begin: rrc a // bit0 -> СC.C --1cycle [46] jc L_Bit5_Idle // if CС.C = 1 电平保持不变 否则翻转 --3cycle [49] XRL P0,#03H // 翻转 D+ & D- --3cycle [52] ->10 mov R7, #06h // bit suffing 计数值还原 --2cycle [54] nop // --1cycle [55] L_Bit6_Begin: rrc a // bit0 -> СC.C --1cycle [56] jc L_Bit6_Idle // if CС.C = 1 电平保持不变 否则翻转 --3cycle [59] XRL P0,#03H // 翻转 D+ & D- --3cycle [62] ->10 mov R7, #06h // bit suffing 计数值还原 --2cycle [64] nop // --1cycle [65] L_Bit7_Begin: rrc a // bit0 -> СC.C --1cycle [66] jc L_Bit7_Idle // if CС.C = 1 电平保持不变 否则翻转 --3cycle [69] XRL P0,#03H // 翻转 D+ & D- --2cycle [72] ->10 mov R7, #06h // bit suffing 计数值还原 --2cycle [74] L_Check_End: // mov a, r2 //取数据 --1cycle [75] djnz r6, L_Bit0_Begin //如果数据未发完继续,否则进入TX_end --3cycle [78] jmp L_Tx_End // --3cycle [81] L_Tx_End: // nop // [81] nop // [82] nop // [83] nop // [84] MOV P0, #00h // EOP --2cycle nop nop nop nop nop // 5 nop nop nop nop nop // 10 nop nop nop nop nop // 15 nop nop nop nop nop // Open_interrupt mov P0, #02h //21 mov P0DIR, #03h // D+ & D- input ret // a里面存正在发送的数据,r0为要发送数据指针,r6为未发送计数值 r7为bit_suffing计数值 // r1里面缓存下一个要发送的数据 usb_tx: // USING 2 close_interrupt MOV P0, #02h ; EOP后, D+ = 0 D- = 1; MOV P0DIR, #00h mov r7, #08h tx_delay: nop nop djnz r7, tx_delay MOV r7, #06h MOV r0, usb_tx_buffer_pointer+02h mov r6, usb_tx_count mov a, @r0 mov r1, pfix_nop+02h //R1指向寄存器B的地址,无实际意义,目的是通过inc/dec @r1指令替换两条nop指令,以减小code size jmp L_Bit0_Begin ; END OF usb_tx END
以上是关于8051 vusb Tx实现的主要内容,如果未能解决你的问题,请参考以下文章