📄 twi_1.s
字号:
;
; // 发送开始条件
; i2cSendStart();
xcall _i2cSendStart
.dbline 197
; i2cWaitForComplete();
xcall _i2cWaitForComplete
.dbline 200
;
; // 发送器件写地址
; i2cSendByte( deviceAddr & 0xFE );
mov R16,R12
andi R16,254
xcall _i2cSendByte
.dbline 201
; i2cWaitForComplete();
xcall _i2cWaitForComplete
.dbline 204
;
; // 检查器件是否可用
; if( TWSR == TW_MT_SLA_ACK)
in R24,0x1
cpi R24,24
brne L38
.dbline 205
; {
xjmp L41
L40:
.dbline 208
.dbline 209
movw R30,R22
ld R16,Z+
movw R22,R30
xcall _i2cSendByte
.dbline 210
xcall _i2cWaitForComplete
.dbline 211
dec R10
.dbline 212
L41:
.dbline 207
; // 发送数据
; while(length)
tst R10
brne L40
.dbline 213
; {
; i2cSendByte( *data++ );
; i2cWaitForComplete();
; length--;
; }
; }
xjmp L39
L38:
.dbline 215
; else
; {
.dbline 218
; // 如未回应器件地址,停止发送,返回错误
;
; retval = I2C_ERROR_NODEV;
ldi R20,1
.dbline 219
; }
L39:
.dbline 222
;
; // 发送停止条件,保持TWEA以便从接收
; i2cSendStop();
xcall _i2cSendStop
L43:
.dbline 223
L44:
.dbline 223
; while( !(TWCR&(1<<TWSTO)) );
in R2,0x36
sbrs R2,4
rjmp L43
.dbline 226
;
; // 开I2C中断
; TWCR|=(1<<TWIE);
in R24,0x36
ori R24,1
out 0x36,R24
.dbline 228
;
; return retval;
mov R16,R20
.dbline -2
L37:
xcall pop_gset4
.dbline 0 ; func end
ret
.dbsym r retval 20 c
.dbsym r data 22 pc
.dbsym r length 10 c
.dbsym r deviceAddr 12 c
.dbend
.dbfunc e i2cMasterReceiveNI _i2cMasterReceiveNI fc
; retval -> R20
; data -> R22,R23
; length -> R10
; deviceAddr -> R12
.even
_i2cMasterReceiveNI::
xcall push_gset4
mov R10,R18
mov R12,R16
ldd R22,y+8
ldd R23,y+9
.dbline -1
.dbline 236
; }
;
; /************************************************************************/
; /* 无中断主机数据接收
; */
; /************************************************************************/
; unsigned char i2cMasterReceiveNI(unsigned char deviceAddr, unsigned char length, unsigned char *data)
; {
.dbline 237
; unsigned char retval = I2C_OK;
clr R20
.dbline 240
;
; // 关I2C中断
; TWCR&=~(1<<TWIE);
in R24,0x36
andi R24,254
out 0x36,R24
.dbline 243
;
; //发送开始条件
; i2cSendStart();
xcall _i2cSendStart
.dbline 244
; i2cWaitForComplete();
xcall _i2cWaitForComplete
.dbline 247
;
; // 发送器件读地址
; i2cSendByte( deviceAddr | 0x01 );
mov R16,R12
ori R16,1
xcall _i2cSendByte
.dbline 248
; i2cWaitForComplete();
xcall _i2cWaitForComplete
.dbline 251
;
; // 检查器件是否可用
; if( TWSR == TW_MR_SLA_ACK)
in R24,0x1
cpi R24,64
brne L47
.dbline 252
; {
xjmp L50
L49:
.dbline 255
.dbline 256
ldi R16,1
xcall _i2cReceiveByte
.dbline 257
xcall _i2cWaitForComplete
.dbline 258
xcall _i2cGetReceivedByte
movw R30,R22
st Z+,R16
movw R22,R30
.dbline 259
dec R10
.dbline 260
L50:
.dbline 254
; // 接收数据并回应
; while(length > 1)
ldi R24,1
cp R24,R10
brlo L49
.dbline 263
; {
; i2cReceiveByte(TRUE);
; i2cWaitForComplete();
; *data++ = i2cGetReceivedByte();
; length--;
; }
;
; // 接收数据无回应 (末位信号)
; i2cReceiveByte(FALSE);
clr R16
xcall _i2cReceiveByte
.dbline 264
; i2cWaitForComplete();
xcall _i2cWaitForComplete
.dbline 265
; *data++ = i2cGetReceivedByte();
xcall _i2cGetReceivedByte
movw R30,R22
st Z+,R16
movw R22,R30
.dbline 266
; }
xjmp L48
L47:
.dbline 268
; else
; {
.dbline 270
; // 如未回应器件地址,停止发送,返回错误
; retval = I2C_ERROR_NODEV;
ldi R20,1
.dbline 271
; }
L48:
.dbline 274
;
; // 发送停止条件,保持TWEA以便从接收
; i2cSendStop();
xcall _i2cSendStop
.dbline 277
;
; // 开I2C中断
; TWCR|=TWIE;
in R2,0x36
out 0x36,R2
.dbline 279
;
; return retval;
mov R16,R20
.dbline -2
L46:
xcall pop_gset4
.dbline 0 ; func end
ret
.dbsym r retval 20 c
.dbsym r data 22 pc
.dbsym r length 10 c
.dbsym r deviceAddr 12 c
.dbend
.dbfunc e i2cGetState _i2cGetState fc
.even
_i2cGetState::
.dbline -1
.dbline 283
; }
;
; eI2cStateType i2cGetState(void)
; {
.dbline 284
; return I2cState;
lds R16,_I2cState
.dbline -2
L52:
.dbline 0 ; func end
ret
.dbend
.area vector(rom, abs)
.org 76
jmp _twi_isr
.area text(rom, con, rel)
.dbfile E:\xm\jxf\u盘读写模块\code\udisk_test0827\twi_1.c
.dbfunc e twi_isr _twi_isr fV
; status -> R20
.even
_twi_isr::
xcall push_lset
xcall push_gset1
.dbline -1
.dbline 290
; }
;
; // I2C (TWI) 中断服务程序
; #pragma interrupt_handler twi_isr:iv_TWI
; void twi_isr(void)
; {
.dbline 293
; //读状态位
; unsigned char status;
; status = TWSR & TWSR_STATUS_MASK;
in R20,0x1
andi R20,248
.dbline 294
; switch(status)
clr R21
cpi R20,104
ldi R30,0
cpc R21,R30
brne X4
xjmp L72
X4:
ldi R24,104
ldi R25,0
cp R24,R20
cpc R25,R21
brge X5
xjmp L86
X5:
L85:
cpi R20,48
ldi R30,0
cpc R21,R30
brne X6
xjmp L62
X6:
ldi R24,48
ldi R25,0
cp R24,R20
cpc R25,R21
brge X7
xjmp L88
X7:
L87:
cpi R20,16
ldi R30,0
cpc R21,R30
brne X8
xjmp L57
X8:
ldi R24,16
ldi R25,0
cp R24,R20
cpc R25,R21
brlt L90
L89:
cpi R20,0
cpc R20,R21
brne X9
xjmp L84
X9:
X1:
cpi R20,0
ldi R30,0
cpc R21,R30
brge X10
xjmp L54
X10:
L91:
cpi R20,8
ldi R30,0
cpc R21,R30
brne X11
xjmp L57
X11:
xjmp L54
L90:
cpi R20,32
ldi R30,0
cpc R21,R30
brne X12
xjmp L62
X12:
ldi R24,32
ldi R25,0
cp R24,R20
cpc R25,R21
brlt L93
L92:
cpi R20,24
ldi R30,0
cpc R21,R30
brne X13
xjmp L58
X13:
xjmp L54
L93:
cpi R20,40
ldi R30,0
cpc R21,R30
brne X14
xjmp L58
X14:
xjmp L54
L88:
cpi R20,72
ldi R30,0
cpc R21,R30
brne X15
xjmp L62
X15:
ldi R24,72
ldi R25,0
cp R24,R20
cpc R25,R21
brlt L95
L94:
cpi R20,56
ldi R30,0
cpc R21,R30
brne X16
xjmp L63
X16:
cpi R20,56
ldi R30,0
cpc R21,R30
brge X17
xjmp L54
X17:
L96:
cpi R20,64
ldi R30,0
cpc R21,R30
brne X18
xjmp L65
X18:
xjmp L54
L95:
cpi R20,88
ldi R30,0
cpc R21,R30
brne X19
xjmp L61
X19:
ldi R24,88
ldi R25,0
cp R24,R20
cpc R25,R21
brlt L98
L97:
cpi R20,80
ldi R30,0
cpc R21,R30
brne X20
xjmp L64
X20:
xjmp L54
L98:
cpi R20,96
ldi R30,0
cpc R21,R30
brne X21
xjmp L72
X21:
xjmp L54
L86:
cpi R20,160
ldi R30,0
cpc R21,R30
brne X22
xjmp L77
X22:
ldi R24,160
ldi R25,0
cp R24,R20
cpc R25,R21
brge X23
xjmp L100
X23:
L99:
cpi R20,128
ldi R30,0
cpc R21,R30
brne X24
xjmp L73
X24:
ldi R24,128
ldi R25,0
cp R24,R20
cpc R25,R21
brlt L102
L101:
cpi R20,112
ldi R30,0
cpc R21,R30
brne X25
xjmp L72
X25:
cpi R20,112
ldi R30,0
cpc R21,R30
brge X26
xjmp L54
X26:
L103:
cpi R20,120
ldi R30,0
cpc R21,R30
brne X27
xjmp L72
X27:
xjmp L54
L102:
cpi R20,144
ldi R30,0
cpc R21,R30
brne X28
xjmp L73
X28:
ldi R24,144
ldi R25,0
cp R24,R20
cpc R25,R21
brlt L105
L104:
cpi R20,136
ldi R30,0
cpc R21,R30
brne X29
xjmp L76
X29:
xjmp L54
L105:
cpi R20,152
ldi R30,0
cpc R21,R30
brne X30
xjmp L76
X30:
xjmp L54
L100:
cpi R20,184
ldi R30,0
cpc R21,R30
brne X31
xjmp L79
X31:
ldi R24,184
ldi R25,0
cp R24,R20
cpc R25,R21
brlt L107
L106:
cpi R20,168
ldi R30,0
cpc R21,R30
brne X32
xjmp L78
X32:
cpi R20,168
ldi R30,0
cpc R21,R30
brge X33
xjmp L54
X33:
L108:
cpi R20,176
ldi R30,0
cpc R21,R30
brne X34
xjmp L78
X34:
xjmp L54
L107:
cpi R20,200
ldi R30,0
cpc R21,R30
brne X35
xjmp L82
X35:
ldi R24,200
ldi R25,0
cp R24,R20
cpc R25,R21
brlt L110
L109:
cpi R20,192
ldi R30,0
cpc R21,R30
brne X36
xjmp L82
X36:
xjmp L54
L110:
cpi R20,248
ldi R30,0
cpc R21,R30
brne X37
xjmp L55
X37:
xjmp L54
X2:
.dbline 295
; {
L57:
.dbline 300
; // 主方式
; case TW_START: // 0x08: START 已发送
; case TW_REP_START: // 0x10: 重复START 已发送
; // 发送器件地址
; i2cSendByte(I2cDeviceAddrRW);
lds R16,_I2cDeviceAddrRW
xcall _i2cSendByte
.dbline 301
; I2cNotAck = 0;
clr R2
sts _I2cNotAck,R2
.dbline 302
; break;
xjmp L55
L58:
.dbline 308
;
; // 主发送,主接收状态码
; case TW_MT_SLA_ACK: // 0x18: SLA+W 已发送;接收到ACK
; case TW_MT_DATA_ACK: // 0x28: 数据已发送;接收到ACK
;
; if(I2cSendDataIndex < I2cSendDataLength)
lds R2,_I2cSendDataLength
lds R3,_I2cSendDataLength+1
lds R4,_I2cSendDataIndex
lds R5,_I2cSendDataIndex+1
cp R4,R2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -