?? 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 + -