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

📄 twi_1.lis

📁 AVR单片机平台Atmega32+CH375A芯片读写U盘代码
💻 LIS
📖 第 1 页 / 共 5 页
字号:
 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 + -