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

📄 cs5522.s

📁 前段时间做的一个东西,用的24位高精度AD转换芯片CS5532和12DA转换器max531的AVR驱动.芯片用的是ATMEGA8515,开发环境ICCAVR.CS5532的内部寄存器太多,设置有些复杂
💻 S
字号:
	.module Cs5522.c
	.area text(rom, con, rel)
	.dbfile C:\icc\project\cs5532\Cs5522.c
	.dbfunc s Se_Cs_W _Se_Cs_W fI
;           Cs_i -> R20
;         Cs_Tem -> R22
;        Cs_Word -> R10
	.even
_Se_Cs_W::
	rcall push_gset3
	mov R10,R16
	.dbline -1
	.dbline 18
; #include<io8515.h> 
; //**************************************************
; //PC1-CS5522_CS  PC0-CS5522_SCLK   PB4-CS5522_SDO  
; //PB3-CS5522_SDI
; //****************************************************
; #define cs    0b00000010
; #define sclk  0b00000001
; #define sdi   0b00001000
; #define sdo   0b00010000
; //************************************
; #define unch    unsigned char
; //*************************************
; unsigned char data[3];  //receive cs5522's number;
; void Cacu_Display(unsigned char temp);
; //***********************************
; //向CS5522发送一个字节
; void Se_Cs_W(unsigned char Cs_Word)
;     {   unsigned char Cs_Tem;
	.dbline 19
;         unsigned char Cs_i=8;      
	ldi R20,8
	rjmp L3
L2:
	.dbline 21
;         while(Cs_i)
; 	       {
	.dbline 22
; 	          Cs_Tem=Cs_Word;
	mov R22,R10
	.dbline 23
; 			  Cs_Tem=Cs_Tem>>(Cs_i-1);
	mov R17,R20
	subi R17,1
	mov R16,R22
	rcall lsr8
	mov R22,R16
	.dbline 24
; 			  Cs_Tem&=0b00000001;
	andi R22,1
	.dbline 25
; 			  if(Cs_Tem)
	tst R22
	breq L5
	.dbline 26
; 			       {PORTB=PORTB|sdi;} 
	.dbline 26
	sbi 0x18,3
	.dbline 26
	rjmp L6
L5:
	.dbline 28
; 			  else
; 			       {PORTB=PORTB&~sdi;}	   
	.dbline 28
	cbi 0x18,3
	.dbline 28
L6:
	.dbline 29
	sbi 0x15,0
	.dbline 30
	cbi 0x15,0
	.dbline 31
	dec R20
	.dbline 32
L3:
	.dbline 20
	tst R20
	brne L2
	.dbline -2
	.dbline 33
; 	          PORTC=PORTC|sclk;//clock=1.
; 			  PORTC=PORTC&(~sclk);//clock=0                      
; 	          Cs_i--;
; 	        }
;     }
L1:
	rcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym r Cs_i 20 c
	.dbsym r Cs_Tem 22 c
	.dbsym r Cs_Word 10 c
	.dbfunc s ReadW _ReadW fI
;    Read_Temp02 -> R20
;         Read_i -> R22
;    Read_Temp01 -> R10
	.even
_ReadW::
	rcall push_gset3
	.dbline -1
	.dbline 38
; 
; //***********************************
; //读一个字节。
; unsigned char ReadW()
;                  {
	.dbline 40
; 				   unsigned char Read_Temp01,Read_Temp02,Read_i;
; 				   Read_i=8;
	ldi R22,8
	.dbline 41
; 				   Read_Temp01=0;
	clr R10
	.dbline 42
; 				   Read_Temp02=0;
	clr R20
	rjmp L9
L8:
	.dbline 44
	.dbline 45
	in R10,0x16
	.dbline 46
	sbi 0x15,0
	.dbline 47
	cbi 0x15,0
	.dbline 48
	mov R24,R10
	andi R24,16
	mov R10,R24
	.dbline 49
	swap R24
	andi R24,#0x0F
	mov R10,R24
	.dbline 50
	mov R17,R22
	subi R17,1
	mov R16,R10
	rcall lsl8
	mov R10,R16
	.dbline 51
	add R20,R10
	.dbline 52
	dec R22
	.dbline 53
L9:
	.dbline 43
; 				   while(Read_i)
	tst R22
	brne L8
	.dbline 54
; 				       {       						  
; 						  Read_Temp01=PINB;
; 						  PORTC=PORTC|sclk;
; 					      PORTC=PORTC&~sclk;
; 						  Read_Temp01=Read_Temp01&sdo;
; 						  Read_Temp01=Read_Temp01>>4;
; 			              Read_Temp01=Read_Temp01<<(Read_i-1);
; 			              Read_Temp02=Read_Temp02+Read_Temp01;
; 			              Read_i--;						   
; 					   }
; 				  return(Read_Temp02); 		 
	mov R16,R20
	clr R17
	.dbline -2
L7:
	rcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym r Read_Temp02 20 c
	.dbsym r Read_i 22 c
	.dbsym r Read_Temp01 10 c
	.dbfunc s Sen_Rec _Sen_Rec fI
;          comaw -> R20
	.even
_Sen_Rec::
	rcall push_gset1
	mov R20,R16
	.dbline -1
	.dbline 61
; 				 
; 				 
; 				 }	  		
; //***********************************
; //写1字节读3字节。
;   void Sen_Rec(unsigned char comaw)
;         { 
	.dbline 62
; 		  DDRC=DDRC|cs;
	sbi 0x14,1
	.dbline 63
; 		  DDRC=DDRC|sclk;
	sbi 0x14,0
	.dbline 64
; 		  DDRB=DDRB|sdi;
	sbi 0x17,3
	.dbline 65
; 		  DDRB=DDRB&~sdo;
	cbi 0x17,4
	.dbline 66
; 		  PORTB|=sdo;//选择为输入
	sbi 0x18,4
	.dbline 67
; 	      PORTC=PORTC&~cs;  //片选				  		  
	cbi 0x15,1
	.dbline 68
; 	      Se_Cs_W(comaw);
	mov R16,R20
	rcall _Se_Cs_W
	.dbline 69
; 	      data[2]=ReadW();
	rcall _ReadW
	mov R2,R16
	mov R3,R17
	sts _data+2,R2
	.dbline 70
; 	      data[1]=ReadW();
	rcall _ReadW
	mov R2,R16
	mov R3,R17
	sts _data+1,R2
	.dbline 71
; 	      data[0]=ReadW();
	rcall _ReadW
	mov R2,R16
	mov R3,R17
	sts _data,R2
	.dbline 72
; 		  PORTC=PORTC|cs;	 
	sbi 0x15,1
	.dbline -2
	.dbline 73
; 		   }
L11:
	rcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r comaw 20 c
	.dbfunc s F_Word _F_Word fI
;         write4 -> y+6
;         write3 -> y+4
;         write2 -> R20
;         write1 -> R22
	.even
_F_Word::
	rcall push_gset2
	mov R20,R18
	mov R22,R16
	.dbline -1
	.dbline 77
; //************************************
; //直接写4字节。
; void F_Word(unch write1,unch write2,unch write3,unch write4)
;         { DDRC=DDRC|cs;
	.dbline 77
	sbi 0x14,1
	.dbline 78
; 		  DDRC=DDRC|sclk;
	sbi 0x14,0
	.dbline 79
; 		  DDRB=DDRB|sdi;		  
	sbi 0x17,3
	.dbline 80
; 	      PORTC=PORTC&~cs;  //片选	
	cbi 0x15,1
	.dbline 81
; 		  PORTB|=sdi;			 
	sbi 0x18,3
	.dbline 82
; 		  Se_Cs_W(write1);
	mov R16,R22
	rcall _Se_Cs_W
	.dbline 83
; 		  Se_Cs_W(write2);
	mov R16,R20
	rcall _Se_Cs_W
	.dbline 84
; 		  Se_Cs_W(write3);
	ldd R16,y+4
	rcall _Se_Cs_W
	.dbline 85
; 		  Se_Cs_W(write4);
	ldd R16,y+6
	rcall _Se_Cs_W
	.dbline 86
; 		  PORTC=PORTC|cs;	
	sbi 0x15,1
	.dbline -2
	.dbline 88
; 		
; 		} 	 
L14:
	rcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym l write4 6 c
	.dbsym l write3 4 c
	.dbsym r write2 20 c
	.dbsym r write1 22 c
	.dbfunc s ADC _ADC fI
;        ADCtemp -> R20
	.even
_ADC::
	rcall push_gset1
	mov R20,R16
	.dbline -1
	.dbline 91
; //***********************************
; void ADC(unsigned char ADCtemp)
;       {
	.dbline 93
; 	      
; 		  DDRC=DDRC|cs;
	sbi 0x14,1
	.dbline 94
; 		  DDRC=DDRC|sclk;
	sbi 0x14,0
	.dbline 95
; 		  DDRB=DDRB|sdi;
	sbi 0x17,3
	.dbline 96
; 		  DDRB=DDRB&~sdo;
	cbi 0x17,4
	.dbline 97
; 		  PORTB|=sdo;//选择为输入
	sbi 0x18,4
	.dbline 98
; 	      PORTC=PORTC&~cs;  //片选				  		  
	cbi 0x15,1
	.dbline 99
; 	      Se_Cs_W(ADCtemp);	      
	mov R16,R20
	rcall _Se_Cs_W
	.dbline 100
; 		  PORTC=PORTC|cs;	 
	sbi 0x15,1
	.dbline -2
	.dbline 102
; 	  
; 	  }		
L15:
	rcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r ADCtemp 20 c
	.dbfunc s ReceiveData _ReceiveData fI
;    ReceiveTemp -> R20
	.even
_ReceiveData::
	rcall push_gset1
	.dbline -1
	.dbline 106
; //**********************************
; //接收CS5522的数据:
; void ReceiveData(void)
;         {
	.dbline 108
; 		   unsigned char ReceiveTemp;
; 		   DDRB=DDRB&~sdo;
	cbi 0x17,4
	.dbline 109
; 		   PORTB|=sdo;//选择为输入
	sbi 0x18,4
	.dbline 110
; 		   DDRC=DDRC|cs;
	sbi 0x14,1
	.dbline 111
; 		   PORTC=PORTC&~cs;  //片选		
	cbi 0x15,1
	.dbline 112
; 		   DDRC=DDRC|sclk;
	sbi 0x14,0
	.dbline 113
; 		   PORTC=PORTC|sclk;
	sbi 0x15,0
L17:
	.dbline 115
; 		  do	
; 		   { 
	.dbline 116
; 		     ReceiveTemp=PINB;
	in R20,0x16
	.dbline 117
; 		     ReceiveTemp=ReceiveTemp&sdo;
	andi R20,16
	.dbline 118
; 			 }
L18:
	.dbline 119
; 		  while(ReceiveTemp);	 
	tst R20
	brne L17
	.dbline 120
; 		  data[2]=ReadW();
	rcall _ReadW
	mov R2,R16
	mov R3,R17
	sts _data+2,R2
	.dbline 121
; 		  data[2]=ReadW();
	rcall _ReadW
	mov R2,R16
	mov R3,R17
	sts _data+2,R2
	.dbline 122
; 	      data[1]=ReadW();
	rcall _ReadW
	mov R2,R16
	mov R3,R17
	sts _data+1,R2
	.dbline 123
; 	      data[0]=ReadW();		  	   
	rcall _ReadW
	mov R2,R16
	mov R3,R17
	sts _data,R2
	.dbline 124
; 		  PORTC=PORTC|cs;	
	sbi 0x15,1
	.dbline -2
	.dbline 125
; 		}
L16:
	rcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r ReceiveTemp 20 c
	.dbfunc s initserial _initserial fI
;       Init_Tem -> R20
	.even
_initserial::
	rcall push_gset1
	.dbline -1
	.dbline 129
; //***********************************
; //起动串口。
;  void initserial(void)
;     { 
	.dbline 130
; 	  unsigned char Init_Tem=15;
	ldi R20,15
	.dbline 131
; 	  DDRC=DDRC|cs;
	sbi 0x14,1
	.dbline 132
; 	  DDRC=DDRC|sclk;
	sbi 0x14,0
	.dbline 133
; 	  PORTC=PORTC&~cs;
	cbi 0x15,1
	.dbline 134
; 	  DDRB=DDRB|sdi;
	sbi 0x17,3
	rjmp L25
L24:
	.dbline 136
	.dbline 137
	ldi R16,255
	rcall _Se_Cs_W
	.dbline 138
	dec R20
	.dbline 139
L25:
	.dbline 135
; 	  while(Init_Tem)
	tst R20
	brne L24
	.dbline 140
; 	      {
; 		    Se_Cs_W(0xff);
; 			Init_Tem--;		  
; 		   }
; 	  Se_Cs_W(0xfe);	
	ldi R16,254
	rcall _Se_Cs_W
	.dbline 141
; 	  PORTC=PORTC|cs;
	sbi 0x15,1
	.dbline -2
	.dbline 142
; 	}
L23:
	rcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r Init_Tem 20 c
	.dbfunc s InitCs _InitCs fI
;       InitTemp -> R20
	.even
_InitCs::
	rcall push_gset1
	sbiw R28,3
	.dbline -1
	.dbline 146
; //***********************************
; //配置CS5522
; void InitCs(void)
;         {
	.dbline 149
; 		
; 		     unsigned char InitTemp;
; 		     initserial();    //起动串口。     
	rcall _initserial
	.dbline 153
; //===================设置配置寄存器=======================
; //配置RS位寄存器写一 
;        //  distemp();
;          F_Word(0x03,0x00,0x00,0x80);    //直接写4字节

⌨️ 快捷键说明

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