⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 twi.lis

📁 avr 基于i2c接口的电源管理协议。包括主机发送主机接受从机发送接收。
💻 LIS
📖 第 1 页 / 共 2 页
字号:
 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 + -