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

  

时间: 2025-01-03 02:24:57

8051 vusb Tx实现的相关文章

10.Spring事务管理【TX】

转账案例环境搭建 1.引入JAR包 IOC的6个包 AOP的4个包 C3P0的1个包 MySQL的1个驱动包 JDBC的2个目标包 整合JUnit测试1个包 2.引入配置文件 log4j.properties+applicationContext.xml ### direct log messages to stdout ### log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target=

项目感悟 基于8051的数据采集系统-总纲

博文的内容是感想,是我在做一个小作品的时候记录下来的感想.现在将其整理好,分享出来. 我写博文的纲领是隐恶扬善,所以一些不好的事情,闭口不说.但别人对我的好,要尽力写出来. 虽然我不是大牛,感想有时显得有些幼稚,但是我依然希望你能通过我的感想得到一些启发,少走一些弯路. 博文的宗旨是:隐恶扬善. 作品名称:基于8051的数据采集系统 简介:下位机用 8051新手开发板,传感器采集需要的数据,通过USB通信接口发送给上位机,上位机的系统是win 7,用C#的Winform写的串口调试程序接收数据.

JFinal DB.tx()事务

JFinal中有个封装好的事务应用,用起来非常方便简单. 写法1: Db.tx(new IAtom(){ @Override public boolean run() throw SQLException{ //在这里写要执行的操作,操作结果result为boolean值 return result; } }); result值为true则操作成功,为false则回滚. 事务DB.tx()本身也返回一个boolean值,表示最终操作结果是否成功,true为成功,false失败. 写法2: 在方法

通配符的匹配很全面, 但无法找到元素 'tx:annotation-driven'

配置Spring时出现如题这个错误,下面是xml的内容 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http:/

TX后台笔试

1,int *(*a)[3][4]; 求sizeof(a) sizeof(*a) sizeof(**a) sizeof(***a) sizeof(****a) 做错:4,48,16,4,4 这个做错不应该. 2,定义一个宏,求最高维的数目 如:int b[4][6];为4 #define DIM(x)  sizeof(x)/sizeof(x[0]) 蒙对,让我解释的时候,我自己SB说不是很确定 3,我傻逼了,吗的 int a[3] = {0,1,2};    int *p=a;    int *

IAR Embedded Workbench for 8051 version 9.20 嵌入式系统+S.T.A. DATA 3Muri Pro v10.0.2.1结构分析软件

IAR Embedded Workbench for 8051 version 9.20 嵌入式系统软件IAR Embedded Workbench for 8051 version 9.20是一款嵌入式系统软件,主要用于单片机开发,拥有 是一套高度精密且使用方便的嵌入式应用编程开发工具.该集成开发环境中包含了IAR的C/C++编译器. 汇编工具.链接器.库管理器.文本编辑器.工程管理器和C-SPY调试器. 8051技术在低功耗.物联网传感器等方面已经变得非常流行.为了充分利用这些设备,开发人员

8051汇编命令记录。

15年初出了个差,到现在才回到园子里……工作忙一方面,另外确实好久没搞这些东西了. 原本想在8051单片机上搞个分时操作系统,所以看了下8051汇编下代码,总结记录如下: LJMP C:0149 //长跳转到0x0149地址开始执行命令,这条命令位于0x0000地址,是第一条命令.MOV R0,#0x7F //把立即数赋值给R0寄存器CLR A //目前看是清空寄存器AMOV @R0,A //把R0作为地址,对其内容赋值为0.DJNZ R0,C:014C //如果R0减1后不为0,就跳转到014

可编程的文字处理引擎TX Text Control .NET Server for Windows Forms

TX Text Control .NET Server for Windows Forms控件是一个完全可编程的,用于ASP.NET服务器环境与 Microsoft Internet Explorer的文字处理引擎.它的设计理念就是在服务器端集中文字处理过程. 具体功能: 直接在浏览器中以所见即所得方式编辑文档 TX Text Control .NET Server为您提供了一个浏览器控件,通过它可以在微软IE中以进行所见即所得模式进行文本处理,甚至使用来自不同源的数据从零开始通过编程生成文档.

8051指令周期表(转)

8051指令周期表 转载:http://wenku.baidu.com/view/483ccdc75fbfc77da269b1d7.html?re=view