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

  

posted on 2017-02-17 14:30  crazy_code1990  阅读(285)  评论(0编辑  收藏  举报