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

📄 twi_1.s

📁 AVR单片机平台Atmega32+CH375A芯片读写U盘代码
💻 S
📖 第 1 页 / 共 3 页
字号:
; 
;    // 发送开始条件 
;    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 + -