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

📄 wx_mn.lst

📁 nrf905无线收发模块利用模拟spi通信的程序 经此程序可转成串口通信
💻 LST
📖 第 1 页 / 共 5 页
字号:
    0165 7F8E      ANDI	R24,0xFE
    0166 BB88      OUT	P18,R24
(0089) 	SpiWrite(WC);				// Write config command写放配置命令
    0167 2700      CLR	R16
    0168 DF8C      RCALL	_SpiWrite
(0090) 	for (i=0;i<RxTxConf.n;i++)	// Write configration words  写放配置字
    0169 2744      CLR	R20
    016A C009      RJMP	0x0174
(0091) 	{
(0092) 		SpiWrite(RxTxConf.buf[i]);
    016B E08F      LDI	R24,0xF
    016C E091      LDI	R25,1
    016D 2FE4      MOV	R30,R20
    016E 27FF      CLR	R31
    016F 0FE8      ADD	R30,R24
    0170 1FF9      ADC	R31,R25
    0171 8100      LDD	R16,0+Z
    0172 DF82      RCALL	_SpiWrite
    0173 9543      INC	R20
    0174 9020010E  LDS	R2,0x10E
    0176 1542      CP	R20,R2
    0177 F398      BCS	0x016B
(0093) 		//delayus(10);
(0094) 	}
(0095) 	CSN=1;						// Disable Spi
    0178 B388      IN	R24,P18
    0179 6081      ORI	R24,1
    017A BB88      OUT	P18,R24
(0096) 	WriteTxAddress();
    017B DFC8      RCALL	_WriteTxAddress
(0097) }
    017C 940E0527  CALL	pop_gset1
    017E 9508      RET
(0098) 
(0099) /*******************************************************************************************/
(0100) //function SetTxMode();			设置为发送模式
(0101) /*******************************************************************************************/
(0102) void SetTxMode(void)				
(0103) {	
(0104) 	TRX_CE=0;
_SetTxMode:
    017F B382      IN	R24,P12
    0180 7E8F      ANDI	R24,0xEF
    0181 BB82      OUT	P12,R24
(0105) 	TX_EN=1;
    0182 B382      IN	R24,P12
    0183 6480      ORI	R24,0x40
    0184 BB82      OUT	P12,R24
(0106) 	Delay(1); 					// delay for mode change(>=650us)
    0185 E001      LDI	R16,1
(0107) }				
    0186 CF90      RJMP	_Delay
(0108) 
(0109) /*******************************************************************************************/
(0110) //function SetRxMode();			设置为接收模式
(0111) /*******************************************************************************************/
(0112) void SetRxMode(void)
(0113) {
(0114) 	TX_EN=0;
_SetRxMode:
    0187 B382      IN	R24,P12
    0188 7B8F      ANDI	R24,0xBF
    0189 BB82      OUT	P12,R24
(0115) 	TRX_CE=1;
    018A B382      IN	R24,P12
    018B 6180      ORI	R24,0x10
    018C BB82      OUT	P12,R24
(0116) 	Delay(1); 					// delay for mode change(>=650us)				
    018D E001      LDI	R16,1
(0117) }
    018E CF88      RJMP	_Delay
_TxPacket:
  i                    --> R20
  TxBuf                --> R22
    018F 940E053B  CALL	push_gset2
    0191 01B8      MOVW	R22,R16
(0118) 
(0119) //发送数据包
(0120) /*******************************************************************************************/
(0121) void TxPacket(unsigned char *TxBuf)
(0122) {
(0123) 	uchar i;
(0124) 
(0125) 	CSN=0;						// Spi enable for write a spi command	
    0192 B388      IN	R24,P18
    0193 7F8E      ANDI	R24,0xFE
    0194 BB88      OUT	P18,R24
(0126) 	SpiWrite(WTP);				// Write payload command
    0195 E200      LDI	R16,0x20
    0196 DF5E      RCALL	_SpiWrite
(0127) 	//for (i=0;i<TX_PW;i++)
(0128) 	for (i=0;i<RxTxConf.buf[4];i++)
    0197 2744      CLR	R20
    0198 C007      RJMP	0x01A0
(0129) 	{
(0130) 		SpiWrite(TxBuf[i]);		// Write 32 bytes Tx data
    0199 2FE4      MOV	R30,R20
    019A 27FF      CLR	R31
    019B 0FE6      ADD	R30,R22
    019C 1FF7      ADC	R31,R23
    019D 8100      LDD	R16,0+Z
    019E DF56      RCALL	_SpiWrite
    019F 9543      INC	R20
    01A0 90200113  LDS	R2,0x113
    01A2 1542      CP	R20,R2
    01A3 F3A8      BCS	0x0199
(0131) 		//delayus(10);
(0132) 	}
(0133) 	CSN=1;						// Spi disable						
    01A4 B388      IN	R24,P18
    01A5 6081      ORI	R24,1
    01A6 BB88      OUT	P18,R24
(0134) 	TRX_CE=1;					// Set TRX_CE high,start Tx data transmission
    01A7 B382      IN	R24,P12
    01A8 6180      ORI	R24,0x10
    01A9 BB82      OUT	P12,R24
(0135) 	Delay(1);					// while (DR!=1);
    01AA E001      LDI	R16,1
    01AB DF6B      RCALL	_Delay
(0136) 	TRX_CE=0;					// Set TRX_CE low
    01AC B382      IN	R24,P12
    01AD 7E8F      ANDI	R24,0xEF
    01AE BB82      OUT	P12,R24
(0137) }
    01AF 940E054B  CALL	pop_gset2
    01B1 9508      RET
_RxPacket:
  i                    --> R20
  RxBuf                --> R22
    01B2 940E053B  CALL	push_gset2
    01B4 01B8      MOVW	R22,R16
(0138) 
(0139) /*
(0140) *******************************************************************************************
(0141) *	读取数据包
(0142) *	返回值:		1-成功接收到数据		0-没有接收到数据
(0143) *******************************************************************************************
(0144) */
(0145) unsigned char RxPacket(unsigned char *RxBuf)
(0146) {
(0147) 	uchar i;
(0148) 	if (DR)		//DR 高电平		有接收到数据
    01B5 B380      IN	R24,P10
    01B6 9586      LSR	R24
    01B7 9586      LSR	R24
    01B8 9586      LSR	R24
    01B9 7081      ANDI	R24,1
    01BA F119      BEQ	0x01DE
(0149) 	{
(0150) 		TRX_CE=0;					// Set nRF905 in standby mode	
    01BB B382      IN	R24,P12
    01BC 7E8F      ANDI	R24,0xEF
    01BD BB82      OUT	P12,R24
(0151) 		CSN=0;						// Spi enable for write a spi command
    01BE B388      IN	R24,P18
    01BF 7F8E      ANDI	R24,0xFE
    01C0 BB88      OUT	P18,R24
(0152) 		SpiWrite(RRP);				// Read payload command	
    01C1 E204      LDI	R16,0x24
    01C2 DF32      RCALL	_SpiWrite
(0153) 		//for (i = 0 ;i < RX_PW ;i++)
(0154) 		for (i = 0 ;i < RxTxConf.buf[3] ;i++)
    01C3 2744      CLR	R20
    01C4 C007      RJMP	0x01CC
(0155) 		{
(0156) 			RxBuf[i]=SpiRead();		// Read data and save to buffer		
    01C5 DF0C      RCALL	_SpiRead
    01C6 2FE4      MOV	R30,R20
    01C7 27FF      CLR	R31
    01C8 0FE6      ADD	R30,R22
    01C9 1FF7      ADC	R31,R23
    01CA 8300      STD	R16,0+Z
    01CB 9543      INC	R20
    01CC 90200112  LDS	R2,0x112
    01CE 1542      CP	R20,R2
    01CF F3A8      BCS	0x01C5
(0157) 			//delayus(10);
(0158) 		}
(0159) 		CSN=1;						// Disable spi
    01D0 B388      IN	R24,P18
    01D1 6081      ORI	R24,1
    01D2 BB88      OUT	P18,R24
(0160) 		while(DR);//||AM);	
    01D3 B380      IN	R24,P10
    01D4 9586      LSR	R24
    01D5 9586      LSR	R24
    01D6 9586      LSR	R24
    01D7 7081      ANDI	R24,1
    01D8 F7D1      BNE	0x01D3
(0161) 
(0162) 		TRX_CE=1;
    01D9 B382      IN	R24,P12
    01DA 6180      ORI	R24,0x10
    01DB BB82      OUT	P12,R24
(0163) 
(0164) 		return 1;
    01DC E001      LDI	R16,1
    01DD C001      RJMP	0x01DF
(0165) 	}
(0166) 	else
(0167) 	{
(0168) 		return 0;
    01DE 2700      CLR	R16
    01DF 940E054B  CALL	pop_gset2
    01E1 9508      RET
_delay:
  x                    --> R20
  y                    --> R22
  z                    --> R16
    01E2 940E053B  CALL	push_gset2
FILE: E:\PQ-1A\我的AVR\新建文件夹\无线模拟\TWI.C
(0001) #include <iom128v.h>
(0002) #include <iom128.h>
(0003) #include <macros.h>
(0004) #include "TWI.h"
(0005) 
(0006) #define uchar unsigned char
(0007) #define uint unsigned int
(0008) #define Page_size 8
(0009) #define Page_mask Page_size-1
(0010) //#pragma data:code 
(0011) //const 
(0012) //char   table[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; 
(0013) //char    table1[8]={0,0,0,0,0,0,0,0};
(0014) void delay(uint z)
(0015) {
(0016)   uint x,y;
(0017)   for(x=z;x>0;x--)
    01E4 01A8      MOVW	R20,R16
    01E5 C00A      RJMP	0x01F0
(0018)    for(y=1100;y>0;y--);
    01E6 E46C      LDI	R22,0x4C
    01E7 E074      LDI	R23,4
    01E8 C002      RJMP	0x01EB
    01E9 5061      SUBI	R22,1
    01EA 4070      SBCI	R23,0
    01EB 3060      CPI	R22,0
    01EC 0767      CPC	R22,R23
    01ED F7D9      BNE	0x01E9
    01EE 5041      SUBI	R20,1
    01EF 4050      SBCI	R21,0
    01F0 3040      CPI	R20,0
    01F1 0745      CPC	R20,R21
    01F2 F799      BNE	0x01E6
(0019) }
    01F3 940E054B  CALL	pop_gset2
    01F5 9508      RET
(0020) 
(0021) 
(0022) /*
(0023) 函数:TWI_init()
(0024) 功能:I2C总线初始化,使总线处于空闲状态
(0025) 说明:在main()函数的开始处,通常应当要执行一次本函数
(0026) */
(0027) void TWI_init()
(0028) {
(0029)     TWBR=0X22;
_TWI_init:
    01F6 E282      LDI	R24,0x22
    01F7 93800070  STS	R24,0x70
(0030) 	TWSR=0;
    01F9 2422      CLR	R2
    01FA 92200071  STS	R2,0x71
(0031) 	TWCR=0X44; 
    01FC E484      LDI	R24,0x44
    01FD 93800074  STS	R24,0x74
(0032) }
    01FF 9508      RET
(0033) 
(0034) /*
(0035) 函数:TWI_start()
(0036) 功能:产生I2C总线的起始状态
(0037) 说明:
(0038) 	本函数也可以用来产生重复起始状态
(0039) 	本函数执行后,I2C总线处于忙状态
(0040) */
(0041) uchar TWI_start(void)
(0042) {
(0043)     TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
_TWI_start:
    0200 EA84      LDI	R24,0xA4
    0201 93800074  STS	R24,0x74
(0044) 	while(!(TWCR&(1<<TWINT)));
    0203 90200074  LDS	R2,0x74
    0205 FE27      SBRS	R2,7
    0206 CFFC      RJMP	0x0203
(0045) 	return 1;
    0207 E001      LDI	R16,1
    0208 9508      RET
(0046) }
(0047) 
(0048) void TWI_stop(void)
(0049) {
(0050)     TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN);
_TWI_stop:
    0209 E984      LDI	R24,0x94
    020A 93800074  STS	R24,0x74
(0051) }
    020C 9508      RET
_TWI_writeB:
  ack                  --> R20
  c                    --> R16
    020D 940E0524  CALL	push_gset1
(0052) 
(0053) /*
(0054) 函数:TWI_writeB()
(0055) 功能:向I2C总线写1个字节的数据
(0056) 返回:
(0057)       0: 从机无应答
(0058) 	  1:从机应答
(0059) 参数:
(0060) 	c:要写到总线上的数据
(0061) */
(0062) uchar TWI_writeB(uchar c)
(0063) {
(0064)     uchar ack=1;
    020F E041      LDI	R20,1
(0065) 	TWDR=c;
    0210 93000073  STS	R16,0x73
(0066) 	TWCR=(1<<TWINT)|(1<<TWEN);
    0212 E884      LDI	R24,0x84
    0213 93800074  STS	R24,0x74
(0067) 	while(!(TWCR&(1<<TWINT)));
    0215 90200074  LDS	R2,0x74
    0217 FE27      SBRS	R2,7
    0218 CFFC      RJMP	0x0215
(0068) 	if((TWSR&0xF8)!=SLA_W_ACK)
    0219 91800071  LDS	R24,0x71
    021B 7F88      ANDI	R24,0xF8
    021C 3188      CPI	R24,0x18
    021D F009      BEQ	0x021F
(0069) 	  ack=0;
    021E 2744      CLR	R20
(0070) 	return ack;
    021F 2F04      MOV	R16,R20
    0220 940E0527  CALL	pop_gset1
    0222 9508      RET
(0071) }
(0072) 
(0073) /*
(0074) 函数:TWI_readB()
(0075) 功能:从从机读取1个字节的数据
(0076) 返回:读取的一个字节数据
(0077) 说明:ack=0; 不应答
(0078)       ack=1;  应答
(0079) */
(0080) uchar TWI_readB(uchar ack)
(0081) {
(0082)    if(ack)
_TWI_readB:
  ack                  --> R16
    0223 2300      TST	R16
    0224 F021      BEQ	0x0229
(0083)       TWCR=(1<<TWINT)|(1<<TWEA)|(1<<TWEN); 
    0225 EC84      LDI	R24,0xC4
    0226 93800074  STS	R24,0x74
    0228 C003      RJMP	0x022C
(0084)    else
(0085)       TWCR=(1<<TWINT)|(1<<TWEN);
    0229 E884      LDI	R24,0x84
    022A 93800074  STS	R24,0x74
(0086)    while(!(TWCR&(1<<TWINT)));
    022C 90200074  LDS	R2,0x74
    022E FE27      SBRS	R2,7
    022F CFFC      RJMP	0x022C
(0087)    return(TWDR);
    0230 91000073  LDS	R16,0x73
    0232 9508      RET
_TWI_page_write:
  i                    --> R20
  arr                  --> R22
  n                    --> R10
  addr                 --> R20
  devadd               --> R12
    0233 940E0543  CALL	push_gset4
    0235 2F42      MOV	R20,R18
    0236 2EC0      MOV	R12,R16
    0237 84A8      LDD	R10,8+Y
    0238 856A      LDD	R22,10+Y
    0239 857B      LDD	R23,11+Y
(0088) }
(0089) 
(0090) /*
(0091) 函数:TWI_page_write()
(0092) 功能:I2C总线综合发送函数,向从机发送多个字节的数据,整页发送
(0093) 参数:
(0094) 	SlaveAddr:从机地址(7位纯地址,不含读写位)
(0095) 	addr:从机的子地址
(0096) 	*arr:要发送的数据
(0097) 	   n:数据的字节数
(0098) 返回:
(0099) 	1:发送成功
(0100) 	0:在发送过程中出现异常
(0101) 说明:
(0102) 	本函数能够很好地适应所有常见的I2C器件,不论其是否有子地址
(0103) 	当从机没有子地址时,参数addr任意
(0104) */
(0105) uchar TWI_page_write(uchar devadd,uchar addr,uchar n,uchar *arr)//
(0106) {
(0107)     uchar i;
(0108) 	TWI_start();
    023A DFC5      RCALL	_TWI_start
(0109) 	TWI_writeB(devadd);
    023B 2D0C      MOV	R16,R12
    023C DFD0      RCALL	_TWI_writeB
(0110) 	TWI_writeB(addr);
    023D 2F04      MOV	R16,R20
    023E DFCE      RCALL	_TWI_writeB
(0111) 	for(i=1;i<=n;i++)
    023F E041      LDI	R20,1
    0240 C006      RJMP	0x0247
(0112) 	 {
(0113) 	   //TWI_writeB(i);
(0114) 	   //table[i]=i;
(0115) 	   TWI_writeB(*arr);
    0241 01FB      MOVW	R30,R22
    0242 8100      LDD	R16,0+Z
    0243 DFC9      RCALL	_TWI_writeB
(0116) 	   arr++;
    0244 5F6F      SUBI	R22,0xFF
    0245 4F7F      SBCI	R23,0xFF
    0246 9543      INC	R20
    0247 16A4      CP	R10,R20
    0248 F7C0      BCC	0x0241
(0117) 	 }
(0118) 	TWI_stop();
    0249 DFBF      RCALL	_TWI_stop
(0119) 	delay(80);
    024A E500      LDI	R16,0x50
    024B E010      LDI	R17,0
    024C DF95      RCALL	_delay
(0120) }
    024D 940E0551  CALL	pop_gset4
    024F 9508      RET

⌨️ 快捷键说明

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