📄 twi_1.lis
字号:
01AA ; i2cSendByte( *data++ );
01AA ; i2cWaitForComplete();
01AA ; length--;
01AA ; }
01AA ; }
01AA 01C0 xjmp L39
01AC L38:
01AC .dbline 215
01AC ; else
01AC ; {
01AC .dbline 218
01AC ; // 如未回应器件地址,停止发送,返回错误
01AC ;
01AC ; retval = I2C_ERROR_NODEV;
01AC 41E0 ldi R20,1
01AE .dbline 219
01AE ; }
01AE L39:
01AE .dbline 222
01AE ;
01AE ; // 发送停止条件,保持TWEA以便从接收
01AE ; i2cSendStop();
01AE 6CDF xcall _i2cSendStop
01B0 L43:
01B0 .dbline 223
01B0 L44:
01B0 .dbline 223
01B0 ; while( !(TWCR&(1<<TWSTO)) );
01B0 26B6 in R2,0x36
01B2 24FE sbrs R2,4
01B4 FDCF rjmp L43
01B6 .dbline 226
01B6 ;
01B6 ; // 开I2C中断
01B6 ; TWCR|=(1<<TWIE);
01B6 86B7 in R24,0x36
01B8 8160 ori R24,1
01BA 86BF out 0x36,R24
01BC .dbline 228
01BC ;
01BC ; return retval;
01BC 042F mov R16,R20
01BE .dbline -2
01BE L37:
01BE 0E940000 xcall pop_gset4
01C2 .dbline 0 ; func end
01C2 0895 ret
01C4 .dbsym r retval 20 c
01C4 .dbsym r data 22 pc
01C4 .dbsym r length 10 c
01C4 .dbsym r deviceAddr 12 c
01C4 .dbend
01C4 .dbfunc e i2cMasterReceiveNI _i2cMasterReceiveNI fc
01C4 ; retval -> R20
01C4 ; data -> R22,R23
01C4 ; length -> R10
01C4 ; deviceAddr -> R12
.even
01C4 _i2cMasterReceiveNI::
01C4 0E940000 xcall push_gset4
01C8 A22E mov R10,R18
01CA C02E mov R12,R16
01CC 6885 ldd R22,y+8
01CE 7985 ldd R23,y+9
01D0 .dbline -1
01D0 .dbline 236
01D0 ; }
01D0 ;
01D0 ; /************************************************************************/
01D0 ; /* 无中断主机数据接收
01D0 ; */
01D0 ; /************************************************************************/
01D0 ; unsigned char i2cMasterReceiveNI(unsigned char deviceAddr, unsigned char length, unsigned char *data)
01D0 ; {
01D0 .dbline 237
01D0 ; unsigned char retval = I2C_OK;
01D0 4427 clr R20
01D2 .dbline 240
01D2 ;
01D2 ; // 关I2C中断
01D2 ; TWCR&=~(1<<TWIE);
01D2 86B7 in R24,0x36
01D4 8E7F andi R24,254
01D6 86BF out 0x36,R24
01D8 .dbline 243
01D8 ;
01D8 ; //发送开始条件
01D8 ; i2cSendStart();
01D8 52DF xcall _i2cSendStart
01DA .dbline 244
01DA ; i2cWaitForComplete();
01DA 5BDF xcall _i2cWaitForComplete
01DC .dbline 247
01DC ;
01DC ; // 发送器件读地址
01DC ; i2cSendByte( deviceAddr | 0x01 );
01DC 0C2D mov R16,R12
01DE 0160 ori R16,1
01E0 5CDF xcall _i2cSendByte
01E2 .dbline 248
01E2 ; i2cWaitForComplete();
01E2 57DF xcall _i2cWaitForComplete
01E4 .dbline 251
01E4 ;
01E4 ; // 检查器件是否可用
01E4 ; if( TWSR == TW_MR_SLA_ACK)
01E4 81B1 in R24,0x1
01E6 8034 cpi R24,64
01E8 A1F4 brne L47
01EA .dbline 252
01EA ; {
01EA 08C0 xjmp L50
01EC L49:
01EC .dbline 255
01EC .dbline 256
01EC 01E0 ldi R16,1
01EE 5BDF xcall _i2cReceiveByte
01F0 .dbline 257
01F0 50DF xcall _i2cWaitForComplete
01F2 .dbline 258
01F2 65DF xcall _i2cGetReceivedByte
01F4 FB01 movw R30,R22
01F6 0193 st Z+,R16
01F8 BF01 movw R22,R30
01FA .dbline 259
01FA AA94 dec R10
01FC .dbline 260
01FC L50:
01FC .dbline 254
01FC ; // 接收数据并回应
01FC ; while(length > 1)
01FC 81E0 ldi R24,1
01FE 8A15 cp R24,R10
0200 A8F3 brlo L49
0202 .dbline 263
0202 ; {
0202 ; i2cReceiveByte(TRUE);
0202 ; i2cWaitForComplete();
0202 ; *data++ = i2cGetReceivedByte();
0202 ; length--;
0202 ; }
0202 ;
0202 ; // 接收数据无回应 (末位信号)
0202 ; i2cReceiveByte(FALSE);
0202 0027 clr R16
0204 50DF xcall _i2cReceiveByte
0206 .dbline 264
0206 ; i2cWaitForComplete();
0206 45DF xcall _i2cWaitForComplete
0208 .dbline 265
0208 ; *data++ = i2cGetReceivedByte();
0208 5ADF xcall _i2cGetReceivedByte
020A FB01 movw R30,R22
020C 0193 st Z+,R16
020E BF01 movw R22,R30
0210 .dbline 266
0210 ; }
0210 01C0 xjmp L48
0212 L47:
0212 .dbline 268
0212 ; else
0212 ; {
0212 .dbline 270
0212 ; // 如未回应器件地址,停止发送,返回错误
0212 ; retval = I2C_ERROR_NODEV;
0212 41E0 ldi R20,1
0214 .dbline 271
0214 ; }
0214 L48:
0214 .dbline 274
0214 ;
0214 ; // 发送停止条件,保持TWEA以便从接收
0214 ; i2cSendStop();
0214 39DF xcall _i2cSendStop
0216 .dbline 277
0216 ;
0216 ; // 开I2C中断
0216 ; TWCR|=TWIE;
0216 26B6 in R2,0x36
0218 26BE out 0x36,R2
021A .dbline 279
021A ;
021A ; return retval;
021A 042F mov R16,R20
021C .dbline -2
021C L46:
021C 0E940000 xcall pop_gset4
0220 .dbline 0 ; func end
0220 0895 ret
0222 .dbsym r retval 20 c
0222 .dbsym r data 22 pc
0222 .dbsym r length 10 c
0222 .dbsym r deviceAddr 12 c
0222 .dbend
0222 .dbfunc e i2cGetState _i2cGetState fc
.even
0222 _i2cGetState::
0222 .dbline -1
0222 .dbline 283
0222 ; }
0222 ;
0222 ; eI2cStateType i2cGetState(void)
0222 ; {
0222 .dbline 284
0222 ; return I2cState;
0222 00911000 lds R16,_I2cState
0226 .dbline -2
0226 L52:
0226 .dbline 0 ; func end
0226 0895 ret
0228 .dbend
.area vector(rom, abs)
.org 76
004C 0C941401 jmp _twi_isr
.area text(rom, con, rel)
0228 .dbfile E:\xm\jxf\u盘读写模块\code\udisk_test0827\twi_1.c
0228 .dbfunc e twi_isr _twi_isr fV
0228 ; status -> R20
.even
0228 _twi_isr::
0228 0E940000 xcall push_lset
022C 0E940000 xcall push_gset1
0230 .dbline -1
0230 .dbline 290
0230 ; }
0230 ;
0230 ; // I2C (TWI) 中断服务程序
0230 ; #pragma interrupt_handler twi_isr:iv_TWI
0230 ; void twi_isr(void)
0230 ; {
0230 .dbline 293
0230 ; //读状态位
0230 ; unsigned char status;
0230 ; status = TWSR & TWSR_STATUS_MASK;
0230 41B1 in R20,0x1
0232 487F andi R20,248
0234 .dbline 294
0234 ; switch(status)
0234 5527 clr R21
0236 4836 cpi R20,104
0238 E0E0 ldi R30,0
023A 5E07 cpc R21,R30
023C 09F4 brne X4
023E 6DC1 xjmp L72
0240 X4:
0240 88E6 ldi R24,104
0242 90E0 ldi R25,0
0244 8417 cp R24,R20
0246 9507 cpc R25,R21
0248 0CF4 brge X5
024A 6AC0 xjmp L86
024C X5:
024C L85:
024C 4033 cpi R20,48
024E E0E0 ldi R30,0
0250 5E07 cpc R21,R30
0252 09F4 brne X6
0254 0FC1 xjmp L62
0256 X6:
0256 80E3 ldi R24,48
0258 90E0 ldi R25,0
025A 8417 cp R24,R20
025C 9507 cpc R25,R21
025E 0CF4 brge X7
0260 2FC0 xjmp L88
0262 X7:
0262 L87:
0262 4031 cpi R20,16
0264 E0E0 ldi R30,0
0266 5E07 cpc R21,R30
0268 09F4 brne X8
026A C5C0 xjmp L57
026C X8:
026C 80E1 ldi R24,16
026E 90E0 ldi R25,0
0270 8417 cp R24,R20
0272 9507 cpc R25,R21
0274 7CF0 brlt L90
0276 L89:
0276 4030 cpi R20,0
0278 4507 cpc R20,R21
027A 09F4 brne X9
027C CCC1 xjmp L84
027E X9:
027E X1:
027E 4030 cpi R20,0
0280 E0E0 ldi R30,0
0282 5E07 cpc R21,R30
0284 0CF4 brge X10
0286 CEC1 xjmp L54
0288 X10:
0288 L91:
0288 4830 cpi R20,8
028A E0E0 ldi R30,0
028C 5E07 cpc R21,R30
028E 09F4 brne X11
0290 B2C0 xjmp L57
0292 X11:
0292 C8C1 xjmp L54
0294 L90:
0294 4032 cpi R20,32
0296 E0E0 ldi R30,0
0298 5E07 cpc R21,R30
029A 09F4 brne X12
029C EBC0 xjmp L62
029E X12:
029E 80E2 ldi R24,32
02A0 90E0 ldi R25,0
02A2 8417 cp R24,R20
02A4 9507 cpc R25,R21
02A6 34F0 brlt L93
02A8 L92:
02A8 4831 cpi R20,24
02AA E0E0 ldi R30,0
02AC 5E07 cpc R21,R30
02AE 09F4 brne X13
02B0 A9C0 xjmp L58
02B2 X13:
02B2 B8C1 xjmp L54
02B4 L93:
02B4 4832 cpi R20,40
02B6 E0E0 ldi R30,0
02B8 5E07 cpc R21,R30
02BA 09F4 brne X14
02BC A3C0 xjmp L58
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -