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