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

📄 twi_master_drv.lis

📁 at90can128底层驱动 有SPI,TWI,总线,CAN接口等
💻 LIS
📖 第 1 页 / 共 4 页
字号:
 015C           ;     Twi_set_data(*(twi_message.buf)); // byte and send it
 015C E0910600          lds R30,_twi_message+3
 0160 F0910700          lds R31,_twi_message+3+1
 0164 2080              ldd R2,z+0
 0166 2092BB00          sts 187,R2
 016A                   .dbline 81
 016A           ; 
 016A           ;     if (twi_message.nbbytes==0) // no datas to transmit
 016A 20900500          lds R2,_twi_message+2
 016E 2220              tst R2
 0170 51F4              brne L18
 0172                   .dbline 82
 0172           ;         {
 0172                   .dbline 83
 0172           ;         Twi_set_stop();
 0172 8091BC00          lds R24,188
 0176 8061              ori R24,16
 0178 8093BC00          sts 188,R24
 017C                   .dbline 84
 017C           ;         twi_err  = TWI_TRANSFER_OK;
 017C 2224              clr R2
 017E 20920100          sts _twi_err,R2
 0182                   .dbline 85
 0182           ;         twi_busy = FALSE;       // transfer complete, clear twi_busy
 0182 20920200          sts _twi_busy,R2
 0186                   .dbline 86
 0186           ;         }
 0186           L18:
 0186                   .dbline 87
 0186           ;     Twi_clear_si();
 0186 8091BC00          lds R24,188
 018A 8068              ori R24,128
 018C 8093BC00          sts 188,R24
 0190                   .dbline 88
 0190           ;     break;
 0190 C7C0              xjmp L5
 0192           L21:
 0192                   .dbline 93
 0192           ; 
 0192           ;     //STATE 20h:   SLR+W was transmitted, NOT ACK bit received
 0192           ;     //ACTION:      Transmit STOP
 0192           ;     case 0x20 :
 0192           ;     Twi_set_stop(); // Twi_set_stop will also clear twiint flag
 0192 8091BC00          lds R24,188
 0196 8061              ori R24,16
 0198 8093BC00          sts 188,R24
 019C                   .dbline 94
 019C           ;     twi_busy = FALSE;
 019C 2224              clr R2
 019E 20920200          sts _twi_busy,R2
 01A2                   .dbline 95
 01A2           ;     twi_err  = TWI_HOST_ADR_NACK;
 01A2 83E0              ldi R24,3
 01A4 80930100          sts _twi_err,R24
 01A8                   .dbline 96
 01A8           ;     break;
 01A8 BBC0              xjmp L5
 01AA           L22:
 01AA                   .dbline 101
 01AA           ; 
 01AA           ;     //STATE 28h:   DATA was transmitted, ACK bit received
 01AA           ;     //ACTION:      If last byte, send STOP, else send more data bytes
 01AA           ;     case 0x28:                  // master transmit, after sending ; data byte, ACK received
 01AA           ;     twi_nb_transmited++;        // inc nb data transmit on message
 01AA 80910000          lds R24,_twi_nb_transmited
 01AE 8F5F              subi R24,255    ; addi 1
 01B0 80930000          sts _twi_nb_transmited,R24
 01B4                   .dbline 102
 01B4           ;     twi_message.buf++;          // inc pointer ti data to be transmited
 01B4 80910600          lds R24,_twi_message+3
 01B8 90910700          lds R25,_twi_message+3+1
 01BC 0196              adiw R24,1
 01BE 90930700          sts _twi_message+3+1,R25
 01C2 80930600          sts _twi_message+3,R24
 01C6                   .dbline 103
 01C6           ;     if ( twi_nb_transmited < twi_message.nbbytes  ) // if there are still bytes to send
 01C6 20900500          lds R2,_twi_message+2
 01CA 30900000          lds R3,_twi_nb_transmited
 01CE 3214              cp R3,R2
 01D0 50F4              brsh L24
 01D2                   .dbline 104
 01D2           ;         {
 01D2                   .dbline 105
 01D2           ;         Twi_set_data(*(twi_message.buf));
 01D2 FC01              movw R30,R24
 01D4 2080              ldd R2,z+0
 01D6 2092BB00          sts 187,R2
 01DA                   .dbline 106
 01DA           ;         Twi_set_aa();           // wait on ACK bit
 01DA 8091BC00          lds R24,188
 01DE 8064              ori R24,64
 01E0 8093BC00          sts 188,R24
 01E4                   .dbline 107
 01E4           ;         }
 01E4 9DC0              xjmp L5
 01E6           L24:
 01E6                   .dbline 109
 01E6           ;     else
 01E6           ;         {                    //run out of data, send stop,
 01E6                   .dbline 110
 01E6           ;         Twi_set_stop(); // Twi_set_stop will also clear twiint flag
 01E6 8091BC00          lds R24,188
 01EA 8061              ori R24,16
 01EC 8093BC00          sts 188,R24
 01F0                   .dbline 111
 01F0           ;         twi_err  = TWI_TRANSFER_OK;
 01F0 2224              clr R2
 01F2 20920100          sts _twi_err,R2
 01F6                   .dbline 112
 01F6           ;         twi_busy = FALSE;         //transfer complete, clear twi_busy
 01F6 20920200          sts _twi_busy,R2
 01FA                   .dbline 113
 01FA           ;         }
 01FA                   .dbline 114
 01FA           ;     break;
 01FA 92C0              xjmp L5
 01FC           L28:
 01FC                   .dbline 119
 01FC           ; 
 01FC           ;     //STATE 30h:   DATA was transmitted, NOT ACK bit received
 01FC           ;     //ACTION:      Transmit STOP
 01FC           ;     case 0x30 :
 01FC           ;     Twi_set_stop();     // Twi_set_stop will also clear twiint flag
 01FC 8091BC00          lds R24,188
 0200 8061              ori R24,16
 0202 8093BC00          sts 188,R24
 0206                   .dbline 120
 0206           ;     twi_busy = FALSE;
 0206 2224              clr R2
 0208 20920200          sts _twi_busy,R2
 020C                   .dbline 121
 020C           ;     twi_err  = TWI_HOST_ADR_NACK;
 020C 83E0              ldi R24,3
 020E 80930100          sts _twi_err,R24
 0212                   .dbline 122
 0212           ;     break;
 0212 86C0              xjmp L5
 0214           L29:
 0214                   .dbline 128
 0214           ; 
 0214           ;     //STATE 38h:   Arbitration lost in SLA+W or DATA.
 0214           ;     //ACTION:      Release bus, enter not addressed SLV mode
 0214           ;     //             Wait for bus lines to be free
 0214           ;     case 0x38 :
 0214           ;     twi_busy = FALSE;
 0214 2224              clr R2
 0216 20920200          sts _twi_busy,R2
 021A                   .dbline 129
 021A           ;     twi_err  = TWI_ARBITRATION_LOST;
 021A 85E0              ldi R24,5
 021C 80930100          sts _twi_err,R24
 0220                   .dbline 130
 0220           ;     Twi_clear_si();
 0220 8091BC00          lds R24,188
 0224 8068              ori R24,128
 0226 8093BC00          sts 188,R24
 022A                   .dbline 134
 022A           ;     // #ifdef USER_TWI_FCT_ARBITRATION_LOST_IN_SLA+W_OR_DATA
 022A           ;     // TWI_fct_arb_lostinSLAorDATA();
 022A           ;     // #endif
 022A           ;     break;
 022A 7AC0              xjmp L5
 022C           L30:
 022C                   .dbline 141
 022C           ; 
 022C           ;    //MASTER RECEIVER MODE FOLLOWS
 022C           ;    //STATE 40h:   SLA+R transmitted, ACK received
 022C           ;    //ACTION:      Receive DATA, ACK to be returned
 022C           ;    //PREVIOS STATE: 0x08 or 0x10
 022C           ;     case 0x40 :               //master receive, after sending
 022C           ;          if ( twi_message.nbbytes == 1 )
 022C 80910500          lds R24,_twi_message+2
 0230 8130              cpi R24,1
 0232 59F4              brne L31
 0234                   .dbline 142
 0234           ;          {
 0234                   .dbline 143
 0234           ;             Twi_clear_aa(); // only one data to receive, noACK to be send after the fisrt incoming data
 0234 8091BC00          lds R24,188
 0238 8F73              andi R24,63
 023A 8093BC00          sts 188,R24
 023E                   .dbline 144
 023E           ;             Twi_clear_si();
 023E 8091BC00          lds R24,188
 0242 8068              ori R24,128
 0244 8093BC00          sts 188,R24
 0248                   .dbline 145
 0248           ;          }
 0248 6BC0              xjmp L5
 024A           L31:
 024A                   .dbline 146
 024A           ;     else if (!twi_message.nbbytes      ) Twi_set_stop(); // special case: no data to read ! clear also twint
 024A 20900500          lds R2,_twi_message+2
 024E 2220              tst R2
 0250 31F4              brne L34
 0252                   .dbline 146
 0252 8091BC00          lds R24,188
 0256 8061              ori R24,16
 0258 8093BC00          sts 188,R24
 025C 61C0              xjmp L5
 025E           L34:
 025E                   .dbline 148
 025E           ;     else
 025E           ;         {
 025E                   .dbline 149
 025E           ;         Twi_set_aa();      //wait on ACK bit
 025E 8091BC00          lds R24,188
 0262 8064              ori R24,64
 0264 8093BC00          sts 188,R24
 0268                   .dbline 150
 0268           ;         twi_nb_transmited=0;      //data byte to be received, NOT ACK bit to follow  --> 0x58
 0268 2224              clr R2
 026A 20920000          sts _twi_nb_transmited,R2
 026E                   .dbline 151
 026E           ;         }
 026E                   .dbline 152
 026E           ;     break;
 026E 58C0              xjmp L5
 0270           L37:
 0270                   .dbline 157
 0270           ; 
 0270           ;     //STATE 48h:   SLA+R transmitted, NOT ACK received
 0270           ;     //ACTION:      Transmit STOP
 0270           ;     case 0x48 :
 0270           ;     Twi_set_stop(); //clear also twint
 0270 8091BC00          lds R24,188
 0274 8061              ori R24,16
 0276 8093BC00          sts 188,R24
 027A                   .dbline 158
 027A           ;     twi_busy = FALSE;
 027A 2224              clr R2
 027C 20920200          sts _twi_busy,R2
 0280                   .dbline 159
 0280           ;     twi_err  = TWI_HOST_ADR_NACK;
 0280 83E0              ldi R24,3
 0282 80930100          sts _twi_err,R24
 0286                   .dbline 160
 0286           ;     break;
 0286 4CC0              xjmp L5
 0288           L38:
 0288                   .dbline 166
 0288           ; 
 0288           ;     //STATE 50h:   Data has been received, ACK returned
 0288           ;     //ACTION:      Read DATA. If expecting more continue else STOP
 0288           ;     case 0x50 : //master receive, received data
 0288           ;                 //byte and ACK, copy it into
 0288           ;     *(twi_message.buf+twi_nb_transmited) = Twi_get_data();      //buffer
 0288 20900600          lds R2,_twi_message+3
 028C 30900700          lds R3,_twi_message+3+1
 0290 E0910000          lds R30,_twi_nb_transmited
 0294 FF27              clr R31
 0296 E20D              add R30,R2
 0298 F31D              adc R31,R3
 029A 2090BB00          lds R2,187
 029E 2082              std z+0,R2
 02A0                   .dbline 167
 02A0           ;     twi_nb_transmited++;
 02A0 80910000          lds R24,_twi_nb_transmited
 02A4 8F5F              subi R24,255    ; addi 1
 02A6 80930000          sts _twi_nb_transmited,R24
 02AA                   .dbline 168
 02AA           ;     if ( twi_nb_transmited < (twi_message.nbbytes-1) ) Twi_set_aa(); // get more bytes
 02AA 80910500          lds R24,_twi_message+2
 02AE 8150              subi R24,1
 02B0 20900000          lds R2,_twi_nb_transmited
 02B4 2816              cp R2,R24
 02B6 30F4              brsh L40
 02B8                   .dbline 168
 02B8 8091BC00          lds R24,188
 02BC 8064              ori R24,64
 02BE 8093BC00          sts 188,R24
 02C2 2EC0              xjmp L5
 02C4           L40:
 02C4                   .dbline 170
 02C4           ;     else
 02C4           ;     {
 02C4                   .dbline 171
 02C4           ;       Twi_clear_aa();           //only one more byte to come
 02C4 8091BC00          lds R24,188
 02C8 8F73              andi R24,63
 02CA 8093BC00          sts 188,R24
 02CE                   .dbline 172
 02CE           ;       Twi_clear_si();
 02CE 8091BC00          lds R24,188
 02D2 8068              ori R24,128
 02D4 8093BC00          sts 188,R24
 02D8                   .dbline 173
 02D8           ;     }
 02D8                   .dbline 174
 02D8           ;     break;
 02D8 23C0              xjmp L5
 02DA           L43:
 02DA                   .dbline 179
 02DA           ; 
 02DA           ;     //STATE 58h:   Data has been received, NOT ACK returned
 02DA           ;     //ACTION:      Read DATA. Generate STOP
 02DA           ;     case 0x58 :
 02DA           ;     *(twi_message.buf+twi_nb_transmited) = Twi_get_data();
 02DA 20900600          lds R2,_twi_message+3
 02DE 30900700          lds R3,_twi_message+3+1
 02E2 E0910000          lds R30,_twi_nb_transmited
 02E6 FF27              clr R31
 02E8 E20D              add R30,R2
 02EA F31D              adc R31,R3

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -