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

📄 twi_1.lis

📁 AVR单片机平台Atmega32+CH375A芯片读写U盘代码
💻 LIS
📖 第 1 页 / 共 5 页
字号:
 00A6           ;    //开始通过 i2c 接收 
 00A6           ;    if( ackFlag ) 
 00A6 0023              tst R16
 00A8 29F0              breq L17
 00AA                   .dbline 117
 00AA           ;    { 
 00AA                   .dbline 119
 00AA           ;       // ackFlag = TRUE: 数据接收后回应ACK  
 00AA           ;        TWCR=TWCR&TWCR_CMD_MASK|(1<<TWINT)|(1<<TWEA); 
 00AA 86B7              in R24,0x36
 00AC 8F70              andi R24,15
 00AE 806C              ori R24,192
 00B0 86BF              out 0x36,R24
 00B2                   .dbline 120
 00B2           ;    } 
 00B2 04C0              xjmp L18
 00B4           L17:
 00B4                   .dbline 122
 00B4                   .dbline 124
 00B4 86B7              in R24,0x36
 00B6 8F70              andi R24,15
 00B8 8068              ori R24,128
 00BA 86BF              out 0x36,R24
 00BC                   .dbline 125
 00BC           L18:
 00BC                   .dbline -2
 00BC           L16:
 00BC                   .dbline 0 ; func end
 00BC 0895              ret
 00BE                   .dbsym r ackFlag 16 c
 00BE                   .dbend
 00BE                   .dbfunc e i2cGetReceivedByte _i2cGetReceivedByte fc
                        .even
 00BE           _i2cGetReceivedByte::
 00BE                   .dbline -1
 00BE                   .dbline 129
 00BE           ;    else 
 00BE           ;    { 
 00BE           ;       // ackFlag = FALSE: 数据接收后无回应 
 00BE           ;        TWCR=TWCR&TWCR_CMD_MASK|(1<<TWINT); 
 00BE           ;    } 
 00BE           ; } 
 00BE           ; 
 00BE           ; unsigned char i2cGetReceivedByte(void) 
 00BE           ; { 
 00BE                   .dbline 131
 00BE           ;    // 返回接收到的数据 
 00BE           ;    return( TWDR ); 
 00BE 03B1              in R16,0x3
 00C0                   .dbline -2
 00C0           L19:
 00C0                   .dbline 0 ; func end
 00C0 0895              ret
 00C2                   .dbend
 00C2                   .dbfunc e i2cGetStatus _i2cGetStatus fc
                        .even
 00C2           _i2cGetStatus::
 00C2                   .dbline -1
 00C2                   .dbline 135
 00C2           ; } 
 00C2           ; 
 00C2           ; unsigned char i2cGetStatus(void) 
 00C2           ; { 
 00C2                   .dbline 137
 00C2           ;    // 返回总线状态 
 00C2           ;    return(TWSR); 
 00C2 01B1              in R16,0x1
 00C4                   .dbline -2
 00C4           L20:
 00C4                   .dbline 0 ; func end
 00C4 0895              ret
 00C6                   .dbend
 00C6                   .dbfunc e i2cMasterSend _i2cMasterSend fc
 00C6           ;              i -> <dead>
 00C6           ;         length -> R20,R21
 00C6           ;     deviceAddr -> R22
                        .even
 00C6           _i2cMasterSend::
 00C6 0E940000          xcall push_gset2
 00CA A901              movw R20,R18
 00CC 602F              mov R22,R16
 00CE                   .dbline -1
 00CE                   .dbline 141
 00CE           ; } 
 00CE           ; 
 00CE           ; unsigned char i2cMasterSend(unsigned char deviceAddr, unsigned int length) 
 00CE           ; { 
 00CE           L22:
 00CE                   .dbline 144
 00CE           L23:
 00CE                   .dbline 144
 00CE           ;    unsigned char i; 
 00CE           ;    // 等待总线准备完成 
 00CE           ;    while(I2cState); 
 00CE 20901000          lds R2,_I2cState
 00D2 2220              tst R2
 00D4 E1F7              brne L22
 00D6                   .dbline 146
 00D6           ;    // 设置状态 
 00D6           ;    I2cState = I2C_MASTER_TX; 
 00D6 82E0              ldi R24,2
 00D8 80931000          sts _I2cState,R24
 00DC                   .dbline 148
 00DC           ;    // 准备数据 
 00DC           ;    I2cDeviceAddrRW = (deviceAddr & 0xFE);   // RW 为0: 写操作
 00DC 862F              mov R24,R22
 00DE 8E7F              andi R24,254
 00E0 80930F00          sts _I2cDeviceAddrRW,R24
 00E4                   .dbline 149
 00E4           ;    I2cSendDataIndex = 0; 
 00E4 2224              clr R2
 00E6 3324              clr R3
 00E8 30920C00          sts _I2cSendDataIndex+1,R3
 00EC 20920B00          sts _I2cSendDataIndex,R2
 00F0                   .dbline 150
 00F0           ;    I2cSendDataLength = length; 
 00F0 50930A00          sts _I2cSendDataLength+1,R21
 00F4 40930900          sts _I2cSendDataLength,R20
 00F8                   .dbline 152
 00F8           ;    // 发送开始条件 
 00F8           ;    i2cSendStart();
 00F8 C2DF              xcall _i2cSendStart
 00FA           L25:
 00FA                   .dbline 153
 00FA           L26:
 00FA                   .dbline 153
 00FA           ;    while(I2cState);
 00FA 20901000          lds R2,_I2cState
 00FE 2220              tst R2
 0100 E1F7              brne L25
 0102                   .dbline 154
 0102           ;    return(I2cNotAck);
 0102 00910500          lds R16,_I2cNotAck
 0106                   .dbline -2
 0106           L21:
 0106 0E940000          xcall pop_gset2
 010A                   .dbline 0 ; func end
 010A 0895              ret
 010C                   .dbsym l i 1 c
 010C                   .dbsym r length 20 i
 010C                   .dbsym r deviceAddr 22 c
 010C                   .dbend
 010C                   .dbfunc e i2cMasterReceive _i2cMasterReceive fc
 010C           ;              i -> <dead>
 010C           ;         length -> R20,R21
 010C           ;     deviceAddr -> R22
                        .even
 010C           _i2cMasterReceive::
 010C 0E940000          xcall push_gset2
 0110 A901              movw R20,R18
 0112 602F              mov R22,R16
 0114                   .dbline -1
 0114                   .dbline 158
 0114           ; } 
 0114           ; 
 0114           ; unsigned char i2cMasterReceive(unsigned char deviceAddr, unsigned int length) 
 0114           ; { 
 0114           L29:
 0114                   .dbline 161
 0114           L30:
 0114                   .dbline 161
 0114           ;    unsigned char i; 
 0114           ;    // 等待总线准备完成 
 0114           ;    while(I2cState); 
 0114 20901000          lds R2,_I2cState
 0118 2220              tst R2
 011A E1F7              brne L29
 011C                   .dbline 163
 011C           ;    // 设置状态 
 011C           ;    I2cState = I2C_MASTER_RX; 
 011C 83E0              ldi R24,3
 011E 80931000          sts _I2cState,R24
 0122                   .dbline 165
 0122           ;    // 保存数据 
 0122           ;    I2cDeviceAddrRW = (deviceAddr|0x01);   // RW 为1 : 读操作 
 0122 862F              mov R24,R22
 0124 8160              ori R24,1
 0126 80930F00          sts _I2cDeviceAddrRW,R24
 012A                   .dbline 166
 012A           ;    I2cReceiveDataIndex = 0;
 012A 2224              clr R2
 012C 3324              clr R3
 012E 30920600          sts _I2cReceiveDataIndex+1,R3
 0132 20920500          sts _I2cReceiveDataIndex,R2
 0136                   .dbline 167
 0136           ;    if(length)
 0136 4030              cpi R20,0
 0138 4507              cpc R20,R21
 013A 41F0              breq L32
 013C           X0:
 013C                   .dbline 168
 013C           ;    {
 013C                   .dbline 169
 013C           ;        I2cReceiveDataLength = length; 
 013C 50930400          sts _I2cReceiveDataLength+1,R21
 0140 40930300          sts _I2cReceiveDataLength,R20
 0144                   .dbline 170
 0144           ;        EnFlex = 0;
 0144 2224              clr R2
 0146 20920400          sts _EnFlex,R2
 014A                   .dbline 171
 014A           ;    }
 014A 09C0              xjmp L33
 014C           L32:
 014C                   .dbline 173
 014C           ;    else
 014C           ;    {
 014C                   .dbline 174
 014C           ;        I2cReceiveDataLength = 0;           //如果此值在此不被清零,那么一旦它大于2就会使中断不能到达修改长度的分支
 014C 2224              clr R2
 014E 3324              clr R3
 0150 30920400          sts _I2cReceiveDataLength+1,R3
 0154 20920300          sts _I2cReceiveDataLength,R2
 0158                   .dbline 175
 0158           ;        EnFlex = 0xff;
 0158 8FEF              ldi R24,255
 015A 80930400          sts _EnFlex,R24
 015E                   .dbline 176
 015E           ;    }
 015E           L33:
 015E                   .dbline 178
 015E           ;    // 发送开始条件 
 015E           ;    i2cSendStart(); 
 015E 8FDF              xcall _i2cSendStart
 0160           L34:
 0160                   .dbline 180
 0160           L35:
 0160                   .dbline 180
 0160           ;    //等待数据准备好 
 0160           ;    while(I2cState);
 0160 20901000          lds R2,_I2cState
 0164 2220              tst R2
 0166 E1F7              brne L34
 0168                   .dbline 181
 0168           ;    return(I2cNotAck);
 0168 00910500          lds R16,_I2cNotAck
 016C                   .dbline -2
 016C           L28:
 016C 0E940000          xcall pop_gset2
 0170                   .dbline 0 ; func end
 0170 0895              ret
 0172                   .dbsym l i 1 c
 0172                   .dbsym r length 20 i
 0172                   .dbsym r deviceAddr 22 c
 0172                   .dbend
 0172                   .dbfunc e i2cMasterSendNI _i2cMasterSendNI fc
 0172           ;         retval -> R20
 0172           ;           data -> R22,R23
 0172           ;         length -> R10
 0172           ;     deviceAddr -> R12
                        .even
 0172           _i2cMasterSendNI::
 0172 0E940000          xcall push_gset4
 0176 A22E              mov R10,R18
 0178 C02E              mov R12,R16
 017A 6885              ldd R22,y+8
 017C 7985              ldd R23,y+9
 017E                   .dbline -1
 017E                   .dbline 189
 017E           ; } 
 017E           ; 
 017E           ; /************************************************************************/
 017E           ; /* 无中断的主机数据发送
 017E           ;                                                                      */
 017E           ; /************************************************************************/
 017E           ; unsigned char i2cMasterSendNI(unsigned char deviceAddr, unsigned char length, unsigned char* data) 
 017E           ; { 
 017E                   .dbline 190
 017E           ;    unsigned char retval = I2C_OK; 
 017E 4427              clr R20
 0180                   .dbline 193
 0180           ; 
 0180           ;    // 关I2C中断 
 0180           ;    TWCR&=~(1<<TWIE); 
 0180 86B7              in R24,0x36
 0182 8E7F              andi R24,254
 0184 86BF              out 0x36,R24
 0186                   .dbline 196
 0186           ; 
 0186           ;    // 发送开始条件 
 0186           ;    i2cSendStart(); 
 0186 7BDF              xcall _i2cSendStart
 0188                   .dbline 197
 0188           ;    i2cWaitForComplete(); 
 0188 84DF              xcall _i2cWaitForComplete
 018A                   .dbline 200
 018A           ; 
 018A           ;    // 发送器件写地址 
 018A           ;    i2cSendByte( deviceAddr & 0xFE ); 
 018A 0C2D              mov R16,R12
 018C 0E7F              andi R16,254
 018E 85DF              xcall _i2cSendByte
 0190                   .dbline 201
 0190           ;    i2cWaitForComplete(); 
 0190 80DF              xcall _i2cWaitForComplete
 0192                   .dbline 204
 0192           ; 
 0192           ;    // 检查器件是否可用 
 0192           ;    if( TWSR == TW_MT_SLA_ACK) 
 0192 81B1              in R24,0x1
 0194 8831              cpi R24,24
 0196 51F4              brne L38
 0198                   .dbline 205
 0198           ;    { 
 0198 06C0              xjmp L41
 019A           L40:
 019A                   .dbline 208
 019A                   .dbline 209
 019A FB01              movw R30,R22
 019C 0191              ld R16,Z+
 019E BF01              movw R22,R30
 01A0 7CDF              xcall _i2cSendByte
 01A2                   .dbline 210
 01A2 77DF              xcall _i2cWaitForComplete
 01A4                   .dbline 211
 01A4 AA94              dec R10
 01A6                   .dbline 212
 01A6           L41:
 01A6                   .dbline 207
 01A6           ;       // 发送数据 
 01A6           ;       while(length) 
 01A6 AA20              tst R10
 01A8 C1F7              brne L40
 01AA                   .dbline 213
 01AA           ;       { 

⌨️ 快捷键说明

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