zoukankan      html  css  js  c++  java
  • 8051 vusb Tx实现

    ; .Outputusb_tx.SRC generated from: usbusb_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
    

      

  • 相关阅读:
    nginx自定义header支持
    使用 navicat 导入导出数据库
    eureka 服务注册与发现
    反射应用之动态代理
    接口应用之“静态代理”
    工厂模式
    计算程序运行的时间(以求得1-10000之间的素数为例)
    抽象类的模板方法设计模式
    ==和equals()方法的区别
    单例设计模式之饿汉式和懒汉式的区别
  • 原文地址:https://www.cnblogs.com/huxingkeji/p/6409717.html
Copyright © 2011-2022 走看看