📄 twi.lis
字号:
0102 F0910300 lds R31,_strTWI+2+1
0106 2190 ld R2,Z+
0108 F0930300 sts _strTWI+2+1,R31
010C E0930200 sts _strTWI+2,R30
0110 23B8 out 0x3,R2
0112 .dbline 107
0112 ; strTWI.DATALEN--;
0112 80910400 lds R24,_strTWI+4
0116 8150 subi R24,1
0118 80930400 sts _strTWI+4,R24
011C .dbline 108
011C ; state=ST_WDATA-1; //下一步将跳到WDATA分支
011C 46E0 ldi R20,6
011E .dbline 109
011E ; TWCR=TW_ACT; //触发下一步动作
011E 85E8 ldi R24,133
0120 86BF out 0x36,R24
0122 .dbline 110
0122 ; }
0122 .dbline 111
0122 ; }
0122 6FC0 rjmp L21
0124 L31:
0124 .dbline 113
0124 ; else
0124 ; {//发送eeprom地址出错
0124 .dbline 114
0124 ; state=ST_FAIL;
0124 4427 clr R20
0126 .dbline 115
0126 ; }
0126 .dbline 116
0126 ; break;
0126 6DC0 rjmp L21
0128 L37:
0128 .dbline 118
0128 ; case ST_RESTART: //RESTART状态检查,只有读操作模式才能跳到这里
0128 ; if(status==TW_REP_START)
0128 6031 cpi R22,16
012A 31F4 brne L38
012C .dbline 119
012C ; {//发送restart信号成功
012C .dbline 120
012C ; TWDR=strTWI.SLA; //发器件地址读SLAR
012C 20900100 lds R2,_strTWI+1
0130 23B8 out 0x3,R2
0132 .dbline 121
0132 ; TWCR=TW_ACT; //触发下一步动作,同时清start发送标志
0132 85E8 ldi R24,133
0134 86BF out 0x36,R24
0136 .dbline 122
0136 ; }
0136 65C0 rjmp L21
0138 L38:
0138 .dbline 124
0138 ; else
0138 ; {//重发start信号出错
0138 .dbline 125
0138 ; state=ST_FAIL;
0138 4427 clr R20
013A .dbline 126
013A ; }
013A .dbline 127
013A ; break;
013A 63C0 rjmp L21
013C L41:
013C .dbline 129
013C ; case ST_SLAR: //SLAR状态检查,只有读操作模式才能跳到这里
013C ; if(status==TW_MR_SLA_ACK)
013C 6034 cpi R22,64
013E 71F4 brne L42
0140 .dbline 130
0140 ; {//发送器件地址成功
0140 .dbline 131
0140 ; if (strTWI.DATALEN--)
0140 20900400 lds R2,_strTWI+4
0144 822D mov R24,R2
0146 8150 subi R24,1
0148 80930400 sts _strTWI+4,R24
014C 2220 tst R2
014E 19F0 breq L44
0150 .dbline 132
0150 ; {//多个数据
0150 .dbline 133
0150 ; TWCR=(1<<TWEA)|TW_ACT; //设定ACK,触发下一步动作
0150 85EC ldi R24,197
0152 86BF out 0x36,R24
0154 .dbline 134
0154 ; }
0154 56C0 rjmp L21
0156 L44:
0156 .dbline 136
0156 ; else
0156 ; {//只有一个数据
0156 .dbline 137
0156 ; TWCR=TW_ACT; //设定NAK,触发下一步动作
0156 85E8 ldi R24,133
0158 86BF out 0x36,R24
015A .dbline 138
015A ; }
015A .dbline 139
015A ; }
015A 53C0 rjmp L21
015C L42:
015C .dbline 141
015C ; else
015C ; {//发送器件地址出错
015C .dbline 142
015C ; state=ST_FAIL;
015C 4427 clr R20
015E .dbline 143
015E ; }
015E .dbline 144
015E ; break;
015E 51C0 rjmp L21
0160 L47:
0160 .dbline 146
0160 ; case ST_RDATA: //读取数据状态检查,只有读操作模式才能跳到这里
0160 ; state--; //循环,直到读完指定长度数据
0160 4A95 dec R20
0162 .dbline 147
0162 ; if(status==TW_MR_DATA_ACK)
0162 6035 cpi R22,80
0164 C1F4 brne L48
0166 .dbline 148
0166 ; {//读取数据成功,但不是最后一个数据
0166 .dbline 149
0166 ; *strTWI.pBUF++=TWDR;
0166 23B0 in R2,0x3
0168 E0910200 lds R30,_strTWI+2
016C F0910300 lds R31,_strTWI+2+1
0170 2192 st Z+,R2
0172 F0930300 sts _strTWI+2+1,R31
0176 E0930200 sts _strTWI+2,R30
017A .dbline 150
017A ; if (strTWI.DATALEN--)
017A 20900400 lds R2,_strTWI+4
017E 822D mov R24,R2
0180 8150 subi R24,1
0182 80930400 sts _strTWI+4,R24
0186 2220 tst R2
0188 19F0 breq L51
018A .dbline 151
018A ; {//还有多个数据
018A .dbline 152
018A ; TWCR=(1<<TWEA)|TW_ACT; //设定ACK,触发下一步动作
018A 85EC ldi R24,197
018C 86BF out 0x36,R24
018E .dbline 153
018E ; }
018E 39C0 rjmp L21
0190 L51:
0190 .dbline 155
0190 ; else
0190 ; {//准备读最后一个数据
0190 .dbline 156
0190 ; TWCR=TW_ACT; //设定NAK,触发下一步动作
0190 85E8 ldi R24,133
0192 86BF out 0x36,R24
0194 .dbline 157
0194 ; }
0194 .dbline 158
0194 ; }
0194 36C0 rjmp L21
0196 L48:
0196 .dbline 159
0196 ; else if(status==TW_MR_DATA_NACK)
0196 6835 cpi R22,88
0198 81F4 brne L54
019A .dbline 160
019A ; {//已经读完最后一个数据
019A .dbline 161
019A ; *strTWI.pBUF++=TWDR;
019A 23B0 in R2,0x3
019C E0910200 lds R30,_strTWI+2
01A0 F0910300 lds R31,_strTWI+2+1
01A4 2192 st Z+,R2
01A6 F0930300 sts _strTWI+2+1,R31
01AA E0930200 sts _strTWI+2,R30
01AE .dbline 162
01AE ; TWCR=(1<<TWSTO)|TW_ACT; //发送停止信号,不会再产生中断了
01AE 85E9 ldi R24,149
01B0 86BF out 0x36,R24
01B2 .dbline 163
01B2 ; strTWI.STATUS=TW_OK;
01B2 81E0 ldi R24,1
01B4 80930000 sts _strTWI,R24
01B8 .dbline 164
01B8 ; }
01B8 24C0 rjmp L21
01BA L54:
01BA .dbline 166
01BA ; else
01BA ; {//读取数据出错
01BA .dbline 167
01BA ; state=ST_FAIL;
01BA 4427 clr R20
01BC .dbline 168
01BC ; }
01BC .dbline 169
01BC ; break;
01BC 22C0 rjmp L21
01BE L57:
01BE .dbline 171
01BE ; case ST_WDATA: //写数据状态检查,只有写操作模式才能跳到这里
01BE ; state--; //循环,直到写完指定长度数据
01BE 4A95 dec R20
01C0 .dbline 172
01C0 ; if(status==TW_MT_DATA_ACK)
01C0 6832 cpi R22,40
01C2 E1F4 brne L58
01C4 .dbline 173
01C4 ; {//写数据成功
01C4 .dbline 174
01C4 ; if (strTWI.DATALEN)
01C4 20900400 lds R2,_strTWI+4
01C8 2220 tst R2
01CA 91F0 breq L60
01CC .dbline 175
01CC ; {//还要写
01CC .dbline 176
01CC ; TWDR=*strTWI.pBUF++;
01CC E0910200 lds R30,_strTWI+2
01D0 F0910300 lds R31,_strTWI+2+1
01D4 2190 ld R2,Z+
01D6 F0930300 sts _strTWI+2+1,R31
01DA E0930200 sts _strTWI+2,R30
01DE 23B8 out 0x3,R2
01E0 .dbline 177
01E0 ; strTWI.DATALEN--;
01E0 80910400 lds R24,_strTWI+4
01E4 8150 subi R24,1
01E6 80930400 sts _strTWI+4,R24
01EA .dbline 178
01EA ; TWCR=TW_ACT; //触发下一步动作
01EA 85E8 ldi R24,133
01EC 86BF out 0x36,R24
01EE .dbline 179
01EE ; }
01EE 09C0 rjmp L21
01F0 L60:
01F0 .dbline 181
01F0 ; else
01F0 ; {//写够了
01F0 .dbline 182
01F0 ; TWCR=(1<<TWSTO)|TW_ACT; //发送停止信号,不会再产生中断了
01F0 85E9 ldi R24,149
01F2 86BF out 0x36,R24
01F4 .dbline 183
01F4 ; strTWI.STATUS=TW_OK;
01F4 81E0 ldi R24,1
01F6 80930000 sts _strTWI,R24
01FA .dbline 186
01FA ; //启动写命令后需要10ms(最大)的编程时间才能真正的把数据记录下来
01FA ; //编程期间器件不响应任何命令
01FA ; }
01FA .dbline 187
01FA ; }
01FA 03C0 rjmp L21
01FC L58:
01FC .dbline 189
01FC ; else
01FC ; {//写数据失败
01FC .dbline 190
01FC ; state=ST_FAIL;
01FC 4427 clr R20
01FE .dbline 191
01FE ; }
01FE .dbline 192
01FE ; break;
01FE 01C0 rjmp L21
0200 L20:
0200 .dbline 195
0200 ; default:
0200 ; //错误状态
0200 ; state=ST_FAIL;
0200 4427 clr R20
0202 .dbline 196
0202 ; break;
0202 L21:
0202 .dbline 199
0202 ; }
0202 ;
0202 ; if (state==ST_FAIL)
0202 4423 tst R20
0204 79F4 brne L65
0206 .dbline 200
0206 ; {//错误处理
0206 .dbline 201
0206 ; strTWI.FAILCNT++;
0206 80910600 lds R24,_strTWI+6
020A 8F5F subi R24,255 ; addi 1
020C 80930600 sts _strTWI+6,R24
0210 .dbline 202
0210 ; if (strTWI.FAILCNT<FAIL_MAX)
0210 8431 cpi R24,20
0212 18F4 brsh L68
0214 .dbline 203
0214 ; {//重试次数未超出最大值,
0214 .dbline 204
0214 ; TWCR=(1<<TWSTA)|TW_ACT; //发生错误,启动start信号
0214 85EA ldi R24,165
0216 86BF out 0x36,R24
0218 .dbline 205
0218 ; }
0218 05C0 rjmp L69
021A L68:
021A .dbline 207
021A ; else
021A ; {//否则停止
021A .dbline 208
021A ; TWCR=(1<<TWSTO)|TW_ACT; //发送停止信号,不会再产生中断了
021A 85E9 ldi R24,149
021C 86BF out 0x36,R24
021E .dbline 209
021E ; strTWI.STATUS=TW_FAIL;
021E 82E0 ldi R24,2
0220 80930000 sts _strTWI,R24
0224 .dbline 210
0224 ; }
0224 L69:
0224 .dbline 211
0224 ; }
0224 L65:
0224 .dbline 212
0224 ; state++;
0224 4395 inc R20
0226 .dbline 213
0226 ; strTWI.STATE=state; //保存状态
0226 40930500 sts _strTWI+5,R20
022A .dbline 214
022A ; }
022A .dbline 216
022A ; else
022A ; {
022A .dbline 218
022A ; //总线错误或从机模式引发的中断,不予处理
022A ; return;
022A L19:
022A L14:
022A .dbline -2
022A L10:
022A 00D0 rcall pop_gset4
022C 00D0 rcall pop_lset
022E .dbline 0 ; func end
022E 1895 reti
0230 .dbsym r action 10 c
0230 .dbsym r state 20 c
0230 .dbsym r status 22 c
0230 .dbend
.area bss(ram, con, rel)
0000 .dbfile D:\myavrproject\icc\twi\twi.c
0000 _strTWI::
0000 .blkb 7
0007 .dbsym e strTWI _strTWI X
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -