; .\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
转载于:https://www.cnblogs.com/huxingkeji/p/6409717.html