📄 twi_master_drv.lis
字号:
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 + -