搜索
bottom↓
回复: 41

LGT 最小系统板测评

[复制链接]

出0入0汤圆

发表于 2013-7-12 11:47:48 | 显示全部楼层 |阅读模式
本帖最后由 xwkm 于 2013-7-12 22:47 编辑

在两天前我向LGT工作人员申请了样品和工具。现在依然在试用和编程中。
今天搞完了内置32MHz的R/C振荡器V-USB。顺带靠测量D-脉冲写了个R/C振荡器自动校准程序。
不过依然有bug。而且不是完美解决。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2013-7-12 22:49:12 | 显示全部楼层
上板图




关于这个板子的各种开发我会陆续公布在这个帖子上。
明天争取解决振荡器校准的问题/

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2013-7-12 23:40:34 | 显示全部楼层
不知道楼主有时间能不能测一下vusb跑在32m的速度

附件里是个测试工程上位机有c的和delphi的

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2013-7-13 00:01:38 | 显示全部楼层
本帖最后由 xwkm 于 2013-7-13 00:04 编辑
goodcode 发表于 2013-7-12 23:40
不知道楼主有时间能不能测一下vusb跑在32m的速度

附件里是个测试工程上位机有c的和delphi的 ...


暂时还没有自己移植个32M的打算。内部RC不算特别稳定。
现在在内振上跑的2分频。
LGT8F88A进中断的时序貌似发生了一些改变。所以12M的驱动估计得大改了。
当然我要试试移植个24M的V-USB。
不过目前最棘手的问题就是88A的OSCCAL自动校准问题。我得找个最好的解决方案来解决。
不过其实不解决也不是不可以。因为现在的8F88A都已经校准过。没啥大问题。
我写这个校准算法主要是想提高稳定性。并且想在8F08A上无外振V-USB……

出0入0汤圆

 楼主| 发表于 2013-7-13 00:03:06 | 显示全部楼层
本帖最后由 xwkm 于 2013-7-13 00:08 编辑

不过说实话等到最后的校准算法出来后估计USBasp会更省料了。晶振都可以省掉了。
另外就是以前的in + sbrs指令可以直接换成nop + sbis了。LGT8F88A没有了IO同步的问题。
关于Bootloader的制作我是想好好省下料。最好做到不用接任何器件。只要VCC D+ D- GND接了就可以连接电脑下载。
这样开发板成本可以大幅降低。毕竟现在LGT时钟准了不少。不好好利用下也不是咱作风啊。
PS:实验板是公版V-USB的设计.所以如果以后要给实验板开发V-USB程序可以不用改IO部分.

出0入0汤圆

发表于 2013-7-13 00:05:51 | 显示全部楼层
奇怪了,我十几年没撸了,怎么看东西还有重影啊?肯定是肾亏了。

出0入0汤圆

 楼主| 发表于 2013-7-13 00:07:32 | 显示全部楼层
楼上对不起。相机没有防抖功能.

出0入0汤圆

发表于 2013-7-13 00:11:07 | 显示全部楼层
LGT跟AVR那样皮实不?

出0入0汤圆

发表于 2013-7-13 00:16:50 | 显示全部楼层
90999 发表于 2013-7-13 00:05
奇怪了,我十几年没撸了,怎么看东西还有重影啊?肯定是肾亏了。

你太幽默了

出0入0汤圆

 楼主| 发表于 2013-7-13 00:37:41 | 显示全部楼层
danju 发表于 2013-7-13 00:11
LGT跟AVR那样皮实不?

目前我还没坏过一片……

出0入0汤圆

发表于 2013-7-13 01:02:00 | 显示全部楼层
顶楼主为大伙造福。

出0入0汤圆

发表于 2013-7-13 10:08:55 | 显示全部楼层
楼主辛苦了!!

出0入0汤圆

发表于 2013-7-13 10:11:59 | 显示全部楼层
danju 发表于 2013-7-13 00:11
LGT跟AVR那样皮实不?

楼上可以整几片LGT8F88A测试下, 看是不是和AVR一样皮实!:)

出0入0汤圆

发表于 2013-7-13 11:57:00 | 显示全部楼层
  1. /* Name: usbdrvasm12.inc
  2. * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers
  3. * Author: Christian Starkjohann
  4. * Creation Date: 2004-12-29
  5. * Tabsize: 4
  6. * Copyright: (c) 2007 by OBJECTIVE DEVELOPMENT Software GmbH
  7. * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt)
  8. * This Revision: $Id$
  9. */

  10. /* Do not link this file! Link usbdrvasm.S instead, which includes the
  11. * appropriate implementation!
  12. */

  13. /*
  14. General Description:
  15. This file is the 12 MHz version of the asssembler part of the USB driver. It
  16. requires a 12 MHz crystal (not a ceramic resonator and not a calibrated RC
  17. oscillator).

  18. See usbdrv.h for a description of the entire driver.

  19. Since almost all of this code is timing critical, don't change unless you
  20. really know what you are doing! Many parts require not only a maximum number
  21. of CPU cycles, but even an exact number of cycles!


  22. Timing constraints according to spec (in bit times):
  23. timing subject                                      min max    CPUcycles
  24. ---------------------------------------------------------------------------
  25. EOP of OUT/SETUP to sync pattern of DATA0 (both rx) 2   16     16-128
  26. EOP of IN to sync pattern of DATA0 (rx, then tx)    2   7.5    16-60
  27. DATAx (rx) to ACK/NAK/STALL (tx)                    2   7.5    16-60
  28. */

  29. #if USB_CFG_CLOCK_KHZ == 12000
  30.         #define nop8
  31. #elif USB_CFG_CLOCK_KHZ == 24000
  32.         #define nop8                rcall delay8
  33. #else
  34.         #error "USB_CFG_CLOCK_KHZ is not one of the supported non-crc-rates!"
  35. #endif

  36. ;Software-receiver engine. Strict timing! Don't change unless you can preserve timing!
  37. ;interrupt response time: 4 cycles + insn running = 7 max if interrupts always enabled
  38. ;max allowable interrupt latency: 34 cycles -> max 25 cycles interrupt disable
  39. ;max stack usage: [ret(2), YL, SREG, YH, shift, x1, x2, x3, cnt, x4] = 11 bytes
  40. ;Numbers in brackets are maximum cycles since SOF.
  41. USB_INTR_VECTOR:
  42. ;order of registers pushed: YL, SREG [sofError], YH, shift, x1, x2, x3, cnt
  43.     push    YL              ;2 [35] push only what is necessary to sync with edge ASAP
  44.     in      YL, SREG        ;1 [37]
  45.     push    YL              ;2 [39]
  46.         push         x5                                ; //新增加寄存器变量
  47. ;----------------------------------------------------------------------------
  48. ; Synchronize with sync pattern:
  49. ;----------------------------------------------------------------------------
  50. ;sync byte (D-) pattern LSb to MSb: 01010100 [1 = idle = J, 0 = K]
  51. ;sync up with J to K edge during sync pattern -- use fastest possible loops
  52. ;The first part waits at most 1 bit long since we must be in sync pattern.
  53. ;YL is guarenteed to be < 0x80 because I flag is clear. When we jump to
  54. ;waitForJ, ensure that this prerequisite is met.
  55. ;原始LGT 移植代码 此处可能会引起错误当开启USB_COUNT_SOF, USB_SOF_HOOK或者电平错误时将导致死循环或不执行代码
  56. ;通过增加新寄存器变量修正
  57. waitForJ:
  58.     inc     YL
  59.     in                x5,         USBIN
  60.     sbrs    x5,         USBMINUS
  61.     brne    waitForJ        ; just make sure we have ANY timeout
  62. waitForK:
  63. ;The following code results in a sampling window of 1/4 bit which meets the spec.
  64.     in                x5,         USBIN
  65.     sbrs    x5,         USBMINUS
  66.     rjmp    foundK
  67.     in                x5,         USBIN
  68.     sbrs    x5,         USBMINUS
  69.     rjmp    foundK
  70.     in                x5,         USBIN
  71.     sbrs    x5, USBMINUS
  72.     rjmp    foundK
  73.     in                x5,         USBIN
  74.     sbrs    x5,         USBMINUS
  75.     rjmp    foundK
  76.     in                x5,         USBIN
  77.     sbrs    x5,         USBMINUS
  78.     rjmp    foundK

  79. #if USB_CFG_CLOCK_KHZ == 24000
  80.     in                x5,         USBIN
  81.     sbrs    x5, USBMINUS
  82.     rjmp    foundK
  83.     in                x5,         USBIN
  84.     sbrs    x5,         USBMINUS
  85.     rjmp    foundK
  86.     in                x5,         USBIN
  87.     sbrs    x5,         USBMINUS
  88.     rjmp    foundK
  89. #endif

  90. #if USB_COUNT_SOF
  91.     lds     YL, usbSofCount
  92.     inc     YL
  93.     sts     usbSofCount, YL
  94. #endif  /* USB_COUNT_SOF */
  95. #ifdef USB_SOF_HOOK
  96.     USB_SOF_HOOK
  97. #endif
  98.     rjmp    sofError
  99. foundK:
  100. ;{3, 5} after falling D- edge, average delay: 4 cycles [we want 4 for center sampling]
  101. ;we have 1 bit time for setup purposes, then sample again. Numbers in brackets
  102. ;are cycles from center of first sync (double K) bit after the instruction
  103.     push    YH                          ;1 [1]
  104.         nop
  105.     lds     YL, usbInputBufOffset        ;2 [4]
  106.     clr     YH                          ;1 [5]
  107.     subi    YL, lo8(-(usbRxBuf))        ;1 [6]
  108.     sbci    YH, hi8(-(usbRxBuf))        ;1 [7]

  109.         in      x5,    USBIN                        ;1 [8]
  110.         sbrs        x5,    USBMINUS                        ;1 [9]
  111.     ;sbis    USBIN, USBMINUS ;1 [8] we want two bits K [sample 1 cycle too early]
  112.     rjmp    haveTwoBitsK                    ;1 [10]
  113.     pop     YH                                     ;1 [11] undo the push from before
  114.     rjmp    waitForK                        ;1 [12] this was not the end of sync, retry
  115. haveTwoBitsK:
  116. ;----------------------------------------------------------------------------
  117. ; push more registers and initialize values while we sample the first bits:
  118. ;----------------------------------------------------------------------------
  119.     push    shift                                  ;1 [11];2 [16]
  120.     push    x1                              ;1 [12];2 [12]
  121.     push    x2                                     ;1 [13];2 [14]
  122.     ;原始LGT 移植代码 此处引起关键错误 可能因为上面读寄存器引起的时序偏差导致读bit 0后移
  123.         ;未使用逻辑分析仪跟踪分析 上面只是推测减少两个时钟的延迟就无错误数据出现 说明读取bit 0
  124.         ;向后移了很多
  125.         ;nop2                                                    ;2 [15]
  126.     ;nop                                                            ;1 [16]
  127.         ;新代码
  128.         nop

  129.     in      x1, USBIN       ;1 [17] <-- sample bit 0
  130.     ldi     shift, 0xff     ;1 [18]
  131.     bst     x1, USBMINUS    ;1 [19]
  132.     bld     shift, 0        ;1 [20]
  133.     push    x3              ;1 [21];2 [22]
  134.     push    cnt             ;1 [22];2 [24]
  135.     nop2                    ;2 [24]
  136.    
  137.     in      x2, USBIN       ;1 [25] <-- sample bit 1
  138.     ser     x3              ;1 [26] [inserted init instruction]
  139.     eor     x1, x2          ;1 [27]
  140.     bst     x1, USBMINUS    ;1 [28]
  141.     bld     shift, 1        ;1 [29]
  142.     ldi     cnt, USB_BUFSIZE;1 [30] [inserted init instruction]
  143.     nop                            ;1 [31]
  144.     rjmp    rxbit2          ;1 [32];2[32]

  145. ;----------------------------------------------------------------------------
  146. ; Receiver loop (numbers in brackets are cycles within byte after instr)
  147. ;----------------------------------------------------------------------------

  148. unstuff0:               ;1 (branch taken)
  149.     andi    x3, ~0x01   ;1 [15]
  150.     mov     x1, x2      ;1 [16] x2 contains last sampled (stuffed) bit
  151.     in      x2, USBIN   ;1 [17] <-- sample bit 1 again
  152.     ori     shift, 0x01 ;1 [18]
  153.     nop                        ;1 [19]
  154.     rjmp    didUnstuff0 ;1 [20];2 [20]

  155. unstuff1:               ;1 (branch taken)
  156.     mov     x2, x1      ;1 [21] x1 contains last sampled (stuffed) bit
  157.     andi    x3, ~0x02   ;1 [22]
  158.     ori     shift, 0x02 ;1 [23]
  159.     nop                 ;1 [24]
  160.     in      x1, USBIN   ;1 [25] <-- sample bit 2 again
  161.     nop                        ;1 [26]
  162.     rjmp    didUnstuff1 ;1 [27];2 [27]

  163. unstuff2:               ;1 (branch taken)
  164.     andi    x3, ~0x04   ;1 [29]
  165.     ori     shift, 0x04 ;1 [30]
  166.     mov     x1, x2      ;1 [31] x2 contains last sampled (stuffed) bit
  167.     nop                 ;1 [32]
  168.     in      x2, USBIN   ;1 [33] <-- sample bit 3
  169.     nop                        ;1 [34]
  170.     rjmp    didUnstuff2 ;1 [35];2 [35]

  171. unstuff3:               ;1 (branch taken)
  172.     in      x2, USBIN   ;1 [34] <-- sample stuffed bit 3 [one cycle too late]
  173.     andi    x3, ~0x08   ;1 [35]
  174.     ori     shift, 0x08 ;1 [36]
  175.     nop                        ;1 [37]
  176.     rjmp    didUnstuff3 ;1 [38];2 [38]

  177. unstuff4:               ;1 (branch taken)
  178.     andi    x3, ~0x10   ;1 [40]
  179.     in      x1, USBIN   ;1 [41] <-- sample stuffed bit 4
  180.     ori     shift, 0x10 ;1 [42]
  181.     nop                        ;1 [43]
  182.     rjmp    didUnstuff4 ;1 [44];2 [44]

  183. unstuff5:               ;1 (branch taken)
  184.     andi    x3, ~0x20   ;1 [48]
  185.     in      x2, USBIN   ;1 [49] <-- sample stuffed bit 5
  186.     ori     shift, 0x20 ;1 [50]
  187.     nop                        ;1 [51]
  188.     rjmp    didUnstuff5 ;1 [52];2 [52]

  189. unstuff6:               ;1 (branch taken)
  190.     andi    x3, ~0x40   ;1 [56]
  191.     in      x1, USBIN   ;1 [57] <-- sample stuffed bit 6
  192.     ori     shift, 0x40 ;1 [58]
  193.     nop                        ;1 [59]
  194.     rjmp    didUnstuff6 ;1 [60];2 [60]

  195. ; extra jobs done during bit interval:
  196. ; bit 0:    store, clear [SE0 is unreliable here due to bit dribbling in hubs]
  197. ; bit 1:    se0 check
  198. ; bit 2:    overflow check
  199. ; bit 3:    recovery from delay [bit 0 tasks took too long]
  200. ; bit 4:    none
  201. ; bit 5:    none
  202. ; bit 6:    none
  203. ; bit 7:    jump, eor
  204. rxLoop:
  205.     eor     x3, shift   ;1 [0] reconstruct: x3 is 0 at bit locations we changed, 1 at others
  206.     in      x1, USBIN   ;1 [1] <-- sample bit 0
  207.     nop                        ;1 [2]
  208.     st      y+, x3      ;1 [3];2 [3] store data
  209.     ser     x3          ;1 [4]
  210.     nop                 ;1 [5]
  211.     eor     x2, x1      ;1 [6]
  212.     bst     x2, USBMINUS;1 [7]
  213.     bld     shift, 0    ;1 [8]
  214.     in      x2, USBIN   ;1 [9] <-- sample bit 1 (or possibly bit 0 stuffed)
  215.     andi    x2, USBMASK ;1 [10]
  216.     breq    se0         ;1 [11] SE0 check for bit 1
  217.     andi    shift, 0xf9 ;1 [12]
  218. didUnstuff0:
  219.     breq    unstuff0    ;1 [13]
  220.     eor     x1, x2      ;1 [14]
  221.     bst     x1, USBMINUS;1 [15]
  222.     bld     shift, 1    ;1 [16]
  223. rxbit2:
  224.     in      x1, USBIN   ;1 [17] <-- sample bit 2 (or possibly bit 1 stuffed)
  225.     andi    shift, 0xf3 ;1 [18]
  226.     breq    unstuff1    ;1 [19] do remaining work for bit 1
  227. didUnstuff1:
  228.     subi    cnt, 1      ;1 [20]
  229.     brcs    overflow    ;1 [21] loop control
  230.     eor     x2, x1      ;1 [22]
  231.     bst     x2, USBMINUS;1 [23]
  232.     bld     shift, 2    ;1 [24]
  233.     in      x2, USBIN   ;1 [25] <-- sample bit 3 (or possibly bit 2 stuffed)
  234.     andi    shift, 0xe7 ;1 [26]
  235.     breq    unstuff2    ;1 [27]
  236. didUnstuff2:
  237.     eor     x1, x2      ;1 [28]
  238.     bst     x1, USBMINUS;1 [29]
  239.     bld     shift, 3    ;1 [30]
  240. didUnstuff3:
  241.     andi    shift, 0xcf ;1 [31]
  242.     breq    unstuff3    ;1 [32]
  243.     in      x1, USBIN   ;1 [33] <-- sample bit 4
  244.     eor     x2, x1      ;1 [34]
  245.     bst     x2, USBMINUS;1 [35]
  246.     bld     shift, 4    ;1 [36]
  247. didUnstuff4:
  248.     andi    shift, 0x9f ;1 [37]
  249.     breq    unstuff4    ;1 [38]
  250.     nop2                ;2 [40]
  251.     in      x2, USBIN   ;1 [41] <-- sample bit 5
  252.     eor     x1, x2      ;1 [42]
  253.     bst     x1, USBMINUS;1 [43]
  254.     bld     shift, 5    ;1 [44]
  255. didUnstuff5:
  256.     andi    shift, 0x3f ;1 [45]
  257.     breq    unstuff5    ;1 [46]
  258.     nop2                ;2 [48]
  259.     in      x1, USBIN   ;1 [49] <-- sample bit 6
  260.     eor     x2, x1      ;1 [50]
  261.     bst     x2, USBMINUS;1 [51]
  262.     bld     shift, 6    ;1 [52]
  263. didUnstuff6:
  264.     cpi     shift, 0x02 ;1 [53]
  265.     brlo    unstuff6    ;1 [54]
  266.     nop2                ;2 [56]
  267.     in      x2, USBIN   ;1 [57] <-- sample bit 7
  268.     eor     x1, x2      ;1 [58]
  269.     bst     x1, USBMINUS;1 [59]
  270.     bld     shift, 7    ;1 [60]
  271. didUnstuff7:
  272.     cpi     shift, 0x04 ;1 [61]
  273.     brsh    rxLoop      ;2 [63] loop control
  274. unstuff7:
  275.     andi    x3, ~0x80   ;1 [63]
  276.     ori     shift, 0x80 ;1 [64]
  277.     in      x2, USBIN   ;1 [65] <-- sample stuffed bit 7
  278.     nop2                ;2 [67];1 [66]
  279.     rjmp    didUnstuff7 ;1 [68];2 [68]

  280. macro POP_STANDARD ; 12 cycles
  281.     pop     cnt
  282.     pop     x3
  283.     pop     x2
  284.     pop     x1
  285.     pop     shift
  286.     pop     YH
  287.     endm
  288. macro POP_RETI     ; 5 cycles
  289.         pop                x5
  290.     pop     YL
  291.     out     SREG, YL
  292.     pop     YL
  293.     endm

  294. #include "asmcommon.inc"

  295. ;----------------------------------------------------------------------------
  296. ; Transmitting data
  297. ;----------------------------------------------------------------------------

  298. txByteLoop:
  299. txBitloop:
  300. stuffN1Delay:                   ;     [03]
  301.     ror     shift               ;[-5] [11] [59]
  302.     brcc    doExorN1            ;[-4]      [60]
  303.     subi    x4, 1               ;[-3]
  304.     brne    commonN1            ;[-2]
  305.     lsl     shift               ;[-1] compensate ror after rjmp stuffDelay
  306.     nop                         ;[00] stuffing consists of just waiting 8 cycles
  307.         nop
  308.     rjmp    stuffN1Delay        ;[01] after ror, C bit is reliably clear

  309. sendNakAndReti:                 ;0 [-19] 19 cycles until SOP
  310.     ldi     x3, USBPID_NAK      ;1 [-18]
  311.     nop                                ;1 [-17]
  312.     rjmp    usbSendX3           ;1;[-16];2 [-16]
  313. sendAckAndReti:                 ;0 [-19] 19 cycles until SOP
  314.     ldi     x3, USBPID_ACK      ;1 [-18]
  315.     nop                                ;1 [-17]
  316.     rjmp    usbSendX3           ;1 [-16];2 [-16]
  317. sendCntAndReti:                 ;0 [-17] 17 cycles until SOP
  318.     nop
  319.         mov     x3, cnt             ;1 [-16]
  320. usbSendX3:                      ;0 [-16]
  321.     ldi     YL, 20              ;1 [-15] 'x3' is R20
  322.     ldi     YH, 0               ;1 [-14]
  323.     ldi     cnt, 2              ;1 [-13]
  324. ;   rjmp    usbSendAndReti      fallthrough

  325. ; USB spec says:
  326. ; idle = J
  327. ; J = (D+ = 0), (D- = 1) or USBOUT = 0x01
  328. ; K = (D+ = 1), (D- = 0) or USBOUT = 0x02
  329. ; Spec allows 7.5 bit times from EOP to SOP for replies (= 60 cycles)

  330. ;usbSend:
  331. ;pointer to data in 'Y'
  332. ;number of bytes in 'cnt' -- including sync byte
  333. ;uses: x1...x2, x4, shift, cnt, Y [x1 = mirror USBOUT, x2 = USBMASK, x4 = bitstuff cnt]
  334. ;Numbers in brackets are time since first bit of sync pattern is sent (start of instruction)
  335. usbSendAndReti:
  336.     in      x2, USBDDR          ;[-12] 12 cycles until SOP
  337.     ori     x2, USBMASK         ;[-11]
  338.     sbi     USBOUT, USBMINUS    ;[-10] prepare idle state; D+ and D- must have been 0 (no pullups)
  339.     nop                                ;[-9]
  340.     out     USBDDR, x2          ;[-8] <--- acquire bus
  341.     in      x1, USBOUT          ;[-7] port mirror for tx loop
  342.     ldi     shift, 0x40         ;[-6] sync byte is first byte sent (we enter loop after ror)
  343.     ldi     x2, USBMASK         ;[-5]
  344.     push    x4                  ;[-4]
  345.     nop                                ;[-3]
  346. doExorN1:
  347.     eor     x1, x2              ;[-2] [06] [62]
  348.     ldi     x4, 6               ;[-1] [07] [63]
  349. commonN1:
  350. stuffN2Delay:
  351.     out     USBOUT, x1          ;[00] [08] [64] <--- set bit
  352.     ror     shift               ;[01]
  353.     brcc    doExorN2            ;[02]
  354.     subi    x4, 1               ;[03]
  355.     brne    commonN2            ;[04]
  356.     lsl     shift               ;[05] compensate ror after rjmp stuffDelay
  357.     nop                                ;[06]
  358.     rjmp    stuffN2Delay        ;[07];[06] after ror, C bit is reliably clear
  359. doExorN2:
  360.     eor     x1, x2              ;[04] [12]
  361.     ldi     x4, 6               ;[05] [13]
  362. commonN2:
  363.     nop                         ;[06] [14]
  364.     subi    cnt, 171            ;[07] [15] trick: (3 * 171) & 0xff = 1
  365.     out     USBOUT, x1          ;[08] [16] <--- set bit
  366.     brcs    txBitloop           ;[09]      [25] [41]

  367. stuff6Delay:
  368.     ror     shift               ;[42] [50]
  369.     brcc    doExor6             ;[43]
  370.     subi    x4, 1               ;[44]
  371.     brne    common6             ;[45]
  372.     lsl     shift               ;[46] compensate ror after rjmp stuffDelay
  373.     nop2                        ;[48] stuffing consists of just waiting 8 cycles
  374.     rjmp    stuff6Delay         ;[49] after ror, C bit is reliably clear
  375. doExor6:
  376.     eor     x1, x2              ;[45] [53]
  377.     ldi     x4, 6               ;[46]
  378. common6:
  379. stuff7Delay:
  380.     ror     shift               ;[47] [55]
  381.     out     USBOUT, x1          ;[48] <--- set bit
  382.     brcc    doExor7             ;[49]
  383.     subi    x4, 1               ;[50]
  384.     brne    common7             ;[51]
  385.     lsl     shift               ;[52] compensate ror after rjmp stuffDelay
  386.         nop
  387.     rjmp    stuff7Delay         ;[53] after ror, C bit is reliably clear
  388. doExor7:
  389.     eor     x1, x2              ;[51] [59]
  390.     ldi     x4, 6               ;[52]
  391. common7:
  392.     ld      shift, y+           ;[53]
  393.     nop                                                        ;[54]
  394.     tst     cnt                 ;[55];[55]
  395.     out     USBOUT, x1          ;[56];[56] <--- set bit
  396.     ;brne     txByteLoop                        ;[57]
  397.     breq    makeSE0                                ;[57]
  398.     rjmp    txByteLoop          ;[58]

  399. makeSE0:
  400. ;make SE0:
  401.     cbr     x1, USBMASK         ;[59] prepare SE0 [spec says EOP may be 15 to 18 cycles]
  402.     lds     x2, usbNewDeviceAddr;[60]
  403.     lsl     x2                  ;[62] we compare with left shifted address
  404.     subi    YL, 2 + 20          ;[63] Only assign address on data packets, not ACK/NAK in x3
  405.     out     USBOUT, x1          ;[00] <-- out SE0 -- from now 2 bits = 16 cycles until bus idle
  406.     sbci    YH, 0               ;[01]
  407. ;2006-03-06: moved transfer of new address to usbDeviceAddr from C-Code to asm:
  408. ;set address only after data packet was sent, not after handshake
  409.     breq    skipAddrAssign      ;[02]
  410.     sts     usbDeviceAddr, x2   ; if not skipped: SE0 is one cycle longer
  411. skipAddrAssign:
  412. ;end of usbDeviceAddress transfer
  413.     ldi     x2, 1<<USB_INTR_PENDING_BIT;[04] int0 occurred during TX -- clear pending flag
  414.     USB_STORE_PENDING(x2)       ;[05]
  415.     ori     x1, USBIDLE         ;[06]
  416.     in      x2, USBDDR          ;[07]
  417.     cbr     x2, USBMASK         ;[08] set both pins to input
  418.     mov     x3, x1              ;[09]
  419.     cbr     x3, USBMASK         ;[10] configure no pullup on both pins
  420.     pop     x4                  ;[11]
  421.     nop2                        ;[12]
  422.     nop2                        ;[14]
  423.     out     USBOUT, x1          ;[16] <-- out J (idle) -- end of SE0 (EOP signal)
  424.     out     USBDDR, x2          ;[17] <-- release bus now
  425.     out     USBOUT, x3          ;[18] <-- ensure no pull-up resistors are active
  426.     rjmp    doReturn

  427. ;延时8个时钟周期从调用到返回
  428. ;rcall delay8                        ;[0] [8]
  429. ;xxx        ;[0]
  430. #if USB_CFG_CLOCK_KHZ == 24000
  431. delay8:
  432.         nop                                                ;[1] [9]
  433.         nop                                                ;[2] [10]
  434.         nop                                                ;[3] [11]
  435.         nop                                                ;[4] [12]
  436.         nop                                                ;[1] [9]
  437.         ret                                                ;[6] [14]
  438. #endif
复制代码
只为测速度这个也许还能用
不过跑32m用这种代码有些浪费了, 最好从usbdrvasm18-crc.inc类似的文件移植
之前测试内部rc在常温下还是很稳定的 不过温度如果变化大些就会出问题

我的想法刚好相反用PL2303+LGT完成编程器, 波特率到5000kbps或1mbps 这个速度是vusb不能比的
目前用上面这种方案使用swim协议读stm8 8kflash只要500多ms swim还是跑在低速位格式

出0入0汤圆

 楼主| 发表于 2013-7-13 12:25:16 | 显示全部楼层
goodcode 发表于 2013-7-13 11:57
只为测速度这个也许还能用
不过跑32m用这种代码有些浪费了, 最好从usbdrvasm18-crc.inc类似的文件移植
之前 ...

没错。确实V-USB速度快不了。不过PL-2303焊接有点难度。当然在linux下兼容性不错。win下就不知道了……
另外就是我没有移植32M的。用的16M分频而已。我尽量弄个原生32M CRC的。
LGT8F88A貌似进中断比标准AVR和08A慢一点。所以你的12M代码不能用。应该这个:
  1. /* Name: usbdrvasm12.inc
  2. * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers
  3. * Author: Christian Starkjohann
  4. * Creation Date: 2004-12-29
  5. * Tabsize: 4
  6. * Copyright: (c) 2007 by OBJECTIVE DEVELOPMENT Software GmbH
  7. * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt)
  8. * This Revision: $Id$
  9. */

  10. /* Do not link this file! Link usbdrvasm.S instead, which includes the
  11. * appropriate implementation!
  12. */

  13. /*
  14. General Description:
  15. This file is the 12 MHz version of the asssembler part of the USB driver. It
  16. requires a 12 MHz crystal (not a ceramic resonator and not a calibrated RC
  17. oscillator).

  18. See usbdrv.h for a description of the entire driver.

  19. Since almost all of this code is timing critical, don't change unless you
  20. really know what you are doing! Many parts require not only a maximum number
  21. of CPU cycles, but even an exact number of cycles!


  22. Timing constraints according to spec (in bit times):
  23. timing subject                                      min max    CPUcycles
  24. ---------------------------------------------------------------------------
  25. EOP of OUT/SETUP to sync pattern of DATA0 (both rx) 2   16     16-128
  26. EOP of IN to sync pattern of DATA0 (rx, then tx)    2   7.5    16-60
  27. DATAx (rx) to ACK/NAK/STALL (tx)                    2   7.5    16-60
  28. */

  29. ;Software-receiver engine. Strict timing! Don't change unless you can preserve timing!
  30. ;interrupt response time: 4 cycles + insn running = 7 max if interrupts always enabled
  31. ;max allowable interrupt latency: 34 cycles -> max 25 cycles interrupt disable
  32. ;max stack usage: [ret(2), YL, SREG, YH, shift, x1, x2, x3, cnt, x4] = 11 bytes
  33. ;Numbers in brackets are maximum cycles since SOF.
  34. USB_INTR_VECTOR:
  35.         nop
  36. ;order of registers pushed: YL, SREG [sofError], YH, shift, x1, x2, x3, cnt
  37.     push    YL              ;2 [35] push only what is necessary to sync with edge ASAP
  38.     in      YL, SREG        ;1 [37]
  39.     push    YL              ;2 [39]
  40. ;----------------------------------------------------------------------------
  41. ; Synchronize with sync pattern:
  42. ;----------------------------------------------------------------------------
  43. ;sync byte (D-) pattern LSb to MSb: 01010100 [1 = idle = J, 0 = K]
  44. ;sync up with J to K edge during sync pattern -- use fastest possible loops
  45. ;The first part waits at most 1 bit long since we must be in sync pattern.
  46. ;YL is guarenteed to be < 0x80 because I flag is clear. When we jump to
  47. ;waitForJ, ensure that this prerequisite is met.
  48. waitForJ:
  49.     inc     YL
  50.     //in                YL,         USBIN
  51.     sbis    USBIN,         USBMINUS
  52.     brne    waitForJ        ; just make sure we have ANY timeout
  53. waitForK:
  54. ;The following code results in a sampling window of 1/4 bit which meets the spec.
  55.     //in                YL,         USBIN
  56.     sbis    USBIN,         USBMINUS
  57.     rjmp    foundK
  58.     //in                YL,         USBIN
  59.     sbis    USBIN,         USBMINUS
  60.     rjmp    foundK
  61.     //in                YL,         USBIN
  62.     sbis    USBIN, USBMINUS
  63.     rjmp    foundK
  64.     //in                YL,         USBIN
  65.     sbis    USBIN,         USBMINUS
  66.     rjmp    foundK
  67.     //in                YL,         USBIN
  68.     sbis    USBIN,         USBMINUS
  69.     rjmp    foundK
  70. #if USB_COUNT_SOF
  71.     lds     YL, usbSofCount
  72.     inc     YL
  73.     sts     usbSofCount, YL
  74. #endif  /* USB_COUNT_SOF */
  75. #ifdef USB_SOF_HOOK
  76.     USB_SOF_HOOK
  77. #endif
  78.     rjmp    sofError
  79. foundK:
  80. ;{3, 5} after falling D- edge, average delay: 4 cycles [we want 4 for center sampling]
  81. ;we have 1 bit time for setup purposes, then sample again. Numbers in brackets
  82. ;are cycles from center of first sync (double K) bit after the instruction
  83.     push    YH                          ;1 [1]
  84.         push        x1                                                ;1 [2]
  85.     lds     YL, usbInputBufOffset        ;2 [4]
  86.     clr     YH                          ;1 [5]
  87.     subi    YL, lo8(-(usbRxBuf))        ;1 [6]
  88.     sbci    YH, hi8(-(usbRxBuf))        ;1 [7]

  89.         in      x1,    USBIN                        ;1 [8]
  90.         sbrs        x1,    USBMINUS                        ;1 [9]
  91.     ;sbis    USBIN, USBMINUS ;1 [8] we want two bits K [sample 1 cycle too early]
  92.     rjmp    haveTwoBitsK                    ;1 [10]
  93.     pop     x1
  94.     pop     YH                                     ;1 [11] undo the push from before
  95.     rjmp    waitForK                        ;1 [12] this was not the end of sync, retry
  96. haveTwoBitsK:
  97. ;----------------------------------------------------------------------------
  98. ; push more registers and initialize values while we sample the first bits:
  99. ;----------------------------------------------------------------------------
  100.         pop                x1                                                ;1 [10]
  101.     push    shift                                  ;1 [11];2 [16]
  102.     push    x1                              ;1 [12];2 [12]
  103.     push    x2                                     ;1 [13];2 [14]
  104.     nop                                                    ;2 [15]
  105.     nop
  106.     nop                                                            ;1 [16]

  107.     in      x1, USBIN       ;1 [17] <-- sample bit 0
  108.     ldi     shift, 0xff     ;1 [18]
  109.     bst     x1, USBMINUS    ;1 [19]
  110.     bld     shift, 0        ;1 [20]
  111.     push    x3              ;1 [21];2 [22]
  112.     push    cnt             ;1 [22];2 [24]
  113.     nop                    ;2 [24]
  114.     nop
  115.    
  116.     in      x2, USBIN       ;1 [25] <-- sample bit 1
  117.     ser     x3              ;1 [26] [inserted init instruction]
  118.     eor     x1, x2          ;1 [27]
  119.     bst     x1, USBMINUS    ;1 [28]
  120.     bld     shift, 1        ;1 [29]
  121.     ldi     cnt, USB_BUFSIZE;1 [30] [inserted init instruction]
  122.     nop                            ;1 [31]
  123.     rjmp    rxbit2          ;1 [32];2[32]

  124. ;----------------------------------------------------------------------------
  125. ; Receiver loop (numbers in brackets are cycles within byte after instr)
  126. ;----------------------------------------------------------------------------

  127. unstuff0:               ;1 (branch taken)
  128.     andi    x3, ~0x01   ;1 [15]
  129.     mov     x1, x2      ;1 [16] x2 contains last sampled (stuffed) bit
  130.     in      x2, USBIN   ;1 [17] <-- sample bit 1 again
  131.     ori     shift, 0x01 ;1 [18]
  132.     nop                        ;1 [19]
  133.     rjmp    didUnstuff0 ;1 [20];2 [20]

  134. unstuff1:               ;1 (branch taken)
  135.     mov     x2, x1      ;1 [21] x1 contains last sampled (stuffed) bit
  136.     andi    x3, ~0x02   ;1 [22]
  137.     ori     shift, 0x02 ;1 [23]
  138.     nop                 ;1 [24]
  139.     in      x1, USBIN   ;1 [25] <-- sample bit 2 again
  140.     nop                        ;1 [26]
  141.     rjmp    didUnstuff1 ;1 [27];2 [27]

  142. unstuff2:               ;1 (branch taken)
  143.     andi    x3, ~0x04   ;1 [29]
  144.     ori     shift, 0x04 ;1 [30]
  145.     mov     x1, x2      ;1 [31] x2 contains last sampled (stuffed) bit
  146.     nop                 ;1 [32]
  147.     in      x2, USBIN   ;1 [33] <-- sample bit 3
  148.     nop                        ;1 [34]
  149.     rjmp    didUnstuff2 ;1 [35];2 [35]

  150. unstuff3:               ;1 (branch taken)
  151.     in      x2, USBIN   ;1 [34] <-- sample stuffed bit 3 [one cycle too late]
  152.     andi    x3, ~0x08   ;1 [35]
  153.     ori     shift, 0x08 ;1 [36]
  154.     nop                        ;1 [37]
  155.     rjmp    didUnstuff3 ;1 [38];2 [38]

  156. unstuff4:               ;1 (branch taken)
  157.     andi    x3, ~0x10   ;1 [40]
  158.     in      x1, USBIN   ;1 [41] <-- sample stuffed bit 4
  159.     ori     shift, 0x10 ;1 [42]
  160.     nop                        ;1 [43]
  161.     rjmp    didUnstuff4 ;1 [44];2 [44]

  162. unstuff5:               ;1 (branch taken)
  163.     andi    x3, ~0x20   ;1 [48]
  164.     in      x2, USBIN   ;1 [49] <-- sample stuffed bit 5
  165.     ori     shift, 0x20 ;1 [50]
  166.     nop                        ;1 [51]
  167.     rjmp    didUnstuff5 ;1 [52];2 [52]

  168. unstuff6:               ;1 (branch taken)
  169.     andi    x3, ~0x40   ;1 [56]
  170.     in      x1, USBIN   ;1 [57] <-- sample stuffed bit 6
  171.     ori     shift, 0x40 ;1 [58]
  172.     nop                        ;1 [59]
  173.     rjmp    didUnstuff6 ;1 [60];2 [60]

  174. ; extra jobs done during bit interval:
  175. ; bit 0:    store, clear [SE0 is unreliable here due to bit dribbling in hubs]
  176. ; bit 1:    se0 check
  177. ; bit 2:    overflow check
  178. ; bit 3:    recovery from delay [bit 0 tasks took too long]
  179. ; bit 4:    none
  180. ; bit 5:    none
  181. ; bit 6:    none
  182. ; bit 7:    jump, eor
  183. rxLoop:
  184.     eor     x3, shift   ;1 [0] reconstruct: x3 is 0 at bit locations we changed, 1 at others
  185.     in      x1, USBIN   ;1 [1] <-- sample bit 0
  186.     nop                        ;1 [2]
  187.     st      y+, x3      ;1 [3];2 [3] store data
  188.     ser     x3          ;1 [4]
  189.     nop                 ;1 [5]
  190.     eor     x2, x1      ;1 [6]
  191.     bst     x2, USBMINUS;1 [7]
  192.     bld     shift, 0    ;1 [8]
  193.     in      x2, USBIN   ;1 [9] <-- sample bit 1 (or possibly bit 0 stuffed)
  194.     andi    x2, USBMASK ;1 [10]
  195.     breq    se0         ;1 [11] SE0 check for bit 1
  196.     andi    shift, 0xf9 ;1 [12]
  197. didUnstuff0:
  198.     breq    unstuff0    ;1 [13]
  199.     eor     x1, x2      ;1 [14]
  200.     bst     x1, USBMINUS;1 [15]
  201.     bld     shift, 1    ;1 [16]
  202. rxbit2:
  203.     in      x1, USBIN   ;1 [17] <-- sample bit 2 (or possibly bit 1 stuffed)
  204.     andi    shift, 0xf3 ;1 [18]
  205.     breq    unstuff1    ;1 [19] do remaining work for bit 1
  206. didUnstuff1:
  207.     subi    cnt, 1      ;1 [20]
  208.     brcs    overflow    ;1 [21] loop control
  209.     eor     x2, x1      ;1 [22]
  210.     bst     x2, USBMINUS;1 [23]
  211.     bld     shift, 2    ;1 [24]
  212.     in      x2, USBIN   ;1 [25] <-- sample bit 3 (or possibly bit 2 stuffed)
  213.     andi    shift, 0xe7 ;1 [26]
  214.     breq    unstuff2    ;1 [27]
  215. didUnstuff2:
  216.     eor     x1, x2      ;1 [28]
  217.     bst     x1, USBMINUS;1 [29]
  218.     bld     shift, 3    ;1 [30]
  219. didUnstuff3:
  220.     andi    shift, 0xcf ;1 [31]
  221.     breq    unstuff3    ;1 [32]
  222.     in      x1, USBIN   ;1 [33] <-- sample bit 4
  223.     eor     x2, x1      ;1 [34]
  224.     bst     x2, USBMINUS;1 [35]
  225.     bld     shift, 4    ;1 [36]
  226. didUnstuff4:
  227.     andi    shift, 0x9f ;1 [37]
  228.     breq    unstuff4    ;1 [38]
  229.     nop                ;2 [40]
  230.     nop
  231.     in      x2, USBIN   ;1 [41] <-- sample bit 5
  232.     eor     x1, x2      ;1 [42]
  233.     bst     x1, USBMINUS;1 [43]
  234.     bld     shift, 5    ;1 [44]
  235. didUnstuff5:
  236.     andi    shift, 0x3f ;1 [45]
  237.     breq    unstuff5    ;1 [46]
  238.     nop                ;2 [48]
  239.     nop
  240.     in      x1, USBIN   ;1 [49] <-- sample bit 6
  241.     eor     x2, x1      ;1 [50]
  242.     bst     x2, USBMINUS;1 [51]
  243.     bld     shift, 6    ;1 [52]
  244. didUnstuff6:
  245.     cpi     shift, 0x02 ;1 [53]
  246.     brlo    unstuff6    ;1 [54]
  247.     nop                ;2 [56]
  248.     nop
  249.     in      x2, USBIN   ;1 [57] <-- sample bit 7
  250.     eor     x1, x2      ;1 [58]
  251.     bst     x1, USBMINUS;1 [59]
  252.     bld     shift, 7    ;1 [60]
  253. didUnstuff7:
  254.     cpi     shift, 0x04 ;1 [61]
  255.     brsh    rxLoop      ;2 [63] loop control
  256. unstuff7:
  257.     andi    x3, ~0x80   ;1 [63]
  258.     ori     shift, 0x80 ;1 [64]
  259.     in      x2, USBIN   ;1 [65] <-- sample stuffed bit 7
  260.     nop                ;2 [67];1 [66]
  261.     nop
  262.     rjmp    didUnstuff7 ;1 [68];2 [68]

  263. macro POP_STANDARD ; 12 cycles
  264.     pop     cnt
  265.     pop     x3
  266.     pop     x2
  267.     pop     x1
  268.     pop     shift
  269.     pop     YH
  270.     endm
  271. macro POP_RETI     ; 5 cycles
  272.     pop     YL
  273.     out     SREG, YL
  274.     pop     YL
  275.     endm

  276. #include "asmcommon.inc"

  277. ;----------------------------------------------------------------------------
  278. ; Transmitting data
  279. ;----------------------------------------------------------------------------

  280. txByteLoop:
  281. txBitloop:
  282. stuffN1Delay:                   ;     [03]
  283.     ror     shift               ;[-5] [11] [59]
  284.     brcc    doExorN1            ;[-4]      [60]
  285.     subi    x4, 1               ;[-3]
  286.     brne    commonN1            ;[-2]
  287.     lsl     shift               ;[-1] compensate ror after rjmp stuffDelay
  288.     nop                         ;[00] stuffing consists of just waiting 8 cycles
  289.     rjmp    stuffN1Delay        ;[01] after ror, C bit is reliably clear

  290. sendNakAndReti:                 ;0 [-19] 19 cycles until SOP
  291.     ldi     x3, USBPID_NAK      ;1 [-18]
  292.     nop                                ;1 [-17]
  293.     rjmp    usbSendX3           ;1;[-16];2 [-16]
  294. sendAckAndReti:                 ;0 [-19] 19 cycles until SOP
  295.     ldi     x3, USBPID_ACK      ;1 [-18]
  296.     nop                                ;1 [-17]
  297.     rjmp    usbSendX3           ;1 [-16];2 [-16]
  298. sendCntAndReti:                 ;0 [-17] 17 cycles until SOP
  299.     mov     x3, cnt             ;1 [-16]
  300. usbSendX3:                      ;0 [-16]
  301.     ldi     YL, 20              ;1 [-15] 'x3' is R20
  302.     ldi     YH, 0               ;1 [-14]
  303.     ldi     cnt, 2              ;1 [-13]
  304. ;   rjmp    usbSendAndReti      fallthrough

  305. ; USB spec says:
  306. ; idle = J
  307. ; J = (D+ = 0), (D- = 1) or USBOUT = 0x01
  308. ; K = (D+ = 1), (D- = 0) or USBOUT = 0x02
  309. ; Spec allows 7.5 bit times from EOP to SOP for replies (= 60 cycles)

  310. ;usbSend:
  311. ;pointer to data in 'Y'
  312. ;number of bytes in 'cnt' -- including sync byte
  313. ;uses: x1...x2, x4, shift, cnt, Y [x1 = mirror USBOUT, x2 = USBMASK, x4 = bitstuff cnt]
  314. ;Numbers in brackets are time since first bit of sync pattern is sent (start of instruction)
  315. usbSendAndReti:
  316.     in      x2, USBDDR          ;[-12] 12 cycles until SOP
  317.     ori     x2, USBMASK         ;[-11]
  318.     sbi     USBOUT, USBMINUS    ;[-10] prepare idle state; D+ and D- must have been 0 (no pullups)
  319.     nop                                ;[-9]
  320.     out     USBDDR, x2          ;[-8] <--- acquire bus
  321.     in      x1, USBOUT          ;[-7] port mirror for tx loop
  322.     ldi     shift, 0x40         ;[-6] sync byte is first byte sent (we enter loop after ror)
  323.     ldi     x2, USBMASK         ;[-5]
  324.     push    x4                  ;[-4]
  325.     nop                                ;[-3]
  326. doExorN1:
  327.     eor     x1, x2              ;[-2] [06] [62]
  328.     ldi     x4, 6               ;[-1] [07] [63]
  329. commonN1:
  330. stuffN2Delay:
  331.     out     USBOUT, x1          ;[00] [08] [64] <--- set bit
  332.     ror     shift               ;[01]
  333.     brcc    doExorN2            ;[02]
  334.     subi    x4, 1               ;[03]
  335.     brne    commonN2            ;[04]
  336.     lsl     shift               ;[05] compensate ror after rjmp stuffDelay
  337.     nop                                ;[06]
  338.     rjmp    stuffN2Delay        ;[07];[06] after ror, C bit is reliably clear
  339. doExorN2:
  340.     eor     x1, x2              ;[04] [12]
  341.     ldi     x4, 6               ;[05] [13]
  342. commonN2:
  343.     nop                         ;[06] [14]
  344.     subi    cnt, 171            ;[07] [15] trick: (3 * 171) & 0xff = 1
  345.     out     USBOUT, x1          ;[08] [16] <--- set bit
  346.     brcs    txBitloop           ;[09]      [25] [41]

  347. stuff6Delay:
  348.     ror     shift               ;[42] [50]
  349.     brcc    doExor6             ;[43]
  350.     subi    x4, 1               ;[44]
  351.     brne    common6             ;[45]
  352.     lsl     shift               ;[46] compensate ror after rjmp stuffDelay
  353.     nop                        ;[48] stuffing consists of just waiting 8 cycles
  354.     nop
  355.     rjmp    stuff6Delay         ;[49] after ror, C bit is reliably clear
  356. doExor6:
  357.     eor     x1, x2              ;[45] [53]
  358.     ldi     x4, 6               ;[46]
  359. common6:
  360. stuff7Delay:
  361.     ror     shift               ;[47] [55]
  362.     out     USBOUT, x1          ;[48] <--- set bit
  363.     brcc    doExor7             ;[49]
  364.     subi    x4, 1               ;[50]
  365.     brne    common7             ;[51]
  366.     lsl     shift               ;[52] compensate ror after rjmp stuffDelay
  367.     rjmp    stuff7Delay         ;[53] after ror, C bit is reliably clear
  368. doExor7:
  369.     eor     x1, x2              ;[51] [59]
  370.     ldi     x4, 6               ;[52]
  371. common7:
  372.     ld      shift, y+           ;[53]
  373.     nop                                                        ;[54]
  374.     tst     cnt                 ;[55];[55]
  375.     out     USBOUT, x1          ;[56];[56] <--- set bit
  376.     ;brne     txByteLoop                        ;[57]
  377.     breq    makeSE0                                ;[57]
  378.     rjmp    txByteLoop          ;[58]

  379. makeSE0:
  380. ;make SE0:
  381.     cbr     x1, USBMASK         ;[59] prepare SE0 [spec says EOP may be 15 to 18 cycles]
  382.     lds     x2, usbNewDeviceAddr;[60]
  383.     lsl     x2                  ;[62] we compare with left shifted address
  384.     subi    YL, 2 + 20          ;[63] Only assign address on data packets, not ACK/NAK in x3
  385.     out     USBOUT, x1          ;[00] <-- out SE0 -- from now 2 bits = 16 cycles until bus idle
  386.     sbci    YH, 0               ;[01]
  387. ;2006-03-06: moved transfer of new address to usbDeviceAddr from C-Code to asm:
  388. ;set address only after data packet was sent, not after handshake
  389.     breq    skipAddrAssign      ;[02]
  390.     sts     usbDeviceAddr, x2   ; if not skipped: SE0 is one cycle longer
  391. skipAddrAssign:
  392. ;end of usbDeviceAddress transfer
  393.     ldi     x2, 1<<USB_INTR_PENDING_BIT;[04] int0 occurred during TX -- clear pending flag
  394.     USB_STORE_PENDING(x2)       ;[05]
  395.     ori     x1, USBIDLE         ;[06]
  396.     in      x2, USBDDR          ;[07]
  397.     cbr     x2, USBMASK         ;[08] set both pins to input
  398.     mov     x3, x1              ;[09]
  399.     cbr     x3, USBMASK         ;[10] configure no pullup on both pins
  400.     pop     x4                  ;[11]
  401.     nop                        ;[12]
  402.     nop
  403.     nop                        ;[14]
  404.     nop
  405.     out     USBOUT, x1          ;[16] <-- out J (idle) -- end of SE0 (EOP signal)
  406.     out     USBDDR, x2          ;[17] <-- release bus now
  407.     out     USBOUT, x3          ;[18] <-- ensure no pull-up resistors are active
  408.     rjmp    doReturn
复制代码

出0入0汤圆

 楼主| 发表于 2013-7-13 12:25:34 | 显示全部楼层
本帖最后由 xwkm 于 2013-7-13 12:42 编辑

现在sbic/sbis指令可以正确使用了。
但是IRC能够成功起来custom的设备。作为HID或者传输大量数据就傻眼了。无法枚举成功。

出0入0汤圆

发表于 2013-7-13 13:12:24 | 显示全部楼层
xwkm 发表于 2013-7-13 12:25
现在sbic/sbis指令可以正确使用了。
但是IRC能够成功起来custom的设备。作为HID或者传输大量数据就傻眼了。 ...

1. 大量数据传输用外部晶振就OK了, 内部的话只有直接上32M RC测试下。

2. 与08A相比, 中断并没有什么变化, 主要是读PORT值和08A不同, 因为88A本身做了同步,可以直接用SBIC/SBIS,
    而用之前08A的先读到R里面,然后SBRC/SBRS, 每一个就要比08A慢1.5个周期了。 所以直接改成SBIC/SBIS就通过了。

出0入0汤圆

发表于 2013-7-13 13:33:59 | 显示全部楼层
汇编啊…………………………

出0入0汤圆

 楼主| 发表于 2013-7-13 13:56:10 | 显示全部楼层
LGT 发表于 2013-7-13 13:12
1. 大量数据传输用外部晶振就OK了, 内部的话只有直接上32M RC测试下。

2. 与08A相比, 中断并没有什么 ...

我还想用IRC做Bootloader呢。

出0入0汤圆

发表于 2013-7-13 14:59:08 | 显示全部楼层
xwkm 发表于 2013-7-13 12:25
现在sbic/sbis指令可以正确使用了。
但是IRC能够成功起来custom的设备。作为HID或者传输大量数据就傻眼了。 ...

大量数据出错应该就是时序读取还是有问题的
usb转串口芯片好像就那个最便宜了 windows xp下用windows api进行操作还没问题 win7就不知道了
期待楼主和lgt官方的与08a芯片的区别 这样用88A的时候很快就能上手了

出0入0汤圆

 楼主| 发表于 2013-7-13 15:26:41 | 显示全部楼层
本帖最后由 xwkm 于 2013-7-13 15:27 编辑
goodcode 发表于 2013-7-13 14:59
大量数据出错应该就是时序读取还是有问题的
usb转串口芯片好像就那个最便宜了 windows xp下用windows api ...


出错问题找到了:16M的文件少同步了一次。修复了。
区别有:
sbis/sbic指令可以用了。
进中断慢一个周期。
工程片5V触摸有点问题。
切换外振的时候注意操作时序,先使能PMCE后再去操作。保证周期限制。
现在正在用烙铁和冰块测IRC稳定性。就是烙铁靠近然后试USB传输稳定。
另外就是中断切换终于有了。现在做bootloader就要简单和稳定不少了,不过手册有一处描述错误。应该是对齐到512字节。
问过官方,他们说切换后偏移地址不会变。

出0入0汤圆

发表于 2013-7-13 16:21:43 | 显示全部楼层
xwkm 发表于 2013-7-13 15:26
出错问题找到了:16M的文件少同步了一次。修复了。
区别有:
sbis/sbic指令可以用了。

进中断慢一个周期。 是不是中断向量表中rjmp编程jmp了
现在正在用烙铁和冰块测IRC稳定性。就是烙铁靠近然后试USB传输稳定。 我也用这种方式测试 太山寨了 哈哈
还没去细看手册 能切换中断向量表真是太方便了
谢谢楼主分享

出0入0汤圆

 楼主| 发表于 2013-7-13 17:09:51 | 显示全部楼层
goodcode 发表于 2013-7-13 16:21
进中断慢一个周期。 是不是中断向量表中rjmp编程jmp了
现在正在用烙铁和冰块测IRC稳定性。就是烙铁靠近然 ...

不是。是中断处理哪里为了稳定多同步了一次。

出0入0汤圆

发表于 2013-7-13 17:32:45 | 显示全部楼层
xwkm 发表于 2013-7-13 00:37
目前我还没坏过一片……

好消息,谢谢啊

出0入0汤圆

发表于 2013-7-13 17:36:09 | 显示全部楼层
LGT 发表于 2013-7-13 10:11
楼上可以整几片LGT8F88A测试下, 看是不是和AVR一样皮实!:)

嗯,看来是要找个机会试一试

出0入0汤圆

发表于 2013-7-13 19:50:50 | 显示全部楼层
楼主是正在读高一的高中生,这个就算是你的暑假作业了?

好好努力,没考上大学直接就来我们公司上班。

出0入0汤圆

 楼主| 发表于 2013-7-13 20:10:57 | 显示全部楼层
logicgreen 发表于 2013-7-13 19:50
楼主是正在读高一的高中生,这个就算是你的暑假作业了?

好好努力,没考上大学直接就来我们公司上班。 ...

当然不是啦。我前十天一直在写作业。后面几天当然要好好休息下……

出0入0汤圆

发表于 2013-7-13 21:06:09 | 显示全部楼层
不知道现在的作业量多少, 我上学的时候十来天就糊弄完了 那玩意交了就行 根本没人看 呵呵
这个年龄,这样的主动性,如果环境好会是前途无量的

出0入0汤圆

 楼主| 发表于 2013-7-13 22:48:34 | 显示全部楼层
还是得写个32M的RC专门针对的汇编出来。自从被我烙铁处理后貌似频率调不准了。看来只能靠软件滑动补偿咯。

出0入0汤圆

 楼主| 发表于 2013-7-15 15:10:51 | 显示全部楼层
本帖最后由 xwkm 于 2013-7-15 15:12 编辑
goodcode 发表于 2013-7-13 21:06
不知道现在的作业量多少, 我上学的时候十来天就糊弄完了 那玩意交了就行 根本没人看 呵呵
这个年龄, ...


to goodcode。如果你有LGT8F88A的话。这个程序帮我测试下。我发现内置rc usb误码率有点高。

现在我在做兼容usbasp的bootloader。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2013-7-15 15:18:03 | 显示全部楼层
90999 发表于 2013-7-13 00:05
奇怪了,我十几年没撸了,怎么看东西还有重影啊?肯定是肾亏了。

不能同意的更多了。。。。

出0入0汤圆

发表于 2013-7-15 19:34:27 | 显示全部楼层
xwkm 发表于 2013-7-15 15:10
to goodcode。如果你有LGT8F88A的话。这个程序帮我测试下。我发现内置rc usb误码率有点高。

现在我在做 ...

我还没申请这个芯片... 你试试串口加上奇偶效验在高高波特率下有没有问题.

出0入0汤圆

 楼主| 发表于 2013-7-15 23:10:13 | 显示全部楼层
goodcode 发表于 2013-7-15 19:34
我还没申请这个芯片... 你试试串口加上奇偶效验在高高波特率下有没有问题. ...

串行口还好。出厂已经OSCCAL校准过了。现在的问题就是V-USB在内置rc下误码率比较高。
可能bootloader得换种方式实现。

出0入0汤圆

发表于 2013-7-16 00:10:11 | 显示全部楼层
串口室温下没问题证明内部rc还是稳定的

出0入0汤圆

 楼主| 发表于 2013-7-16 00:13:16 | 显示全部楼层
goodcode 发表于 2013-7-16 00:10
串口室温下没问题证明内部rc还是稳定的

不过在循环里翻转IO口的话。会出现这种状况。4MHz偶尔出现几个3.7MHz或者4.2MHz的波形。
这个串行口要求又没usb那么高。如果写usb boot不依赖晶振的话。必须做校验处理。

出0入0汤圆

发表于 2013-7-16 09:42:58 | 显示全部楼层
xwkm 发表于 2013-7-16 00:13
不过在循环里翻转IO口的话。会出现这种状况。4MHz偶尔出现几个3.7MHz或者4.2MHz的波形。
这个串行口要求 ...

建议你用PWM测试内部RC的频率, 用I/O翻转要保证程序不会被中断。
校准过后的RC频率是非常稳定的, 我测试了一些芯片, 都是非常稳定的。

出0入0汤圆

发表于 2013-7-16 10:35:54 | 显示全部楼层
不过在循环里翻转IO口的话。会出现这种状况。4MHz偶尔出现几个3.7MHz或者4.2MHz的波形。 不会这么不稳定吧
08a的工程样片也没这样啊 我一直用08a的内部rc测试vusb 因为工程样片的外部晶振有问题 调试麻烦

出0入0汤圆

 楼主| 发表于 2013-7-16 11:02:10 | 显示全部楼层
goodcode 发表于 2013-7-16 10:35
不过在循环里翻转IO口的话。会出现这种状况。4MHz偶尔出现几个3.7MHz或者4.2MHz的波形。 不会这么 ...

08A的16M IRC还能带起来USB?我没一次成功过。
至于那个问题可能是线太长。寄生振荡了吧。

出0入0汤圆

发表于 2013-7-16 13:19:49 | 显示全部楼层
我手里用过的08a的芯片 OSCCAL = 0x08; 跑vusb就可以了 室温20~30多度都没问题

如果rc没问题, 可以在*.inc分块插一些没用的io翻转用逻辑分析仪辅助查看usb的时序和内部代码处理到什么地方是慢了还是快了
说起来简单 调试起来挺麻烦的一个活

出0入0汤圆

 楼主| 发表于 2013-7-16 23:18:06 | 显示全部楼层
goodcode 发表于 2013-7-16 13:19
我手里用过的08a的芯片 OSCCAL = 0x08; 跑vusb就可以了 室温20~30多度都没问题

如果rc没问题, 可以在*.inc ...

08A的我自己写过用信标校准的程序。也用外振校准内部rc。但是死活V-USB就没起来过。

出0入0汤圆

发表于 2013-7-17 01:16:02 | 显示全部楼层
xwkm 发表于 2013-7-16 23:18
08A的我自己写过用信标校准的程序。也用外振校准内部rc。但是死活V-USB就没起来过。 ...

我测的5,6片都ok

出0入0汤圆

 楼主| 发表于 2013-7-17 10:35:06 | 显示全部楼层
RP不高。Bootloader custom协议完成。现在可以只接usb。外部一个 1.5k 电阻就能够通讯了。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 03:54

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表