📄 xmodem.lst
字号:
(0223) send_a_byte(ENTER); //发送回车,测试模块
7BE E00D LDI R16,0xD
7BF D044 RCALL _send_a_byte
(0224) Delay(500);
7C0 EF04 LDI R16,0xF4
7C1 E011 LDI R17,1
7C2 D248 RCALL _Delay
(0225)
(0226) receive_OK = 0;
7C3 2422 CLR R2
7C4 9220 021A STS receive_OK,R2
(0227) send_m_byte("at\r\n",4); //发送AT,测试模块
7C6 E024 LDI R18,4
7C7 E030 LDI R19,0
7C8 E206 LDI R16,0x26
7C9 E011 LDI R17,1
7CA D03D RCALL _send_m_byte
(0228) send_a_byte(ENTER);
7CB E00D LDI R16,0xD
7CC D037 RCALL _send_a_byte
7CD C005 RJMP 0x07D3
(0229)
(0230) while(receive_OK== 0)
(0231) {
(0232) send_a_byte(ENTER);
7CE E00D LDI R16,0xD
7CF D034 RCALL _send_a_byte
(0233) Delay(1000);
7D0 EE08 LDI R16,0xE8
7D1 E013 LDI R17,3
7D2 D238 RCALL _Delay
7D3 9020 021A LDS R2,receive_OK
7D5 2022 TST R2
7D6 F3B9 BEQ 0x07CE
(0234) }
(0235) receive_RING=0;
7D7 2422 CLR R2
7D8 9220 0212 STS receive_RING,R2
(0236) receive_CLIP=0;
7DA 9220 0211 STS receive_CLIP,R2
7DC C025 RJMP 0x0802
(0237) while(1)
(0238) {
(0239) Delay(10);
7DD E00A LDI R16,0xA
7DE E010 LDI R17,0
7DF D22B RCALL _Delay
7E0 C019 RJMP 0x07FA
(0240)
(0241) while((receive_RING==1)&&(receive_CLIP==1))
(0242) { Delay(10);
7E1 E00A LDI R16,0xA
7E2 E010 LDI R17,0
7E3 D227 RCALL _Delay
(0243)
(0244) receive_OK = 0;
7E4 2422 CLR R2
7E5 9220 021A STS receive_OK,R2
(0245) send_m_byte("ath\r\n",5);
7E7 E025 LDI R18,5
7E8 E030 LDI R19,0
7E9 E200 LDI R16,0x20
7EA E011 LDI R17,1
7EB D01C RCALL _send_m_byte
(0246) while(receive_OK == 0) ;
7EC 9020 021A LDS R2,receive_OK
7EE 2022 TST R2
7EF F3E1 BEQ 0x07EC
(0247) Xmodem();
7F0 D2BD RCALL _Xmodem
(0248)
(0249) Delay(10);
7F1 E00A LDI R16,0xA
7F2 E010 LDI R17,0
7F3 D217 RCALL _Delay
(0250) mms_atsent();
7F4 D233 RCALL _mms_atsent
(0251)
(0252) receive_RING=0;
7F5 2422 CLR R2
7F6 9220 0212 STS receive_RING,R2
(0253) receive_CLIP=0;
7F8 9220 0211 STS receive_CLIP,R2
7FA 9180 0212 LDS R24,receive_RING
7FC 3081 CPI R24,1
7FD F421 BNE 0x0802
7FE 9180 0211 LDS R24,receive_CLIP
800 3081 CPI R24,1
801 F2F9 BEQ 0x07E1
802 CFDA RJMP 0x07DD
803 9508 RET
(0254) }
(0255) }
(0256)
(0257)
(0258)
(0259) }
(0260)
(0261)
(0262)
(0263)
(0264) void send_a_byte( unsigned char data )
(0265) {
(0266) /* 等待发送缓冲器为空 */
(0267) while ( !( UCSRA & (1<<UDRE)) )
_send_a_byte:
data --> R16
804 9B5D SBIS 0x0B,5
805 CFFE RJMP _send_a_byte
(0268) ;
(0269) /* 将数据放入缓冲器,发送数据 */
(0270) UDR = data;
806 B90C OUT 0x0C,R16
807 9508 RET
_send_m_byte:
i --> R20
length --> R10
string --> R12
808 940E 0B45 CALL push_xgset303C
80A 0159 MOVW R10,R18
80B 0168 MOVW R12,R16
(0271) }
(0272) /*unsigned char USART_Receive( void )
(0273) {
(0274) //等待接收数据
(0275) while ( !(UCSRA & (1<<RXC)) )
(0276) ;
(0277) // 从缓冲器中获取并返回数据
(0278) return UDR;
(0279) }*/
(0280)
(0281) void send_m_byte(uchar *string, uint length)
(0282) {
(0283) uint i; //发送多字节
(0284) for(i = 0; i< length; i++)
80C 2744 CLR R20
80D 2755 CLR R21
80E C007 RJMP 0x0816
(0285) {
(0286) send_a_byte(string[i]);
80F 01FA MOVW R30,R20
810 0DEC ADD R30,R12
811 1DFD ADC R31,R13
812 8100 LDD R16,Z+0
813 DFF0 RCALL _send_a_byte
814 5F4F SUBI R20,0xFF
815 4F5F SBCI R21,0xFF
816 154A CP R20,R10
817 055B CPC R21,R11
818 F3B0 BCS 0x080F
819 940C 0B4C JMP pop_xgset303C
(0287) }
(0288) }
(0289)
(0290) uchar xModemSend(uchar *temp_data, uint length)
(0291) {
(0292) *temp_data = 0;
_xModemSend:
length --> R18
temp_data --> R16
81B 2422 CLR R2
81C 01F8 MOVW R30,R16
81D 8220 STD Z+0,R2
(0293) length = 0;
81E 2722 CLR R18
81F 2733 CLR R19
(0294) return 0;
820 2700 CLR R16
821 9508 RET
_tx_packet:
attempt --> R22
checksum --> R14
buffer_index --> R12
temp_char --> R20
packet_data_buffer --> R10
packet_number --> Y,+10
822 940E 0B2A CALL push_arg4
824 940E 0B3A CALL push_xgsetF0FC
826 0159 MOVW R10,R18
827 854E LDD R20,Y+14
(0295) }
(0296)
(0297)
(0298) // 信息包序号 包里面的数据 收接收方反回来的信息
(0299) uchar tx_packet(uchar packet_number,uchar * packet_data_buffer, uchar temp_char )
(0300) {
(0301) uchar attempt;
(0302) uint checksum;
(0303) uchar buffer_index;
(0304) for(attempt = 1; attempt <= MAX_TX_TRY; attempt++)
828 E061 LDI R22,1
829 C046 RJMP 0x0870
(0305) {
(0306) checksum= 0; //校验和为0
82A 24EE CLR R14
82B 24FF CLR R15
(0307) send_a_byte(SOH); // send start of packet(sending标志中断发送)
82C E001 LDI R16,1
82D DFD6 RCALL _send_a_byte
(0308) send_a_byte(packet_number); //发送信息包序号
82E 850A LDD R16,Y+10
82F DFD4 RCALL _send_a_byte
(0309) send_a_byte(255 - packet_number); //发送信息包序号的补码
830 842A LDD R2,Y+10
831 2433 CLR R3
832 EF0F LDI R16,0xFF
833 1902 SUB R16,R2
834 0913 SBC R17,R3
835 DFCE RCALL _send_a_byte
(0310) //以下为发送数据
(0311) for(buffer_index = 0; buffer_index < PACKET_DATA_BUFFER_LENGTH; buffer_index++)
836 24CC CLR R12
837 C01A RJMP 0x0852
(0312) {
(0313) send_a_byte(packet_data_buffer[buffer_index]); //发送128个字节
838 2DEC MOV R30,R12
839 27FF CLR R31
83A 0DEA ADD R30,R10
83B 1DFB ADC R31,R11
83C 8100 LDD R16,Z+0
83D DFC6 RCALL _send_a_byte
(0314) if (temp_char == NAK) //接收方返回NAK则发送方要得传
83E 3145 CPI R20,0x15
83F F449 BNE 0x0849
(0315) checksum += packet_data_buffer[buffer_index]; //计算校验和
840 2DEC MOV R30,R12
841 27FF CLR R31
842 0DEA ADD R30,R10
843 1DFB ADC R31,R11
844 8020 LDD R2,Z+0
845 2433 CLR R3
846 0CE2 ADD R14,R2
847 1CF3 ADC R15,R3
848 C008 RJMP 0x0851
(0316) else
(0317) checksum = update_CRC(packet_data_buffer[buffer_index], checksum); //CRC校验和
849 0197 MOVW R18,R14
84A 2DEC MOV R30,R12
84B 27FF CLR R31
84C 0DEA ADD R30,R10
84D 1DFB ADC R31,R11
84E 8100 LDD R16,Z+0
84F D159 RCALL _update_CRC
850 0178 MOVW R14,R16
851 94C3 INC R12
852 2D8C MOV R24,R12
853 3880 CPI R24,0x80
854 F318 BCS 0x0838
(0318) }
(0319) if (temp_char == ASCII_C) //如果收到C
855 3443 CPI R20,0x43
856 F441 BNE 0x085F
(0320) { send_a_byte((uchar)((checksum>>8) & 0x00ff));
857 0187 MOVW R16,R14
858 2F01 MOV R16,R17
859 2711 CLR R17
85A 7010 ANDI R17,0
85B DFA8 RCALL _send_a_byte
(0321) send_a_byte((uchar)(checksum & 0x00ff));
85C 2D0E MOV R16,R14
85D 7010 ANDI R17,0
85E DFA5 RCALL _send_a_byte
(0322) } // send end of packet CRC
(0323) temp_char0=0;
85F 2422 CLR R2
860 9220 0094 STS temp_char0,R2
(0324) while(temp_char0 == 0);
862 9020 0094 LDS R2,temp_char0
864 2022 TST R2
865 F3E1 BEQ 0x0862
(0325) temp_char =temp_char0; // get receiver response
866 2D42 MOV R20,R2
(0326)
(0327) if (temp_char == CAN)
867 3148 CPI R20,0x18
868 F411 BNE 0x086B
(0328) return 0; // reception cancelled
869 2700 CLR R16
86A C00A RJMP 0x0875
(0329) if (temp_char == ACK)
86B 3046 CPI R20,6
86C F411 BNE 0x086F
(0330) return 1; // packet received okay
86D E001 LDI R16,1
86E C006 RJMP 0x0875
86F 9563 INC R22
870 E083 LDI R24,3
871 1786 CP R24,R22
872 F008 BCS 0x0874
873 CFB6 RJMP 0x082A
(0331) }
(0332) return 0; // attempts exhausted
874 2700 CLR R16
875 940E 0B2F CALL pop_xgsetF0FC
877 9624 ADIW R28,4
878 9508 RET
_send_packet_data:
no_more --> R10
Xmodem_Pack22 --> Y,+1
packet_number --> R20
temp_char --> R10
j --> Y,+132
xModem --> R22
i --> R12
LEN --> Y,+146
User_Data --> Y,+144
879 940E 0B2A CALL push_arg4
87B 940E 0B3A CALL push_xgsetF0FC
87D 97EF SBIW R28,0x3F
87E 97EF SBIW R28,0x3F
87F 9728 SBIW R28,0x8
(0333) }
(0334)
(0335) /*
(0336) function: 以XMODEM 发送数据
(0337) in: user_data 是数据指针
(0338) out: 1 sucess
(0339) o faile
(0340) 使用全局变量? 无
(0341)
(0342) */
(0343)
(0344) uchar send_packet_data(uchar const *User_Data , uint LEN)
(0345) {
(0346) struct Message Xmodem_Pack22;
(0347) struct Message *xModem;
(0348)
(0349) uint i,j=0;
880 2400 CLR R0
881 2411 CLR R1
882 01FE MOVW R30,R28
883 57EC SUBI R30,0x7C
884 4FFF SBCI R31,0xFF
885 8211 STD Z+1,R1
886 8200 STD Z+0,R0
(0350) unsigned char packet_number = 1;
887 E041 LDI R20,1
(0351) unsigned char no_more = 0;
888 24AA CLR R10
(0352) unsigned char temp_char = 0;
(0353) xModem=&Xmodem_Pack22;
889 01BE MOVW R22,R28
88A 5F6F SUBI R22,0xFF
88B 4F7F SBCI R23,0xFF
(0354) xModem->User_Data=0;
88C 2422 CLR R2
88D 2433 CLR R3
88E 01FB MOVW R30,R22
88F 57EF SUBI R30,0x7F
890 4FFF SBCI R31,0xFF
891 8231 STD Z+1,R3
892 8220 STD Z+0,R2
893 C007 RJMP 0x089B
(0355) // xModem->User_Data=User_Data;
(0356) //只要没有收到ACK(crc校验) 和NAK(校验和)信号就一直在这里等
(0357) while((temp_char != ASCII_C) && (temp_char != NAK))
(0358) {
(0359) temp_char = temp_char0;// wait till receiver ready(从这里知道temp_char存的是接收方返回来的信息)
894 90A0 0094 LDS R10,temp_char0
(0360) if(temp_char == CAN)
896 2D8A MOV R24,R10
897 3188 CPI R24,0x18
898 F411 BNE 0x089B
(0361) return 0;
899 2700 CLR R16
89A C0F0 RJMP 0x098B
89B 2D8A MOV R24,R10
89C 3483 CPI R24,0x43
89D F011 BEQ 0x08A0
89E 3185 CPI R24,0x15
89F F7A1 BNE 0x0894
(0362) }
(0363)
(0364) if (LEN < PACKET_DATA_BUFFER_LENGTH) // 数据区段的长度固定为 128 字节
8A0 01FE MOVW R30,R28
8A1 56EE SUBI R30,0x6E
8A2 4FFF SBCI R31,0xFF
8A3 8180 LDD R24,Z+0
8A4 8191 LDD R25,Z+1
8A5 3880 CPI R24,0x80
8A6 E0E0 LDI R30,0
8A7 079E CPC R25,R30
8A8 F008 BCS 0x08AA
8A9 C045 RJMP 0x08EF
(0365) {
(0366) for(i=0;i<LEN;i++)
8AA 24CC CLR R12
8AB 24DD CLR R13
8AC C01E RJMP 0x08CB
(0367) xModem->Message[i]=(User_Data[j++]);
8AD 01FE MOVW R30,R28
8AE 57EC SUBI R30,0x7C
8AF 4FFF SBCI R31,0xFF
8B0 8020 LDD R2,Z+0
8B1 8031 LDD R3,Z+1
8B2 01C1 MOVW R24,R2
8B3 9601 ADIW R24,1
8B4 01FE MOVW R30,R28
8B5 57EC SUBI R30,0x7C
8B6 4FFF SBCI R31,0xFF
8B7 8391 STD Z+1,R25
8B8 8380 STD Z+0,R24
8B9 01F1 MOVW R30,R2
8BA 01DE MOVW R26,R28
8BB 57A0 SUBI R26,0x70
8BC 4FBF SBCI R27,0xFF
8BD 900D LD R0,X+
8BE 901C LD R1,255(X)
8BF 0DE0 ADD R30,R0
8C0 1DF1 ADC R31,R1
8C1 9024 LPM R2,255(Z)
8C2 01CB MOVW R24,R22
8C3 9601 ADIW R24,1
8C4 01F6 MOVW R30,R12
8C5 0FE8 ADD R30,R24
8C6 1FF9 ADC R31,R25
8C7 8220 STD Z+0,R2
8C8 01C6 MOVW R24,R12
8C9 9601 ADIW R24,1
8CA 016C MOVW R12,R24
8CB 01FE MOVW R30,R28
8CC 56EE SUBI R30,0x6E
8CD 4FFF SBCI R31,0xFF
8CE 8000 LDD R0,Z+0
8CF 8011 LDD R1,Z+1
8D0 14C0 CP R12,R0
8D1 04D1 CPC R13,R1
8D2 F2D0 BCS 0x08AD
(0368) for(i=LEN;i<128;i++)
8D3 0160 MOVW R12,R0
8D4 C00A RJMP 0x08DF
(0369) xModem->Message[i]=CTRL_Z;
8D5 01CB MOVW R24,R22
8D6 9601 ADIW R24,1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -