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

📄 twi.s

📁 mp3代码 要用的干净下啊 希望用东西共享啊
💻 S
📖 第 1 页 / 共 4 页
字号:
	sub R16,R2
	.dbline -2
L18:
	xcall pop_gset5
	.dbline 0 ; func end
	ret
	.dbsym r result 20 c
	.dbsym r i 22 c
	.dbsym r data 10 pc
	.dbsym r length 12 c
	.dbsym r deviceAddr 14 c
	.dbend
	.dbfunc e Twi_MasterReceive _Twi_MasterReceive fc
;         result -> R20
;              i -> R22
;           data -> R10,R11
;         length -> R12
;     deviceAddr -> R20
	.even
_Twi_MasterReceive::
	xcall push_gset4
	mov R12,R18
	mov R20,R16
	ldd R10,y+8
	ldd R11,y+9
	.dbline -1
	.dbline 207
; 	 }
; } 
; /*********************************************************************************************************
; ** 函数名称:Twi_MasterReceive
; ** 功能描述:主模式接收
; ** 输 入:  deviceAddr:从机地址
; **          length:数据长度
; **          * data  缓冲区指针
; **
; ** 输  出:  返回接收到的字节数           
; ** 全局变量: 
; ** 调用模块: 
; ** 说明:
; ** 注意:    
; ** 日 期:   2006年8月29日
; ********************************************************************************************************/
; 
; uint8 Twi_MasterReceive(uint8 deviceAddr, uint8 length, uint8* data) 
; { 
	.dbline 209
;    uint8 i,result; 
;    WDR(); //喂狗;
	wdr
L52:
	.dbline 211
L53:
	.dbline 211
;    // 等待总线准备完成 
;    while(Twi_State); 
	lds R2,_Twi_State
	tst R2
	brne L52
	.dbline 213
;    // 设置状态 
;    Twi_State = TWI_MASTER_RX; 
	ldi R24,3
	sts _Twi_State,R24
	.dbline 215
;    // 保存数据 
;    Twi_DeviceAddrRW = (deviceAddr|0x01);   // RW 为1 : 读操作
	mov R24,R20
	ori R24,1
	sts _Twi_DeviceAddrRW,R24
	.dbline 217
;    
;    if(Twi_ReceiveBuffer.status==TWI_DATA_FREE)  
	lds R2,_Twi_ReceiveBuffer+7
	tst R2
	brne L55
	.dbline 218
;          {
	.dbline 219
; 		 InitQueue(&Twi_ReceiveBuffer);            //清空上次发送的信息
	ldi R16,<_Twi_ReceiveBuffer
	ldi R17,>_Twi_ReceiveBuffer
	xcall _InitQueue
	.dbline 220
;          Twi_ReceiveBuffer.status=TWI_DATA_RECEIVE;
	ldi R24,1
	sts _Twi_ReceiveBuffer+7,R24
	.dbline 221
; 		 Twi_ReceiveBuffer.memo=length; 
	sts _Twi_ReceiveBuffer+8,R12
	.dbline 222
; 		 }
L55:
	.dbline 225
;  
;    // 发送开始条件 
;    Twi_Start(); 
	in R24,0x36
	andi R24,15
	ori R24,160
	out 0x36,R24
	.dbline 226
;    WDR(); //喂狗;
	wdr
L60:
	.dbline 228
L61:
	.dbline 228
;    //等待数据准备好 
;    while(Twi_State);                           //注意有可能引起死循环
	lds R2,_Twi_State
	tst R2
	brne L60
	.dbline 229
;    WDR(); //喂狗;
	wdr
	.dbline 230
;    i=0;
	clr R22
	xjmp L64
L63:
	.dbline 232
;    while(((TwiErrorCode==TW_MR_SLA_NACK)||(TwiErrorCode==TW_MR_ARB_LOST)||(TwiErrorCode==TW_MR_DATA_NACK))&&i<TWI_FAIL_MAX)  //器件不响应或总线仲裁失败
;          {
	.dbline 233
; 		 i++;
	inc R22
	.dbline 234
; 		 if((TwiErrorCode==TW_MR_DATA_NACK)&&(Twi_ReceiveBuffer.count>=length))
	lds R24,_TwiErrorCode
	cpi R24,88
	brne L66
	lds R2,_Twi_ReceiveBuffer+2
	cp R2,R12
	brlo L66
	.dbline 235
; 	         {
	.dbline 236
; 			 break;
	xjmp L65
L66:
	.dbline 239
; 			 }
; 		 //Twi_Stop();
; 		 Delay(255);
	ldi R16,255
	xcall _Delay
	.dbline 240
; 		 Twi_State = TWI_MASTER_RX; 
	ldi R24,3
	sts _Twi_State,R24
	.dbline 241
; 		 Twi_Start();
	in R24,0x36
	andi R24,15
	ori R24,160
	out 0x36,R24
	.dbline 242
; 		 WDR(); //喂狗;
	wdr
L69:
	.dbline 243
L70:
	.dbline 243
	lds R2,_Twi_State
	tst R2
	brne L69
	.dbline 244
	wdr
	.dbline 245
L64:
	.dbline 231
	lds R24,_TwiErrorCode
	cpi R24,72
	breq L74
	lds R24,_TwiErrorCode
	cpi R24,56
	breq L74
	lds R24,_TwiErrorCode
	cpi R24,88
	brne L72
L74:
	cpi R22,20
	brlo L63
L72:
L65:
	.dbline 247
; 		 while(Twi_State);
; 		 WDR(); //喂狗;
; 		 }
; 	   // 取数据 
;    for(result=0; (result<length)&&(Twi_ReceiveBuffer.count>0); result++) 
	clr R20
	xjmp L78
L75:
	.dbline 248
	ldi R16,<_Twi_ReceiveBuffer
	ldi R17,>_Twi_ReceiveBuffer
	xcall _DeQueue
	movw R30,R10
	st Z+,R16
	movw R10,R30
L76:
	.dbline 247
	inc R20
L78:
	.dbline 247
	cp R20,R12
	brsh L80
	clr R2
	lds R3,_Twi_ReceiveBuffer+2
	cp R2,R3
	brlo L75
L80:
	.dbline 249
;       *data++ = DeQueue(&Twi_ReceiveBuffer);
;    Twi_ReceiveBuffer.status=TWI_DATA_FREE;
	clr R2
	sts _Twi_ReceiveBuffer+7,R2
	.dbline 250
;    if(i>=TWI_FAIL_MAX) 
	cpi R22,20
	brlo L82
	.dbline 251
;      {
	.dbline 252
; 	 return (FALSE);
	clr R16
	xjmp L51
L82:
	.dbline 255
; 	 }
;    else
;      {
	.dbline 256
; 	 return (result);    //返回接收到的字节数;
	mov R16,R20
	.dbline -2
L51:
	xcall pop_gset4
	.dbline 0 ; func end
	ret
	.dbsym r result 20 c
	.dbsym r i 22 c
	.dbsym r data 10 pc
	.dbsym r length 12 c
	.dbsym r deviceAddr 20 c
	.dbend
	.dbfunc e Twi_MasterSendNI _Twi_MasterSendNI fc
;         retval -> R20
;           data -> R22,R23
;         length -> R18
;     deviceAddr -> R16
	.even
_Twi_MasterSendNI::
	xcall push_gset2
	ldd R22,y+4
	ldd R23,y+5
	.dbline -1
	.dbline 273
; 	 }
; } 
; /*********************************************************************************************************
; ** 函数名称:Twi_MasterSendNI
; ** 功能描述:主模式非中断发送
; ** 输 入:  deviceAddr:从机地址
; **          length:数据长度
; **          * data  缓冲区指针
; ** 输  出:             
; ** 全局变量: 
; ** 调用模块: 
; ** 说明:
; ** 注意:    
; ** 日 期:   2006年8月29日
; ********************************************************************************************************/
; uint8 Twi_MasterSendNI(uint8 deviceAddr, uint8 length, uint8* data) 
; { 
	.dbline 274
;    uint8 retval = TWI_OK; 
	clr R20
	.dbline 275
;    WDR(); //喂狗;
	wdr
	.dbline 277
;    // 关Twi_中断 
;    TWCR&=~(1<<TWIE); 
	in R24,0x36
	andi R24,254
	out 0x36,R24
	.dbline 278
;    WDR(); //喂狗;
	wdr
	.dbline 280
;    // 发送开始条件 
;    Twi_Start(); 
	in R24,0x36
	andi R24,15
	ori R24,160
	out 0x36,R24
	.dbline 281
;    WDR(); //喂狗;
	wdr
	.dbline 282
L85:
	.dbline 282
L86:
	.dbline 282
;    Twi_WaitForComplete(); 
	in R2,0x36
	sbrs R2,7
	rjmp L85
	.dbline 282
	.dbline 282
	.dbline 284
;    // 发送器件写地址 
;    Twi_SendByte( deviceAddr & 0xFE ); 
	.dbline 284
	mov R24,R16
	andi R24,254
	out 0x3,R24
	.dbline 284
	in R24,0x36
	andi R24,15
	ori R24,128
	out 0x36,R24
	.dbline 284
	.dbline 284
	.dbline 285
L88:
	.dbline 285
L89:
	.dbline 285
;    Twi_WaitForComplete(); 
	in R2,0x36
	sbrs R2,7
	rjmp L88
	.dbline 285
	.dbline 285
	.dbline 287
;    // 检查器件是否可用 
;    if( TWSR == TW_MT_SLA_ACK) 
	in R24,0x1
	cpi R24,24
	brne L91
	.dbline 288
;    { 
	xjmp L94
L93:
	.dbline 291
;       // 发送数据 
;       while(length) 
;       { 
	.dbline 292
;          Twi_SendByte( *data++ ); 
	.dbline 292
	movw R30,R22
	ld R2,Z+
	movw R22,R30
	out 0x3,R2
	.dbline 292
	in R24,0x36
	andi R24,15
	ori R24,128
	out 0x36,R24
	.dbline 292
	.dbline 292
	.dbline 293
L96:
	.dbline 293
L97:
	.dbline 293
	in R2,0x36
	sbrs R2,7
	rjmp L96
	.dbline 293
	.dbline 293
	.dbline 294
	dec R18
	.dbline 295
	wdr
	.dbline 296
L94:
	.dbline 290
	tst R18
	brne L93
	.dbline 297
;          Twi_WaitForComplete(); 
;          length--; 
; 		 WDR(); //喂狗;
;       } 
;    } 
	xjmp L92
L91:
	.dbline 299
;    else 
;    { 
	.dbline 301
;       // 如未回应器件地址,停止发送,返回错误 
;          retval = TWI_ERROR_NODEV; 
	ldi R20,1
	.dbline 302
;    } 
L92:
	.dbline 305
; 
;    // 发送停止条件,保持TWEA以便从接收 
;    Twi_Stop(); 
	in R24,0x36
	andi R24,15
	ori R24,208
	out 0x36,R24
L99:
	.dbline 306
L100:
	.dbline 306
;    while( !(TWCR&(1<<TWSTO)) ); 
	in R2,0x36
	sbrs R2,4
	rjmp L99
	.dbline 308
;    // 开Twi_中断 
;    TWCR|=(1<<TWIE); 
	in R24,0x36
	ori R24,1
	out 0x36,R24
	.dbline 309
;    return retval; 
	mov R16,R20
	.dbline -2
L84:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r retval 20 c
	.dbsym r data 22 pc
	.dbsym r length 18 c
	.dbsym r deviceAddr 16 c
	.dbend
	.dbfunc e Twi_MasterReceiveNI _Twi_MasterReceiveNI fc
;         retval -> R20
;           data -> R22,R23
;         length -> R18
;     deviceAddr -> R16
	.even
_Twi_MasterReceiveNI::
	xcall push_gset2
	ldd R22,y+4
	ldd R23,y+5
	.dbline -1
	.dbline 326
; } 
; /*********************************************************************************************************
; ** 函数名称:主模式非中断接收
; ** 功能描述:
; ** 输 入:  deviceAddr:从机地址
; **          length:数据长度
; **          * data  缓冲区指针
; ** 输  出:             
; ** 全局变量: 
; ** 调用模块: 
; ** 说明:
; ** 注意:    
; ** 日 期:   2006年8月29日
; ********************************************************************************************************/
; 
; uint8 Twi_MasterReceiveNI(uint8 deviceAddr, uint8 length, uint8 *data) 
; { 
	.dbline 327
;    uint8 retval = TWI_OK; 
	clr R20
	.dbline 328
;    WDR(); //喂狗;
	wdr
	.dbline 330
;    // 关Twi_中断 
;           TWCR&=~(1<<TWIE); 
	in R24,0x36
	andi R24,254
	out 0x36,R24
	.dbline 334
; 		  
;    //发送开始条件 
;    
;    Twi_Start(); 
	in R24,0x36
	andi R24,15
	ori R24,160
	out 0x36,R24
	.dbline 335
;    WDR(); //喂狗;
	wdr
	.dbline 336
L103:
	.dbline 336
L104:
	.dbline 336
;    Twi_WaitForComplete(); 
	in R2,0x36
	sbrs R2,7
	rjmp L103
	.dbline 336
	.dbline 336
	.dbline 338
;    // 发送器件读地址 
;    Twi_SendByte( deviceAddr | 0x01 );
	.dbline 338
	mov R24,R16
	ori R24,1
	out 0x3,R24
	.dbline 338
	in R24,0x36
	andi R24,15
	ori R24,128
	out 0x36,R24
	.dbline 338
	.dbline 338
	.dbline 339
;    WDR(); //喂狗; 
	wdr
	.dbline 340
L106:
	.dbline 340
L107:
	.dbline 340
;    Twi_WaitForComplete(); 
	in R2,0x36
	sbrs R2,7
	rjmp L106
	.dbline 340
	.dbline 340
	.dbline 342
;    // 检查器件是否可用 
;    if( TWSR == TW_MR_SLA_ACK) 
	in R24,0x1
	cpi R24,64
	brne L109
	.dbline 343
;    { 
	xjmp L112
L111:
	.dbline 346
;       // 接收数据并回应 
;       while(length > 1) 
;       { 
	.dbline 347
;          Twi_Ack(); 
	in R24,0x36
	andi R24,15
	ori R24,192
	out 0x36,R24
	.dbline 348
L114:
	.dbline 348
L115:
	.dbline 348
	in R2,0x36
	sbrs R2,7
	rjmp L114
	.dbline 348
	.dbline 348
	.dbline 349
	in R2,0x3
	movw R30,R22
	st Z+,R2
	movw R22,R30
	.dbline 350
	dec R18
	.dbline 351
	wdr
	.dbline 352

⌨️ 快捷键说明

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