📄 tcxoboard.lst
字号:
(0057)
(0058) /**********************ATEEPROM读写过程*********************************
(0059) 字节写:Start→器件地址&W→应答→选ROM地址→应答→写数据→应答→Stop
(0060) 中断过程 START→MT_SLA_ACK→MT_DATA_ACK(地址)→MT_DATA_ACK(数据)(STOP中止)
(0061)
(0062) 页面写:Start→器件地址&W→应答→选ROM地址→应答→写数据→应答→写NEXT地址数据→应答→。。。写NEXT地址数据→应答→Stop
(0063) 中断过程 START→MT_SLA_ACK→MT_DATA_ACK(地址)→MT_DATA_ACK(数据)→MT_DATA_ACK(数据)→。。。MT_DATA_ACK(数据)(STOP中止)
(0064)
(0065) 字节读:Start→器件地址&W→应答→选ROM地址→应答→Restart→器件地址&R→应答→读数据→无应答→Stop
(0066) 中断过程 START→MT_SLA_ACK→MT_DATA_ACK(地址)→RE_START→MR_SLA_ACK→MR_DATA_NOACK(STOP中止)
(0067)
(0068) 页面读:Start→器件地址&W→应答→选ROM地址→应答→Restart→器件地址&R→应答→读数据→应答→读NEXT地址数据→应答→。。。读NEXT地址数据→无应答→Stop
(0069) 中断过程 START→MT_SLA_ACK→MT_DATA_ACK(地址)→RE_START→MR_SLA_ACK→MR_DATA_ACK→MR_DATA_ACK→。。。MR_DATA_NOACK(STOP中止)
(0070) *************************************************************************/
(0071)
(0072) #pragma interrupt_handler TWI_Ready:iv_TWI//TWI中断处理
(0073) void TWI_Ready(void)
(0074) {
(0075) switch (TestAck())//检查状态标志字
0340 B101 IN R16,0x01
0341 2711 CLR R17
0342 7F08 ANDI R16,0xF8
0343 7010 ANDI R17,0
0344 3108 CPI R16,0x18
0345 E0E0 LDI R30,0
0346 071E CPC R17,R30
0347 F191 BEQ 0x037A
0348 E188 LDI R24,0x18
0349 E090 LDI R25,0
034A 1780 CP R24,R16
034B 0791 CPC R25,R17
034C F074 BLT 0x035B
034D 3008 CPI R16,0x8
034E E0E0 LDI R30,0
034F 071E CPC R17,R30
0350 F0F9 BEQ 0x0370
0351 3008 CPI R16,0x8
0352 E0E0 LDI R30,0
0353 071E CPC R17,R30
0354 F40C BGE 0x0356
0355 C05E RJMP 0x03B4
0356 3100 CPI R16,0x10
0357 E0E0 LDI R30,0
0358 071E CPC R17,R30
0359 F0D9 BEQ 0x0375
035A C059 RJMP 0x03B4
035B 3400 CPI R16,0x40
035C E0E0 LDI R30,0
035D 071E CPC R17,R30
035E F409 BNE 0x0360
035F C048 RJMP 0x03A8
0360 E480 LDI R24,0x40
0361 E090 LDI R25,0
0362 1780 CP R24,R16
0363 0791 CPC R25,R17
0364 F02C BLT 0x036A
0365 3208 CPI R16,0x28
0366 E0E0 LDI R30,0
0367 071E CPC R17,R30
0368 F0B9 BEQ 0x0380
0369 C04A RJMP 0x03B4
036A 3508 CPI R16,0x58
036B E0E0 LDI R30,0
036C 071E CPC R17,R30
036D F409 BNE 0x036F
036E C03C RJMP 0x03AB
036F C044 RJMP 0x03B4
(0076) {
(0077) case START:
(0078) {
(0079) TWItransmit(wr_device_add);
0370 EA80 LDI R24,0xA0
0371 B983 OUT 0x03,R24
0372 E885 LDI R24,0x85
0373 BF86 OUT 0x36,R24
(0080) //选取I2C从器件地址,进行主控写模式
(0081) break;
0374 C041 RJMP 0x03B6
(0082) }
(0083) case RE_START:
(0084) {
(0085) TWItransmit(rd_device_add);
0375 EA81 LDI R24,0xA1
0376 B983 OUT 0x03,R24
0377 E885 LDI R24,0x85
0378 BF86 OUT 0x36,R24
(0086) //选取I2C从器件地址,进行主控读模式
(0087) break;
0379 C03C RJMP 0x03B6
(0088) }
(0089) case MT_SLA_ACK:
(0090) //Slave器件被识别并产生应答
(0091) {
(0092) TWItransmit(charAddr);
037A 90200094 LDS R2,charAddr
037C B823 OUT 0x03,R2
037D E885 LDI R24,0x85
037E BF86 OUT 0x36,R24
(0093) //写24C02ROM的字地址
(0094) break;
037F C036 RJMP 0x03B6
(0095) }
(0096) case MT_DATA_ACK:
(0097) //主控发送数据,并得到响应
(0098) {
(0099) switch(charState)
0380 91000093 LDS R16,charState
0382 2711 CLR R17
0383 3A05 CPI R16,0xA5
0384 E0E0 LDI R30,0
0385 071E CPC R17,R30
0386 F0C1 BEQ 0x039F
0387 EA85 LDI R24,0xA5
0388 E090 LDI R25,0
0389 1780 CP R24,R16
038A 0791 CPC R25,R17
038B F02C BLT 0x0391
038C 300F CPI R16,0xF
038D E0E0 LDI R30,0
038E 071E CPC R17,R30
038F F031 BEQ 0x0396
0390 C025 RJMP 0x03B6
0391 3F00 CPI R16,0xF0
0392 E0E0 LDI R30,0
0393 071E CPC R17,R30
0394 F081 BEQ 0x03A5
0395 C020 RJMP 0x03B6
(0100) {
(0101) case EE_WRITE://写数据到24C02的ROM
(0102) {
(0103) TWItransmit(charData);
0396 90200095 LDS R2,charData
0398 B823 OUT 0x03,R2
0399 E885 LDI R24,0x85
039A BF86 OUT 0x36,R24
(0104) charState=EE_WRITE_OVER;
039B EA85 LDI R24,0xA5
039C 93800093 STS charState,R24
(0105) break;
039E C017 RJMP 0x03B6
(0106) }
(0107) case EE_WRITE_OVER://I2C停止
(0108) {
(0109) Stop();
039F E984 LDI R24,0x94
03A0 BF86 OUT 0x36,R24
(0110) charState=EE_WRITE_OK;
03A1 E085 LDI R24,5
03A2 93800093 STS charState,R24
(0111) break;
03A4 C011 RJMP 0x03B6
(0112) }
(0113) case EE_READ:
(0114) {
(0115) Start();
03A5 EA85 LDI R24,0xA5
03A6 BF86 OUT 0x36,R24
(0116) break;
(0117) }
(0118) //I2C重新启动
(0119) }
(0120) break;
03A7 C00E RJMP 0x03B6
(0121) }
(0122) case MR_SLA_ACK:
(0123) {
(0124) MT_NACK;
03A8 E885 LDI R24,0x85
03A9 BF86 OUT 0x36,R24
(0125) break;
03AA C00B RJMP 0x03B6
(0126) }
(0127) //启动主I2C读方式
(0128) case MR_DATA_NOACK:
(0129) {
(0130) charData=TWDR;
03AB B023 IN R2,0x03
03AC 92200095 STS charData,R2
(0131) Stop();
03AE E984 LDI R24,0x94
03AF BF86 OUT 0x36,R24
(0132) charState=EE_READ_OK;
03B0 E580 LDI R24,0x50
03B1 93800093 STS charState,R24
(0133) break;
03B3 C002 RJMP 0x03B6
(0134) }
(0135) //读取I2C接收数据,I2C停止
(0136) default:
(0137) Stop();//I2C停止
03B4 E984 LDI R24,0x94
03B5 BF86 OUT 0x36,R24
(0138) }
03B6 9029 LD R2,Y+
03B7 BE2F OUT 0x3F,R2
03B8 91E9 LD R30,Y+
03B9 9199 LD R25,Y+
03BA 9189 LD R24,Y+
03BB 9119 LD R17,Y+
03BC 9109 LD R16,Y+
03BD 9029 LD R2,Y+
03BE 9518 RETI
_i2c_write:
RomAddress --> R20
Wdata --> R22
03BF D06B RCALL push_gset2
03C0 2F42 MOV R20,R18
03C1 2F60 MOV R22,R16
(0139) }
(0140)
(0141) /*
(0142) 常用TWI操作(主模式写和主模式读)
(0143) */
(0144) void i2c_write(unsigned char Wdata,unsigned char RomAddress)
(0145) {
(0146) charData=Wdata;//I2C总线写一个字节
03C2 93600095 STS charData,R22
(0147) charAddr=RomAddress;//返回0:写成功
03C4 93400094 STS charAddr,R20
(0148) charState=EE_WRITE;//返回非0:写失败
03C6 E08F LDI R24,0xF
03C7 93800093 STS charState,R24
(0149) Start();//I2C启动(TWI中断启动)
03C9 EA85 LDI R24,0xA5
03CA BF86 OUT 0x36,R24
(0150) while(charState!=EE_WRITE_OK);
03CB 91800093 LDS R24,charState
03CD 3085 CPI R24,5
03CE F7E1 BNE 0x03CB
(0151) delay_ms(10);
03CF E00A LDI R16,0xA
03D0 E010 LDI R17,0
03D1 DEEE RCALL _delay_ms
03D2 D03B RCALL pop_gset2
03D3 9508 RET
(0152) }
(0153) unsigned char i2c_read(unsigned char RomAddress)
(0154) {
(0155) charAddr=RomAddress;
_i2c_read:
RomAddress --> R16
03D4 93000094 STS charAddr,R16
(0156) charState=EE_READ;
03D6 EF80 LDI R24,0xF0
03D7 93800093 STS charState,R24
(0157) Start();//I2C启动
03D9 EA85 LDI R24,0xA5
03DA BF86 OUT 0x36,R24
(0158) while(charState!=EE_READ_OK);
03DB 91800093 LDS R24,charState
03DD 3580 CPI R24,0x50
03DE F7E1 BNE 0x03DB
(0159) return charData;
FILE: <library>
03DF 91000095 LDS R16,charData
03E1 9508 RET
mod16u:
03E2 9468 BSET 6
03E3 C001 RJMP xdiv16u
div16u:
03E4 94E8 BCLR 6
xdiv16u:
03E5 92EA ST R14,-Y
03E6 92FA ST R15,-Y
03E7 938A ST R24,-Y
03E8 24EE CLR R14
03E9 24FF CLR R15
03EA E180 LDI R24,0x10
03EB 0F00 LSL R16
03EC 1F11 ROL R17
03ED 1CEE ROL R14
03EE 1CFF ROL R15
03EF 16E2 CP R14,R18
03F0 06F3 CPC R15,R19
03F1 F018 BCS 0x03F5
03F2 1AE2 SUB R14,R18
03F3 0AF3 SBC R15,R19
03F4 9503 INC R16
03F5 958A DEC R24
03F6 F7A1 BNE 0x03EB
03F7 F416 BRTC 0x03FA
03F8 2D0E MOV R16,R14
03F9 2D1F MOV R17,R15
03FA 9189 LD R24,Y+
03FB 90F9 LD R15,Y+
03FC 90E9 LD R14,Y+
03FD 9508 RET
empy16s:
03FE 920A ST R0,-Y
03FF 921A ST R1,-Y
0400 938A ST R24,-Y
0401 939A ST R25,-Y
0402 9F02 MUL R16,R18
0403 01C0 MOVW R24,R0
0404 9F12 MUL R17,R18
0405 0D90 ADD R25,R0
0406 9F03 MUL R16,R19
0407 0D90 ADD R25,R0
0408 018C MOVW R16,R24
0409 9199 LD R25,Y+
040A 9189 LD R24,Y+
040B 9019 LD R1,Y+
040C 9009 LD R0,Y+
040D 9508 RET
pop_gset2:
040E E0E2 LDI R30,2
040F C008 RJMP pop
pop_gset3:
0410 E0E4 LDI R30,4
0411 C006 RJMP pop
pop_gset5:
0412 27EE CLR R30
0413 C004 RJMP pop
push_gset1:
0414 935A ST R21,-Y
0415 934A ST R20,-Y
0416 9508 RET
pop_gset1:
0417 E0E1 LDI R30,1
pop:
0418 9149 LD R20,Y+
0419 9159 LD R21,Y+
041A FDE0 SBRC R30,0
041B 9508 RET
041C 9169 LD R22,Y+
041D 9179 LD R23,Y+
041E FDE1 SBRC R30,1
041F 9508 RET
0420 90A9 LD R10,Y+
0421 90B9 LD R11,Y+
0422 FDE2 SBRC R30,2
0423 9508 RET
0424 90C9 LD R12,Y+
0425 90D9 LD R13,Y+
0426 FDE3 SBRC R30,3
0427 9508 RET
0428 90E9 LD R14,Y+
0429 90F9 LD R15,Y+
042A 9508 RET
push_gset2:
042B 937A ST R23,-Y
042C 936A ST R22,-Y
042D CFE6 RJMP push_gset1
push_gset3:
042E 92BA ST R11,-Y
042F 92AA ST R10,-Y
0430 CFFA RJMP push_gset2
push_gset4:
0431 92DA ST R13,-Y
0432 92CA ST R12,-Y
0433 CFFA RJMP push_gset3
push_gset5:
0434 92FA ST R15,-Y
0435 92EA ST R14,-Y
0436 CFFA RJMP push_gset4
push_lset:
0437 93FA ST R31,-Y
0438 93EA ST R30,-Y
0439 93BA ST R27,-Y
043A 93AA ST R26,-Y
043B 939A ST R25,-Y
043C 938A ST R24,-Y
043D 933A ST R19,-Y
043E 932A ST R18,-Y
043F 931A ST R17,-Y
0440 930A ST R16,-Y
0441 929A ST R9,-Y
0442 928A ST R8,-Y
0443 927A ST R7,-Y
0444 926A ST R6,-Y
0445 925A ST R5,-Y
0446 924A ST R4,-Y
0447 923A ST R3,-Y
0448 922A ST R2,-Y
0449 921A ST R1,-Y
044A 920A ST R0,-Y
044B B60F IN R0,0x3F
044C 920A ST R0,-Y
044D 9508 RET
pop_lset:
044E 9009 LD R0,Y+
044F BE0F OUT 0x3F,R0
0450 9009 LD R0,Y+
0451 9019 LD R1,Y+
0452 9029 LD R2,Y+
0453 9039 LD R3,Y+
0454 9049 LD R4,Y+
0455 9059 LD R5,Y+
0456 9069 LD R6,Y+
0457 9079 LD R7,Y+
0458 9089 LD R8,Y+
0459 9099 LD R9,Y+
045A 9109 LD R16,Y+
045B 9119 LD R17,Y+
045C 9129 LD R18,Y+
045D 9139 LD R19,Y+
045E 9189 LD R24,Y+
045F 9199 LD R25,Y+
0460 91A9 LD R26,Y+
0461 91B9 LD R27,Y+
0462 91E9 LD R30,Y+
0463 91F9 LD R31,Y+
0464 9508 RET
asgncblk:
0465 93AA ST R26,-Y
0466 93BA ST R27,-Y
0467 93EA ST R30,-Y
0468 93FA ST R31,-Y
0469 920A ST R0,-Y
046A 81AF LDD R26,Y+7
046B 85B8 LDD R27,Y+8
046C 81ED LDD R30,Y+5
046D 81FE LDD R31,Y+6
046E 3000 CPI R16,0
046F 0701 CPC R16,R17
0470 F031 BEQ 0x0477
0471 95C8 LPM
0472 920D ST R0,X+
0473 9631 ADIW R30,1
0474 5001 SUBI R16,1
0475 4010 SBCI R17,0
0476 CFF7 RJMP 0x046E
0477 9009 LD R0,Y+
0478 91F9 LD R31,Y+
0479 91E9 LD R30,Y+
047A 91B9 LD R27,Y+
047B 91A9 LD R26,Y+
047C 9624 ADIW R28,4
047D 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -