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

📄 twi_master_drv.s

📁 at90can128底层驱动 有SPI,TWI,总线,CAN接口等
💻 S
📖 第 1 页 / 共 2 页
字号:
	adc R31,R3
	lds R2,187
	std z+0,R2
	.dbline 180
;     Twi_set_stop();
	lds R24,188
	ori R24,16
	sts 188,R24
	.dbline 181
;     twi_busy = FALSE;
	clr R2
	sts _twi_busy,R2
	.dbline 182
;     twi_err  = TWI_RECEIVE_OK;
	ldi R24,1
	sts _twi_err,R24
	.dbline 183
;     break;
	xjmp L5
L4:
	.dbline 187
	lds R24,188
	ori R24,16
	sts 188,R24
	.dbline 188
	clr R2
	sts _twi_busy,R2
	.dbline 189
	ldi R24,6
	sts _twi_err,R24
	.dbline 190
L5:
	.dbline -2
L3:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e twi_send_message_polling _twi_send_message_polling fc
;           info -> y+6
;        nbbytes -> y+4
;             rw -> R20
;     slave_addr -> R22
	.even
_twi_send_message_polling::
	xcall push_gset2
	mov R20,R18
	mov R22,R16
	.dbline -1
	.dbline 213
; 
;     //if we arrived here, unknown state has occurred.....
;     default :
;     Twi_set_stop();
;     twi_busy = FALSE;
;     twi_err  = TWI_UNKNOWN;
;     break;
;     }
; }
; 
; /*****************************************************************************
; 函数介绍:TWI主机模式,查询方式
; 输入参数:	slave_addr:从机地址
; 			rw:=TWI_WRITE发送模式;=TWI_READ接收模式
; 			nbbytes:最大字节数
; 			*info:数据缓存地址
; 输出参数:
; 返回值:twi_err:TWI通讯状态
;  - TWI_TRANSFER_OK		发送完成
;  - TWI_RECEIVE_OK		接收完成
;  - TWI_BUS_ERROR		总线冲突
;  - TWI_HOST_ADR_NACK	从机地址无应答
;  - TWI_HOST_DATA_NACK	从机数据无应答(不存在)
;  - TWI_ARBITRATION_LOST	仲裁失败
;  - TWI_UNKNOWN			TWI状态错误	                
;  - TWI_NOT_FREE			TWI通信忙
;  - TWI_OK				TWI通信开始
; *****************************************************************************/
; unsigned char twi_send_message_polling( uchar slave_addr,uchar rw, uchar nbbytes, uchar *info )
; {
	.dbline 214
;   twi_message.address = slave_addr;
	sts _twi_message,R22
	.dbline 215
;   twi_message.rw = rw;
	sts _twi_message+1,R20
	.dbline 216
;   twi_message.nbbytes = nbbytes;
	ldd R0,y+4
	sts _twi_message+2,R0
	.dbline 217
;   twi_message.buf = info;
	ldd R0,y+6
	ldd R1,y+7
	sts _twi_message+3+1,R1
	sts _twi_message+3,R0
L60:
	.dbline 218
L61:
	.dbline 218
;   Twi_wait_hw_stop();
	lds R2,188
	clr R3
	sbrc R2,4
	rjmp L60
	.dbline 219
;   Disable_twi_interrupt(); //FIXME
	lds R24,188
	andi R24,254
	sts 188,R24
	.dbline 220
;   twi_nb_transmited=0;
	clr R2
	sts _twi_nb_transmited,R2
	.dbline 221
;   if (!twi_busy)
	lds R2,_twi_busy
	tst R2
	brne L63
	.dbline 222
;   {
	.dbline 223
;     twi_busy =1;
	ldi R24,1
	sts _twi_busy,R24
	.dbline 224
;     twi_err = TWI_OK;
	ldi R24,8
	sts _twi_err,R24
	.dbline 225
;     Twi_set_start();
	lds R24,188
	ori R24,32
	sts 188,R24
	xjmp L66
X17:
	.dbline 227
;     while (twi_busy)
;         {
L68:
	.dbline 228
L69:
	.dbline 228
	lds R24,188
	andi R24,128
	cpi R24,128
	brne L68
	.dbline 229
	xcall _twi_decode_status
	.dbline 231
L66:
	.dbline 226
	lds R2,_twi_busy
	tst R2
	brne L69
	.dbline 233
;         Twi_wait_event();
;         twi_decode_status();
; //        Twi_clear_si(); //REMOVE FROM MAIN LOOP, ADDED IN ALL NECESARY CASE (See JSB /RLE)
;         }
;    // Twi_set_stop(); RLE
;     return twi_err;
	lds R16,_twi_err
	xjmp L56
L63:
	.dbline 235
;   }
;   Twi_set_stop();
	lds R24,188
	ori R24,16
	sts 188,R24
	.dbline 236
;   return TWI_NOT_FREE;
	ldi R16,7
	.dbline -2
L56:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym l info 6 pc
	.dbsym l nbbytes 4 c
	.dbsym r rw 20 c
	.dbsym r slave_addr 22 c
	.dbend
	.dbfunc e twi_send_message_interrupt _twi_send_message_interrupt fc
;           info -> y+2
;        nbbytes -> y+0
;             rw -> R18
;     slave_addr -> R16
	.even
_twi_send_message_interrupt::
	.dbline -1
	.dbline 258
; }
; 
; /*****************************************************************************
; 函数介绍:TWI主机模式,中断方式
; 输入参数:	slave_addr:从机地址
; 			rw:=TWI_WRITE发送模式;=TWI_READ接收模式
; 			nbbytes:最大字节数
; 			*info:数据缓存地址
; 输出参数:
; 返回值:twi_err:TWI通讯状态
;  - TWI_TRANSFER_OK		发送完成
;  - TWI_RECEIVE_OK		接收完成
;  - TWI_BUS_ERROR		总线冲突
;  - TWI_HOST_ADR_NACK	从机地址无应答
;  - TWI_HOST_DATA_NACK	从机数据无应答(不存在)
;  - TWI_ARBITRATION_LOST	仲裁失败
;  - TWI_UNKNOWN			TWI状态错误	                         //接受复位
;  - TWI_NOT_FREE			TWI通信忙
;  - TWI_OK				TWI通信开始
; *****************************************************************************/
; unsigned char twi_send_message_interrupt( uchar slave_addr,uchar rw, uchar nbbytes, uchar *info)
; {
	.dbline 259
;   twi_message.address = slave_addr;
	sts _twi_message,R16
	.dbline 260
;   twi_message.rw = rw;
	sts _twi_message+1,R18
	.dbline 261
;   twi_message.nbbytes = nbbytes;
	ldd R0,y+0
	sts _twi_message+2,R0
	.dbline 262
;   twi_message.buf = info;
	ldd R0,y+2
	ldd R1,y+3
	sts _twi_message+3+1,R1
	sts _twi_message+3,R0
L75:
	.dbline 263
L76:
	.dbline 263
;   Twi_wait_hw_stop();
	lds R2,188
	clr R3
	sbrc R2,4
	rjmp L75
	.dbline 264
;   twi_nb_transmited=0;
	clr R2
	sts _twi_nb_transmited,R2
	.dbline 265
;   if (!twi_busy)
	lds R2,_twi_busy
	tst R2
	brne L78
	.dbline 266
;   {
	.dbline 267
;     twi_err = TWI_OK;
	ldi R24,8
	sts _twi_err,R24
	.dbline 268
;     twi_busy =1;
	ldi R24,1
	sts _twi_busy,R24
	.dbline 269
;     Enable_twi_interrupt();
	lds R24,188
	ori R24,1
	sts 188,R24
	.dbline 270
;     Twi_set_start();
	lds R24,188
	ori R24,32
	sts 188,R24
	.dbline 271
;     return twi_err;
	lds R16,_twi_err
	xjmp L71
L78:
	.dbline 273
;   }
;   Twi_set_stop();
	lds R24,188
	ori R24,16
	sts 188,R24
	.dbline 274
;   return TWI_NOT_FREE;
	ldi R16,7
	.dbline -2
L71:
	.dbline 0 ; func end
	ret
	.dbsym l info 2 pc
	.dbsym l nbbytes 0 c
	.dbsym r rw 18 c
	.dbsym r slave_addr 16 c
	.dbend
	.area vector(rom, abs)
	.org 140
	jmp _twi_interrupt
	.area text(rom, con, rel)
	.dbfile F:\zzz\i2c-master\twi_master_drv.c
	.dbfunc e twi_interrupt _twi_interrupt fV
	.even
_twi_interrupt::
	xcall push_lset
	.dbline -1
	.dbline 287
; }
; 
; /*****************************************************************************
; 函数介绍:TWI中断例程
; 输入参数:
; 输出参数:
; 返回值:无
; *****************************************************************************/
; //#pragma vector = TWI_vect
; //__interrupt void twi_interrupt()
; #pragma interrupt_handler twi_interrupt:36
; void twi_interrupt()
; {
	.dbline 288
;   twi_decode_status();
	xcall _twi_decode_status
	.dbline -2
L80:
	xcall pop_lset
	.dbline 0 ; func end
	reti
	.dbend
	.dbfunc e TWI_MW _TWI_MW fV
;           info -> y+8
;        nbbytes -> R22
;     slave_addr -> R20
	.even
_TWI_MW::
	xcall push_gset2
	mov R22,R18
	mov R20,R16
	sbiw R28,4
	.dbline -1
	.dbline 301
; //  Twi_clear_si(); //REMOVE FROM MAIN LOOP, ADDED IN ALL NECESARY CASE (See JSB /RLE)
; }
; 
; /*****************************************************************************
; 函数介绍:主机发送模式
; 输入参数:	slave_addr:从机地址
; 			nbbytes:最大字节数
; 			*info:数据缓存地址
; 输出参数:
; 返回值:无
; *****************************************************************************/
; void TWI_MW(uchar slave_addr,uchar nbbytes,uchar *info)    //用户程序
; {
	.dbline 303
; 	//twi_send_message_polling(slave_addr, TWI_WRITE, nbbytes, info);	//查询方式
; 	twi_send_message_interrupt(slave_addr, TWI_WRITE, nbbytes, info);	//中断方式
	ldd R0,y+8
	ldd R1,y+9
	std y+3,R1
	std y+2,R0
	std y+0,R22
	clr R18
	mov R16,R20
	xcall _twi_send_message_interrupt
	.dbline -2
L81:
	adiw R28,4
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym l info 8 pc
	.dbsym r nbbytes 22 c
	.dbsym r slave_addr 20 c
	.dbend
	.dbfunc e TWI_MR _TWI_MR fV
;           info -> y+8
;        nbbytes -> R22
;     slave_addr -> R20
	.even
_TWI_MR::
	xcall push_gset2
	mov R22,R18
	mov R20,R16
	sbiw R28,4
	.dbline -1
	.dbline 315
; }
; 
; /*****************************************************************************
; 函数介绍:主机接收模式
; 输入参数:	slave_addr:从机地址
; 			nbbytes:最大字节数
; 			*info:数据缓存地址
; 输出参数:
; 返回值:无
; *****************************************************************************/
; void TWI_MR(uchar slave_addr,uchar nbbytes,uchar *info)
; {
	.dbline 317
; 	//twi_send_message_polling(slave_addr, TWI_READ, nbbytes, info);	//查询方式
; 	twi_send_message_interrupt(slave_addr, TWI_READ, nbbytes, info);	//中断方式
	ldd R0,y+8
	ldd R1,y+9
	std y+3,R1
	std y+2,R0
	std y+0,R22
	ldi R18,1
	mov R16,R20
	xcall _twi_send_message_interrupt
	.dbline -2
L82:
	adiw R28,4
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym l info 8 pc
	.dbsym r nbbytes 22 c
	.dbsym r slave_addr 20 c
	.dbend
	.area lit(rom, con, rel)
L84:
	.byte 144,'U
	.byte 'U
	.area text(rom, con, rel)
	.dbfile F:\zzz\i2c-master\twi_master_drv.c
	.dbfunc e main _main fV
;        Mkeybuf -> y+5
;        Mdisbuf -> y+2
;              i -> R20,R21
	.even
_main::
	sbiw R28,9
	.dbline -1
	.dbline 323
; }
; 
; 
; 
; void main(void)
; {
	.dbline 326
; int i;
; 	
; 	uchar Mdisbuf[3]={0x90,0x55,0x55};
	ldi R24,<L84
	ldi R25,>L84
	movw R30,R28
	adiw R30,2
	ldi R16,3
	ldi R17,0
	st -y,R31
	st -y,R30
	st -y,R25
	st -y,R24
	xcall asgncblk
	.dbline 329
; 	uchar Mkeybuf[4];
; 	
; 	twi_busy = 0;
	clr R2
	sts _twi_busy,R2
	.dbline 331
; 	
; 	CLI();
	cli
	.dbline 332
; 	twi_lib_init();
	xcall _twi_lib_init
	.dbline 333
; 	SEI();
	sei
	xjmp L86
L85:
	.dbline 341
; 	
; 
; /*while(1)	
; 	if(!twi_busy)
; 		TWI_MR(0x4F, 2, Mkeybuf);  //向从机温度传感器0x4F读取2个数据	
; */
; while(1)
; {	
	.dbline 342
; 	if(!twi_busy)	
	lds R2,_twi_busy
	tst R2
	brne L88
	.dbline 343
; 		TWI_MR(0x21, 4, Mkeybuf);
	movw R24,R28
	adiw R24,5
	std y+1,R25
	std y+0,R24
	ldi R18,4
	ldi R16,33
	xcall _TWI_MR
L88:
	.dbline 345
; 	
; 	if(!twi_busy){
	lds R2,_twi_busy
	tst R2
	brne L90
	.dbline 345
	.dbline 346
; 		Mdisbuf[2]=0x09;//点亮			
	ldi R24,9
	std y+4,R24
	.dbline 347
; 		TWI_MW(0x21, 3, Mdisbuf); //向从机0x21写入3个数据
	movw R24,R28
	adiw R24,2
	std y+1,R25
	std y+0,R24
	ldi R18,3
	ldi R16,33
	xcall _TWI_MW
	.dbline 348
; 	}
L90:
	.dbline 349
	clr R20
	clr R21
L93:
	.dbline 349
L94:
	.dbline 349
; 	for(i=0;i<2000;i++);
	subi R20,255  ; offset = 1
	sbci R21,255
	.dbline 349
	cpi R20,208
	ldi R30,7
	cpc R21,R30
	brlt L93
	.dbline 350
; 	if(!twi_busy){
	lds R2,_twi_busy
	tst R2
	brne L97
	.dbline 350
	.dbline 351
; 		Mdisbuf[2]=0x89;//灭			
	ldi R24,137
	std y+4,R24
	.dbline 352
; 		TWI_MW(0x21, 3, Mdisbuf); //向从机0x21写入3个数据
	movw R24,R28
	adiw R24,2
	std y+1,R25
	std y+0,R24
	ldi R18,3
	ldi R16,33
	xcall _TWI_MW
	.dbline 353
; 	}
L97:
	.dbline 354
	clr R20
	clr R21
L100:
	.dbline 354
L101:
	.dbline 354
	subi R20,255  ; offset = 1
	sbci R21,255
	.dbline 354
	cpi R20,208
	ldi R30,7
	cpc R21,R30
	brlt L100
	.dbline 355
L86:
	.dbline 340
	xjmp L85
L104:
	.dbline 361
L105:
	.dbline 361
	xjmp L104
X18:
	.dbline -2
L83:
	adiw R28,9
	.dbline 0 ; func end
	ret
	.dbsym l Mkeybuf 5 A[4:4]c
	.dbsym l Mdisbuf 2 A[3:3]c
	.dbsym r i 20 I
	.dbend
	.area bss(ram, con, rel)
	.dbfile F:\zzz\i2c-master\twi_master_drv.c
_twi_nb_transmited::
	.blkb 1
	.dbsym e twi_nb_transmited _twi_nb_transmited c
_twi_err::
	.blkb 1
	.dbsym e twi_err _twi_err c
_twi_busy::
	.blkb 1
	.dbsym e twi_busy _twi_busy c
_twi_message::
	.blkb 5
	.dbstruct 0 5 .1
	.dbfield 0 address c
	.dbfield 1 rw c
	.dbfield 2 nbbytes c
	.dbfield 3 buf pc
	.dbend
	.dbsym e twi_message _twi_message S[.1]

⌨️ 快捷键说明

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