|
发表于 2012-8-29 19:17:29
|
显示全部楼层
SPI的速度 我猜芯片是工作在16m二分频 理论上应该是2m 实际测试超过1.6m就不能进入编程模式了 测试发现在isp模式可能会读取rc校准值 也就是说spi的速度在临界的状态 可能因为rc的校准值进入不了编程模式
写入数据是比较繁琐的 我也不知道那些命令的目的是干什么的 可能是为了稳定性的考虑
ROM:09AE ; 写flash
ROM:09AE ; r20(低),r21(高) 目标地址
ROM:09AE ; r18(低),r19(高) 缓存地址
ROM:09AE ; r22(低),r23(高) 写入字节数
ROM:09AE ; r24 flash类型 1:eeprom
ROM:09AE ; 一次命令的最大长度小于128 否则出现错误
ROM:09AE
ROM:09AE IspWriteFlash: ; CODE XREF: sub_A87+17p
ROM:09AE ; sub_A87+21p ...
ROM:09AE 922F push r2
ROM:09AF 923F push r3
ROM:09B0 924F push r4
ROM:09B1 925F push r5
ROM:09B2 926F push r6
ROM:09B3 927F push r7
ROM:09B4 928F push r8
ROM:09B5 929F push r9
ROM:09B6 92AF push r10
ROM:09B7 92BF push r11
ROM:09B8 92CF push r12
ROM:09B9 92DF push r13
ROM:09BA 92EF push r14
ROM:09BB 92FF push r15
ROM:09BC 930F push r16
ROM:09BD 931F push r17
ROM:09BE 93DF push r29
ROM:09BF 93CF push r28
ROM:09C0 D000 rcall loc_9C1
ROM:09C1
ROM:09C1 loc_9C1:
ROM:09C1 920F push r0
ROM:09C2 B7CD in r28, SPL ; 保存sp到 r28,r29
ROM:09C3 B7DE in r29, SPH
ROM:09C4 017B movw r14, r22 ; 写入字节数->r14,r15
ROM:09C5 013A movw r6, r20 ; 目标地址->r6,r7
ROM:09C6 2F12 mov r17, r18 ; 缓存地址(低)->r17
ROM:09C7 2F03 mov r16, r19 ; 缓存地址(高)->r18
ROM:09C8 2E58 mov r5, r24 ; 取flash类型到r5
ROM:09C9 9452 swap r5
ROM:09CA 0C55 lsl r5
ROM:09CB EE50 ldi r21, -0x20 ; ' ; 0xe0
ROM:09CC 2255 and r5, r21 ; r5 flash命令
ROM:09CD E021 ldi r18, 1
ROM:09CE 1652 cp r5, r18 ; r5永远不可能为1?
ROM:09CF F411 brne loc_9D2 ; 如果 r5 <> 1跳转
ROM:09D0 940E 090C call ispBeginProgramming ; 操作开始?, 无返回值 MOSI 0xE5 0x53 0x35 0x5E 0x00
ROM:09D2
ROM:09D2 loc_9D2: ; CODE XREF: IspWriteFlash+21j
ROM:09D2 2D85 mov r24, r5
ROM:09D3 6980 ori r24, -0x70 ; 90
ROM:09D4 01B3 movw r22, r6 ; 目标地址->r22,r23
ROM:09D5 E040 ldi r20, 0
ROM:09D6 E050 ldi r21, 0
ROM:09D7 940E 08AB call ispWriteFlashCmd ; r24=命令
ROM:09D7 ; r22(低),r23(高) 目标地址
ROM:09D7 ; r20(低),r21(高) 写入数据字(word)
ROM:09D7 ;
ROM:09D7 ; 无返回值
ROM:09D9 ED40 ldi r20, -0x30 ; ' ; D0
ROM:09DA 2E44 mov r4, r20
ROM:09DB 2845 or r4, r5 ; r5 flash命令
ROM:09DC 2D84 mov r24, r4 ; r4 与 d0 或的命令
ROM:09DD 01B3 movw r22, r6 ; 目标地址->r22,r23
ROM:09DE E040 ldi r20, 0
ROM:09DF E050 ldi r21, 0
ROM:09E0 940E 08AB call ispWriteFlashCmd ; r24=命令
ROM:09E0 ; r22(低),r23(高) 目标地址
ROM:09E0 ; r20(低),r21(高) 写入数据字(word)
ROM:09E0 ;
ROM:09E0 ; 无返回值
ROM:09E2 0117 movw r2, r14 ; 写入字节数->r2,r3
ROM:09E3 9436 lsr r3
ROM:09E4 9427 ror r2 ; 写入字节数/ 2 计算需要执行的flash读取命令次数
ROM:09E5 2F81 mov r24, r17 ; 缓存地址(低)->r24
ROM:09E6 2F90 mov r25, r16 ; 缓存地址(高)->r25
ROM:09E7 019C movw r18, r24 ; 缓存地址->r18,r19
ROM:09E8 0159 movw r10, r18 ; 缓存地址->r10,r11
ROM:09E9 0143 movw r8, r6 ; 目标地址->r8,r9
ROM:09EA 821B std Y+3, r1
ROM:09EB 821A std Y+2, r1
ROM:09EC 24CC clr r12
ROM:09ED 24DD clr r13
ROM:09EE 2D35 mov r19, r5 ; 取flash命令
ROM:09EF 6D38 ori r19, -0x28 ; 0xd8
ROM:09F0 8339 std Y+1, r19
ROM:09F1 C023 rjmp loc_A15
ROM:09F2 ; ---------------------------------------------------------------------------
ROM:09F2
ROM:09F2 loc_9F2: ; CODE XREF: IspWriteFlash+6Cj
ROM:09F2 01F5 movw r30, r10 ; 缓存地址->R30,R31 Z寄存器
ROM:09F3 80F1 ldd r15, Z+1 ; 装载数据高字节到r15
ROM:09F4 24EE clr r14 ; 清零r14
ROM:09F5 8180 ld r24, Z ; 装载数据低字节到r24
ROM:09F6 2F28 mov r18, r24 ; 数据低8位->r18
ROM:09F7 E030 ldi r19, 0
ROM:09F8 292E or r18, r14 ; r18数据低8位 r19数据高8位
ROM:09F9 293F or r19, r15
ROM:09FA 833B std Y+3, r19 ; 存储写入数据字到sram中
ROM:09FB 832A std Y+2, r18
ROM:09FC 2D84 mov r24, r4 ; cmd1 0xD0 | flashType
ROM:09FD 01B8 movw r22, r16 ; 目标地址
ROM:09FE 01A9 movw r20, r18 ; 写入数据字
ROM:09FF 940E 08AB call ispWriteFlashCmd ; r24=命令
ROM:09FF ; r22(低),r23(高) 目标地址
ROM:09FF ; r20(低),r21(高) 写入数据字(word)
ROM:09FF ;
ROM:09FF ; 无返回值
ROM:0A01 8189 ldd r24, Y+1 ; cmd2 0xD8 | flashType
ROM:0A02 01B8 movw r22, r16 ; 取目标地址
ROM:0A03 814A ldd r20, Y+2
ROM:0A04 815B ldd r21, Y+3
ROM:0A05 940E 08AB call ispWriteFlashCmd ; r24=命令
ROM:0A05 ; r22(低),r23(高) 目标地址
ROM:0A05 ; r20(低),r21(高) 写入数据字(word)
ROM:0A05 ;
ROM:0A05 ; 无返回值
ROM:0A07 2D84 mov r24, r4 ; cmd1 0xD0 | flashType
ROM:0A08 01B8 movw r22, r16 ; 取目标地址
ROM:0A09 814A ldd r20, Y+2
ROM:0A0A 815B ldd r21, Y+3
ROM:0A0B 940E 08AB call ispWriteFlashCmd ; r24=命令
ROM:0A0B ; r22(低),r23(高) 目标地址
ROM:0A0B ; r20(低),r21(高) 写入数据字(word)
ROM:0A0B ;
ROM:0A0B ; 无返回值
ROM:0A0D 9408 sec
ROM:0A0E 1CC1 adc r12, r1
ROM:0A0F 1CD1 adc r13, r1
ROM:0A10 E082 ldi r24, 2
ROM:0A11 E090 ldi r25, 0
ROM:0A12 0EA8 add r10, r24
ROM:0A13 1EB9 adc r11, r25
ROM:0A14 0148 movw r8, r16 ; 目标地址->r8, r9
ROM:0A15
ROM:0A15 loc_A15: ; CODE XREF: IspWriteFlash+43j
ROM:0A15 0186 movw r16, r12
ROM:0A16 0D06 add r16, r6
ROM:0A17 1D17 adc r17, r7
ROM:0A18 14C2 cp r12, r2
ROM:0A19 04D3 cpc r13, r3
ROM:0A1A F2B8 brcs loc_9F2 ; 开始写字(word)
ROM:0A1B 2D85 mov r24, r5 ; 取flash命令
ROM:0A1C 6580 ori r24, 0x50
ROM:0A1D 01B4 movw r22, r8
ROM:0A1E 814A ldd r20, Y+2
ROM:0A1F 815B ldd r21, Y+3
ROM:0A20 940E 08AB call ispWriteFlashCmd ; r24=命令
ROM:0A20 ; r22(低),r23(高) 目标地址
ROM:0A20 ; r20(低),r21(高) 写入数据字(word)
ROM:0A20 ;
ROM:0A20 ; 无返回值
ROM:0A22 2D85 mov r24, r5 ; 取flash命令
ROM:0A23 6180 ori r24, 0x10
ROM:0A24 01B4 movw r22, r8
ROM:0A25 814A ldd r20, Y+2
ROM:0A26 815B ldd r21, Y+3
ROM:0A27 940E 08AB call ispWriteFlashCmd ; r24=命令
ROM:0A27 ; r22(低),r23(高) 目标地址
ROM:0A27 ; r20(低),r21(高) 写入数据字(word)
ROM:0A27 ;
ROM:0A27 ; 无返回值
ROM:0A29 E080 ldi r24, 0
ROM:0A2A 01B4 movw r22, r8
ROM:0A2B 814A ldd r20, Y+2
ROM:0A2C 815B ldd r21, Y+3
ROM:0A2D 940E 08AB call ispWriteFlashCmd ; r24=命令
ROM:0A2D ; r22(低),r23(高) 目标地址
ROM:0A2D ; r20(低),r21(高) 写入数据字(word)
ROM:0A2D ;
ROM:0A2D ; 无返回值
ROM:0A2F 900F pop r0
ROM:0A30 900F pop r0
ROM:0A31 900F pop r0
ROM:0A32 91CF pop r28
ROM:0A33 91DF pop r29
ROM:0A34 911F pop r17
ROM:0A35 910F pop r16
ROM:0A36 90FF pop r15
ROM:0A37 90EF pop r14
ROM:0A38 90DF pop r13
ROM:0A39 90CF pop r12
ROM:0A3A 90BF pop r11
ROM:0A3B 90AF pop r10
ROM:0A3C 909F pop r9
ROM:0A3D 908F pop r8
ROM:0A3E 907F pop r7
ROM:0A3F 906F pop r6
ROM:0A40 905F pop r5
ROM:0A41 904F pop r4
ROM:0A42 903F pop r3
ROM:0A43 902F pop r2
ROM:0A44 9508 ret |
|