📄 twi.lst
字号:
310 00ec E091 0000 lds r30,strTWI+4
311 00f0 F091 0000 lds r31,(strTWI+4)+1
312 00f4 8191 ld r24,Z+
313 00f6 F093 0000 sts (strTWI+4)+1,r31
314 00fa E093 0000 sts strTWI+4,r30
315 00fe 83B9 out 35-0x20,r24
133:twi.c **** strTWI.DATALEN--;
317 .LM29:
318 0100 8091 0000 lds r24,strTWI+6
319 0104 9091 0000 lds r25,(strTWI+6)+1
320 0108 0197 sbiw r24,1
321 010a 9093 0000 sts (strTWI+6)+1,r25
322 010e 8093 0000 sts strTWI+6,r24
134:twi.c **** state=ST_WDATA-1; //下一步将跳到WDATA分支
324 .LM30:
325 0112 46E0 ldi r20,lo8(6)
135:twi.c **** TWCR=TW_ACT; //触发下一步动作
327 .LM31:
328 0114 85E8 ldi r24,lo8(-123)
329 0116 60C0 rjmp .L45
330 .L17:
136:twi.c **** }
137:twi.c **** }
138:twi.c **** else
139:twi.c **** {//发送eeprom地址出错
140:twi.c **** state=ST_FAIL;
141:twi.c **** }
142:twi.c **** break;
143:twi.c **** case ST_RESTART: //RESTART状态检查,只有读操作模式才能跳到这里
144:twi.c **** if(status==TW_REP_START)
332 .LM32:
333 0118 2031 cpi r18,lo8(16)
334 011a 09F0 breq .+2
335 011c 51C0 rjmp .L37
336 .L48:
145:twi.c **** {//发送restart信号成功
146:twi.c **** TWDR=strTWI.SLA; //发器件地址读SLAR
338 .LM33:
339 011e 33B9 out 35-0x20,r19
340 0120 46C0 rjmp .L43
341 .L20:
147:twi.c **** TWCR=TW_ACT; //触发下一步动作,同时清start发送标志
148:twi.c **** }
149:twi.c **** else
150:twi.c **** {//重发start信号出错
151:twi.c **** state=ST_FAIL;
152:twi.c **** }
153:twi.c **** break;
154:twi.c **** case ST_SLAR: //SLAR状态检查,只有读操作模式才能跳到这里
155:twi.c **** if(status==TW_MR_SLA_ACK)
343 .LM34:
344 0122 2034 cpi r18,lo8(64)
345 0124 09F0 breq .+2
346 0126 4CC0 rjmp .L37
347 0128 0DC0 rjmp .L47
348 .L25:
156:twi.c **** {//发送器件地址成功
157:twi.c **** if (strTWI.DATALEN--)
158:twi.c **** {//多个数据
159:twi.c **** TWCR=(1<<TWEA)|TW_ACT; //设定ACK,触发下一步动作
160:twi.c **** }
161:twi.c **** else
162:twi.c **** {//只有一个数据
163:twi.c **** TWCR=TW_ACT; //设定NAK,触发下一步动作
164:twi.c **** }
165:twi.c **** }
166:twi.c **** else
167:twi.c **** {//发送器件地址出错
168:twi.c **** state=ST_FAIL;
169:twi.c **** }
170:twi.c **** break;
171:twi.c **** case ST_RDATA: //读取数据状态检查,只有读操作模式才能跳到这里
172:twi.c **** state--; //循环,直到读完指定长度数据
350 .LM35:
351 012a 4150 subi r20,lo8(-(-1))
173:twi.c **** if(status==TW_MR_DATA_ACK)
353 .LM36:
354 012c 2035 cpi r18,lo8(80)
355 012e C1F4 brne .L26
174:twi.c **** {//读取数据成功,但不是最后一个数据
175:twi.c **** *strTWI.pBUF++=TWDR;
357 .LM37:
358 0130 E091 0000 lds r30,strTWI+4
359 0134 F091 0000 lds r31,(strTWI+4)+1
360 0138 83B1 in r24,35-0x20
361 013a 8193 st Z+,r24
362 013c F093 0000 sts (strTWI+4)+1,r31
363 0140 E093 0000 sts strTWI+4,r30
364 .L47:
176:twi.c **** if (strTWI.DATALEN--)
366 .LM38:
367 0144 8091 0000 lds r24,strTWI+6
368 0148 9091 0000 lds r25,(strTWI+6)+1
369 014c 0197 sbiw r24,1
370 014e 9093 0000 sts (strTWI+6)+1,r25
371 0152 8093 0000 sts strTWI+6,r24
372 0156 8F5F subi r24,lo8(-1)
373 0158 9F4F sbci r25,hi8(-1)
374 015a 49F1 breq .L43
177:twi.c **** {//还有多个数据
178:twi.c **** TWCR=(1<<TWEA)|TW_ACT; //设定ACK,触发下一步动作
376 .LM39:
377 015c 85EC ldi r24,lo8(-59)
378 015e 28C0 rjmp .L44
379 .L26:
179:twi.c **** }
180:twi.c **** else
181:twi.c **** {//准备读最后一个数据
182:twi.c **** TWCR=TW_ACT; //设定NAK,触发下一步动作
183:twi.c **** }
184:twi.c **** }
185:twi.c **** else if(status==TW_MR_DATA_NACK)
381 .LM40:
382 0160 2835 cpi r18,lo8(88)
383 0162 71F5 brne .L37
186:twi.c **** {//已经读完最后一个数据
187:twi.c **** *strTWI.pBUF++=TWDR;
385 .LM41:
386 0164 E091 0000 lds r30,strTWI+4
387 0168 F091 0000 lds r31,(strTWI+4)+1
388 016c 83B1 in r24,35-0x20
389 016e 8193 st Z+,r24
390 0170 F093 0000 sts (strTWI+4)+1,r31
391 0174 E093 0000 sts strTWI+4,r30
392 0178 1DC0 rjmp .L34
393 .L32:
188:twi.c **** TWCR=(1<<TWSTO)|TW_ACT; //发送停止信号,不会再产生中断了
189:twi.c **** strTWI.STATUS=TW_OK;
190:twi.c **** }
191:twi.c **** else
192:twi.c **** {//读取数据出错
193:twi.c **** state=ST_FAIL;
194:twi.c **** }
195:twi.c **** break;
196:twi.c **** case ST_WDATA: //写数据状态检查,只有写操作模式才能跳到这里
197:twi.c **** state--; //循环,直到写完指定长度数据
395 .LM42:
396 017a 4150 subi r20,lo8(-(-1))
198:twi.c **** if(status==TW_MT_DATA_ACK)
398 .LM43:
399 017c 2832 cpi r18,lo8(40)
400 017e 01F5 brne .L37
199:twi.c **** {//写数据成功
200:twi.c **** if (strTWI.DATALEN)
402 .LM44:
403 0180 2091 0000 lds r18,strTWI+6
404 0184 3091 0000 lds r19,(strTWI+6)+1
405 0188 2115 cp r18,__zero_reg__
406 018a 3105 cpc r19,__zero_reg__
407 018c 99F0 breq .L34
201:twi.c **** {//还要写
202:twi.c **** TWDR=*strTWI.pBUF++;
409 .LM45:
410 018e E091 0000 lds r30,strTWI+4
411 0192 F091 0000 lds r31,(strTWI+4)+1
412 0196 8191 ld r24,Z+
413 0198 F093 0000 sts (strTWI+4)+1,r31
414 019c E093 0000 sts strTWI+4,r30
415 01a0 83B9 out 35-0x20,r24
203:twi.c **** strTWI.DATALEN--;
417 .LM46:
418 01a2 2150 subi r18,lo8(-(-1))
419 01a4 3040 sbci r19,hi8(-(-1))
420 01a6 3093 0000 sts (strTWI+6)+1,r19
421 01aa 2093 0000 sts strTWI+6,r18
422 .L43:
204:twi.c **** TWCR=TW_ACT; //触发下一步动作
424 .LM47:
425 01ae 85E8 ldi r24,lo8(-123)
426 .L44:
427 01b0 86BF out 86-0x20,r24
428 01b2 08C0 rjmp .L5
429 .L34:
205:twi.c **** }
206:twi.c **** else
207:twi.c **** {//写够了
208:twi.c **** TWCR=(1<<TWSTO)|TW_ACT; //发送停止信号,不会再产生中断了
431 .LM48:
432 01b4 85E9 ldi r24,lo8(-107)
433 01b6 86BF out 86-0x20,r24
209:twi.c **** strTWI.STATUS=TW_OK;
435 .LM49:
436 01b8 81E0 ldi r24,lo8(1)
437 01ba 8093 0000 sts strTWI,r24
438 01be 02C0 rjmp .L5
439 .L37:
210:twi.c **** //启动写命令后需要10ms(最大)的编程时间才能真正的把数据记录下来
211:twi.c **** //编程期间器件不响应任何命令
212:twi.c **** }
213:twi.c **** }
214:twi.c **** else
215:twi.c **** {//写数据失败
216:twi.c **** state=ST_FAIL;
217:twi.c **** }
218:twi.c **** break;
219:twi.c **** default:
220:twi.c **** //错误状态
221:twi.c **** state=ST_FAIL;
441 .LM50:
442 01c0 40E0 ldi r20,lo8(0)
443 01c2 02C0 rjmp .L42
444 .L5:
222:twi.c **** break;
223:twi.c **** }
224:twi.c ****
225:twi.c **** if (state==ST_FAIL)
446 .LM51:
447 01c4 4423 tst r20
448 01c6 79F4 brne .L39
449 .L42:
226:twi.c **** {//错误处理
227:twi.c **** strTWI.FAILCNT++;
451 .LM52:
452 01c8 8091 0000 lds r24,strTWI+9
453 01cc 8F5F subi r24,lo8(-(1))
454 01ce 8093 0000 sts strTWI+9,r24
228:twi.c **** if (strTWI.FAILCNT<FAIL_MAX)
456 .LM53:
457 01d2 8A30 cpi r24,lo8(10)
458 01d4 18F4 brsh .L40
229:twi.c **** {//重试次数未超出最大值,
230:twi.c **** TWCR=(1<<TWSTA)|TW_ACT; //发生错误,启动start信号
460 .LM54:
461 01d6 85EA ldi r24,lo8(-91)
462 .L45:
463 01d8 86BF out 86-0x20,r24
464 01da 05C0 rjmp .L39
465 .L40:
231:twi.c **** }
232:twi.c **** else
233:twi.c **** {//否则停止
234:twi.c **** TWCR=(1<<TWSTO)|TW_ACT; //发送停止信号,不会再产生中断了
467 .LM55:
468 01dc 85E9 ldi r24,lo8(-107)
469 01de 86BF out 86-0x20,r24
235:twi.c **** strTWI.STATUS=TW_FAIL;
471 .LM56:
472 01e0 82E0 ldi r24,lo8(2)
473 01e2 8093 0000 sts strTWI,r24
474 .L39:
236:twi.c **** }
237:twi.c **** }
238:twi.c **** state++;
476 .LM57:
477 01e6 4F5F subi r20,lo8(-(1))
239:twi.c **** strTWI.STATE=state; //保存状态
479 .LM58:
480 01e8 4093 0000 sts strTWI+8,r20
481 .L3:
482 /* epilogue: frame size=0 */
483 01ec FF91 pop r31
484 01ee EF91 pop r30
485 01f0 9F91 pop r25
486 01f2 8F91 pop r24
487 01f4 5F91 pop r21
488 01f6 4F91 pop r20
489 01f8 3F91 pop r19
490 01fa 2F91 pop r18
491 01fc 0F90 pop __tmp_reg__
492 01fe 0FBE out __SREG__,__tmp_reg__
493 0200 0F90 pop __tmp_reg__
494 0202 1F90 pop __zero_reg__
495 0204 1895 reti
496 /* epilogue end (size=13) */
497 /* function __vector_17 size 228 (202) */
504 .Lscope1:
505 .comm strTWI,10,1
506 .comm Alarm,1,1
507 .comm BUFFER,10,1
511 .text
513 Letext:
514 /* File "twi.c": code 262 = 0x0106 ( 236), prologues 13, epilogues 13 */
DEFINED SYMBOLS
*ABS*:00000000 twi.c
C:\DOCUME~1\64564564\LOCALS~1\Temp/cck9aaaa.s:3 *ABS*:0000003f __SREG__
C:\DOCUME~1\64564564\LOCALS~1\Temp/cck9aaaa.s:4 *ABS*:0000003e __SP_H__
C:\DOCUME~1\64564564\LOCALS~1\Temp/cck9aaaa.s:5 *ABS*:0000003d __SP_L__
C:\DOCUME~1\64564564\LOCALS~1\Temp/cck9aaaa.s:6 *ABS*:00000000 __tmp_reg__
C:\DOCUME~1\64564564\LOCALS~1\Temp/cck9aaaa.s:7 *ABS*:00000001 __zero_reg__
C:\DOCUME~1\64564564\LOCALS~1\Temp/cck9aaaa.s:132 .text:00000000 TWI_RW
*COM*:0000000a strTWI
C:\DOCUME~1\64564564\LOCALS~1\Temp/cck9aaaa.s:194 .text:00000044 __vector_17
*COM*:00000001 Alarm
*COM*:0000000a BUFFER
C:\DOCUME~1\64564564\LOCALS~1\Temp/cck9aaaa.s:513 .text:00000206 Letext
UNDEFINED SYMBOLS
__do_copy_data
__do_clear_bss
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -