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

📄 wx_mn.lst

📁 nrf905无线收发模块利用模拟spi通信的程序 经此程序可转成串口通信
💻 LST
📖 第 1 页 / 共 5 页
字号:
__start:
__text_start:
    0079 EFCF      LDI	R28,0xFF
    007A E1D0      LDI	R29,0x10
    007B BFCD      OUT	P3D,R28
    007C BFDE      OUT	P3E,R29
    007D 51C0      SUBI	R28,0x10
    007E 40D0      SBCI	R29,0
    007F EA0A      LDI	R16,0xAA
    0080 8308      STD	R16,0+Y
    0081 2400      CLR	R0
    0082 E5E6      LDI	R30,0x56
    0083 E0F1      LDI	R31,1
    0084 E011      LDI	R17,1
    0085 35E7      CPI	R30,0x57
    0086 07F1      CPC	R31,R17
    0087 F011      BEQ	0x008A
    0088 9201      ST	R0,Z+
    0089 CFFB      RJMP	0x0085
    008A 8300      STD	R16,0+Z
    008B E9EC      LDI	R30,0x9C
    008C E0F0      LDI	R31,0
    008D E0A0      LDI	R26,0
    008E E0B1      LDI	R27,1
    008F E010      LDI	R17,0
    0090 3FE2      CPI	R30,0xF2
    0091 07F1      CPC	R31,R17
    0092 F021      BEQ	0x0097
    0093 95C8      LPM
    0094 9631      ADIW	R30,1
    0095 920D      ST	R0,X+
    0096 CFF9      RJMP	0x0090
    0097 940E0462  CALL	_main
_exit:
    0099 CFFF      RJMP	_exit
_delayus:
  i                    --> R20
  us                   --> R22
    009A 940E053B  CALL	push_gset2
    009C 01B8      MOVW	R22,R16
FILE: E:\PQ-1A\我的AVR\新建文件夹\无线模拟\spi.c
(0001) #include <iom128v.h>
(0002) #include <iom128.h>
(0003) #include <macros.h>
(0004) #include <BIT.h>
(0005) #define  uchar unsigned char
(0006) #define  uint  unsigned int
(0007) 
(0008) #define  CSN   _PB0
(0009) #define  SCK   _PB1
(0010) #define  MOSI  _PB2
(0011) #define  MISO  READ_PB3
(0012) 
(0013) #define BYTE_BIT0	0x01
(0014) #define BYTE_BIT1	0x02
(0015) #define BYTE_BIT2	0x04
(0016) #define BYTE_BIT3	0x08
(0017) #define BYTE_BIT4	0x10
(0018) #define BYTE_BIT5	0x20
(0019) #define BYTE_BIT6	0x40
(0020) #define BYTE_BIT7	0x80
(0021) 
(0022) uchar DATA_BUF;
(0023) #define DATA7	((DATA_BUF&BYTE_BIT7) != 0)
(0024) #define DATA0   ((DATA_BUF&BYTE_BIT0) != 0)
(0025) 
(0026) /*从最高位到最低位依次是:hafc debg*/
(0027) uchar table[]=//这个译码数组0、123467已经改好了! by张强
(0028)               //589也已改好  lly
(0029) {0x7e, 0x12,  0x4f,0x5b
(0030) ,0x33, 0x79, 0x7d, 0x52,
(0031)  0x7f,0x7b};//段选编码
(0032) 
(0033) /*******************************************
(0034) 函数名称: delayus
(0035) 功    能: 延时指定微秒(8.31M晶振)
(0036) 参    数: us--延时的微秒数(大约,不是很精确,MS越大越准确)
(0037) 返回值  : 无
(0038) /********************************************/
(0039) void delayus(uint us)		  
(0040) {
(0041)  uint i;
(0042)  us=us*13/10;		  	 //13/10是在8.31MHz晶振下,通过软件仿真反复实验得到的数值
    009D E00D      LDI	R16,0xD
    009E E010      LDI	R17,0
    009F 019B      MOVW	R18,R22
    00A0 940E0514  CALL	empy16s
    00A2 E02A      LDI	R18,0xA
    00A3 E030      LDI	R19,0
    00A4 940E04FA  CALL	div16u
    00A6 01B8      MOVW	R22,R16
(0043)  for( i=0;i<us;i++); 
    00A7 2744      CLR	R20
    00A8 2755      CLR	R21
    00A9 C002      RJMP	0x00AC
    00AA 5F4F      SUBI	R20,0xFF
    00AB 4F5F      SBCI	R21,0xFF
    00AC 1746      CP	R20,R22
    00AD 0757      CPC	R21,R23
    00AE F3D8      BCS	0x00AA
(0044) } 
    00AF 940E054B  CALL	pop_gset2
    00B1 9508      RET
_delayms:
  x                    --> R20
  y                    --> R22
  z                    --> R16
    00B2 940E053B  CALL	push_gset2
(0045) 
(0046) /*******************************************
(0047) 函数名称: delay()
(0048) 功    能: 8.31MHz晶振下延时 z ms 
(0049) 参    数: z
(0050) 返回值  : 无
(0051) /********************************************/
(0052) void delayms(uint z)
(0053) {
(0054)    uint x,y;
(0055)    for(x=z;x>0;x--)
    00B4 01A8      MOVW	R20,R16
    00B5 C00A      RJMP	0x00C0
(0056)     for(y=1185;y>0;y--);
    00B6 EA61      LDI	R22,0xA1
    00B7 E074      LDI	R23,4
    00B8 C002      RJMP	0x00BB
    00B9 5061      SUBI	R22,1
    00BA 4070      SBCI	R23,0
    00BB 3060      CPI	R22,0
    00BC 0767      CPC	R22,R23
    00BD F7D9      BNE	0x00B9
    00BE 5041      SUBI	R20,1
    00BF 4050      SBCI	R21,0
    00C0 3040      CPI	R20,0
    00C1 0745      CPC	R20,R21
    00C2 F799      BNE	0x00B6
(0057) }
    00C3 940E054B  CALL	pop_gset2
    00C5 9508      RET
(0058) 
(0059) void SpiInit(void)
(0060) {
(0061)     DDRB|=BIT(0)|BIT(1)|BIT(2);
_SpiInit:
    00C6 B387      IN	R24,P17
    00C7 6087      ORI	R24,7
    00C8 BB87      OUT	P17,R24
(0062) 	DDRB&=~BIT(3);
    00C9 98BB      CBI	P17,3
(0063) 	PORTB|=BIT(3);
    00CA 9AC3      SBI	P18,3
(0064) 	CSN=1;	// Spi 	disable	
    00CB B388      IN	R24,P18
    00CC 6081      ORI	R24,1
    00CD BB88      OUT	P18,R24
(0065) 	SCK=0;	// Spi clock line init low	
    00CE B388      IN	R24,P18
    00CF 7F8D      ANDI	R24,0xFD
    00D0 BB88      OUT	P18,R24
(0066) }
    00D1 9508      RET
(0067) 
(0068) unsigned char SpiRead(void)
(0069) {
(0070) 	unsigned char i;
(0071) 	for (i=0;i<8;i++)
_SpiRead:
  i                    --> R16
    00D2 2700      CLR	R16
    00D3 C01C      RJMP	0x00F0
(0072) 	{
(0073) 		DATA_BUF=DATA_BUF<<1;
    00D4 90200156  LDS	R2,_DATA_BUF
    00D6 0C22      LSL	R2
    00D7 92200156  STS	R2,_DATA_BUF
(0074) 		SCK=1;
    00D9 B388      IN	R24,P18
    00DA 6082      ORI	R24,2
    00DB BB88      OUT	P18,R24
(0075) 		//OED&=0XFD;			//	DATA=1;		//设置为输入状态
(0076) 		if (MISO)	//读取最高位,保存至最末尾,通过左移位完成整个字节
    00DC B386      IN	R24,P16
    00DD 9586      LSR	R24
    00DE 9586      LSR	R24
    00DF 9586      LSR	R24
    00E0 7081      ANDI	R24,1
    00E1 F029      BEQ	0x00E7
(0077) 		{
(0078) 			DATA_BUF|=BYTE_BIT0;
    00E2 2D82      MOV	R24,R2
    00E3 6081      ORI	R24,1
    00E4 93800156  STS	R24,_DATA_BUF
(0079) 		}
    00E6 C005      RJMP	0x00EC
(0080) 		else
(0081) 		{
(0082) 			DATA_BUF&=~BYTE_BIT0;
    00E7 91800156  LDS	R24,_DATA_BUF
    00E9 7F8E      ANDI	R24,0xFE
    00EA 93800156  STS	R24,_DATA_BUF
(0083) 		}
(0084) 		//OED|=0X02;
(0085) 		SCK=0;
    00EC B388      IN	R24,P18
    00ED 7F8D      ANDI	R24,0xFD
    00EE BB88      OUT	P18,R24
    00EF 9503      INC	R16
    00F0 3008      CPI	R16,0x8
    00F1 F310      BCS	0x00D4
(0086) 	 }
(0087) 	 return DATA_BUF;
    00F2 91000156  LDS	R16,_DATA_BUF
    00F4 9508      RET
_SpiWrite:
  i                    --> R20
  send                 --> R16
    00F5 940E0524  CALL	push_gset1
(0088) }
(0089) 
(0090) void SpiWrite(unsigned char send)
(0091) {
(0092) 	unsigned char i;
(0093) 	DATA_BUF=send;
    00F7 93000156  STS	R16,_DATA_BUF
(0094) 	for (i=0;i<8;i++)
    00F9 2744      CLR	R20
    00FA C017      RJMP	0x0112
(0095) 	{
(0096) 		if (DATA7)	//总是发送最高位
    00FB 90200156  LDS	R2,_DATA_BUF
    00FD FE27      SBRS	R2,7
    00FE C004      RJMP	0x0103
(0097) 		{
(0098) 			MOSI=1;
    00FF B388      IN	R24,P18
    0100 6084      ORI	R24,4
    0101 BB88      OUT	P18,R24
(0099) 		}
    0102 C003      RJMP	0x0106
(0100) 		else
(0101) 		{
(0102) 			MOSI=0;
    0103 B388      IN	R24,P18
    0104 7F8B      ANDI	R24,0xFB
    0105 BB88      OUT	P18,R24
(0103) 		}
(0104) 		SCK=1;
    0106 B388      IN	R24,P18
    0107 6082      ORI	R24,2
    0108 BB88      OUT	P18,R24
(0105) 		DATA_BUF=DATA_BUF<<1;
    0109 90200156  LDS	R2,_DATA_BUF
    010B 0C22      LSL	R2
    010C 92200156  STS	R2,_DATA_BUF
(0106) 		SCK=0;
    010E B388      IN	R24,P18
    010F 7F8D      ANDI	R24,0xFD
    0110 BB88      OUT	P18,R24
    0111 9543      INC	R20
    0112 3048      CPI	R20,0x8
    0113 F338      BCS	0x00FB
(0107) 	}
(0108) }
    0114 940E0527  CALL	pop_gset1
    0116 9508      RET
_Delay:
  i                    --> R20
  n                    --> R16
    0117 940E0524  CALL	push_gset1
FILE: E:\PQ-1A\我的AVR\新建文件夹\无线模拟\NRF905.C
(0001) #include <iom128v.h>
(0002) #include <iom128.h>
(0003) #include <macros.h>
(0004) //#include <BIT.h>
(0005) #include "NRF905.h"
(0006) #include "spi.c"
(0007) 
(0008) #define  TX_EN   _PD6
(0009) #define  TRX_CE  _PD4
(0010) #define  PWR_UP  _PD2
(0011) #define  CD      READ_PD5
(0012) #define  AM      READ_PD7
(0013) #define  DR      READ_PD3
(0014) 
(0015) #define uchar unsigned char 
(0016) #define uint  unsigned int
(0017) 
(0018) unsigned char TxAddress[4]={TX_ADDR_Byte0,TX_ADDR_Byte1,TX_ADDR_Byte2,TX_ADDR_Byte3};
(0019) 
(0020) RFConfig RxTxConf =
(0021) {
(0022) 	10,
(0023) 	RFConfig_Byte0, 	RFConfig_Byte1, 	RFConfig_Byte2, 	RFConfig_Byte3, 	RFConfig_Byte4,
(0024) 	RFConfig_Byte5, 	RFConfig_Byte6, 	RFConfig_Byte7, 	RFConfig_Byte8, 	RFConfig_Byte9	
(0025) };
(0026) 
(0027) 
(0028) static void Delay(uchar n)
(0029) {
    0119 C009      RJMP	0x0123
(0030) 	uint i;
(0031) 	while(n--)
(0032) 	for(i=0;i<1000;i++);	
    011A 2744      CLR	R20
    011B 2755      CLR	R21
    011C C002      RJMP	0x011F
    011D 5F4F      SUBI	R20,0xFF
    011E 4F5F      SBCI	R21,0xFF
    011F 3E48      CPI	R20,0xE8
    0120 E0E3      LDI	R30,3
    0121 075E      CPC	R21,R30
    0122 F3D0      BCS	0x011D
    0123 2E20      MOV	R2,R16
    0124 2433      CLR	R3
    0125 5001      SUBI	R16,1
    0126 2022      TST	R2
    0127 F791      BNE	0x011A
(0033) }
    0128 940E0527  CALL	pop_gset1
    012A 9508      RET
(0034) 
(0035) /*******************************************************************************************/
(0036) //function InitIO();		初始化IO
(0037) /*******************************************************************************************/
(0038) void nRF905Init(void)
(0039) {
(0040) 	/*SPI init*/
(0041) 	DDRD|=BIT(2)|BIT(4)|BIT(6);
_nRF905Init:
    012B B381      IN	R24,P11
    012C 6584      ORI	R24,0x54
    012D BB81      OUT	P11,R24
(0042) 	DDRD&=~(BIT(5)|BIT(7)|BIT(3));
    012E B381      IN	R24,P11
    012F 7587      ANDI	R24,0x57
    0130 BB81      OUT	P11,R24
(0043) 	SpiInit();
    0131 DF94      RCALL	_SpiInit
(0044) 	//CSN=1;						// Spi 	disable						
(0045) 	//SCK=0;						// Spi clock line init high
(0046) 	DR=1;						// Init DR for input
    0132 B380      IN	R24,P10
    0133 6088      ORI	R24,0x8
    0134 BB80      OUT	P10,R24
(0047) 	AM=1;						// Init AM for input
    0135 B380      IN	R24,P10
    0136 6880      ORI	R24,0x80
    0137 BB80      OUT	P10,R24
(0048) 	PWR_UP=1;					// nRF905 power on
    0138 B382      IN	R24,P12
    0139 6084      ORI	R24,4
    013A BB82      OUT	P12,R24
(0049) 	Delay(4);
    013B E004      LDI	R16,4
    013C DFDA      RCALL	_Delay
(0050) 	TRX_CE=0;					// Set nRF905 in standby mode
    013D B382      IN	R24,P12
    013E 7E8F      ANDI	R24,0xEF
    013F BB82      OUT	P12,R24
(0051) 	TX_EN=0;					// set radio in Rx mode	
    0140 B382      IN	R24,P12
    0141 7B8F      ANDI	R24,0xBF
    0142 BB82      OUT	P12,R24
(0052) 
(0053) 	//====================
(0054) 	/*
(0055) 	TX_EN_DDR	= 1;
(0056) 	TRX_CE_DDR	= 1;
(0057) 	PWR_UP_DDR	= 1;
(0058) 	DR_DDR		= 0;
(0059) 	CD_DDR		= 0;
(0060) 	*/
(0061) 	//====================
(0062) }
    0143 9508      RET
_WriteTxAddress:
  len                  --> R20
  i                    --> R22
    0144 940E053B  CALL	push_gset2
(0063) 
(0064) /*******************************************************************************************/
(0065) //function WriteTxAddress();	写入目标地址
(0066) /*******************************************************************************************/
(0067) void WriteTxAddress(void)
(0068) {
(0069) 	unsigned char i;
(0070) 	unsigned char len= (RxTxConf.buf[2]>>4);
    0146 91400111  LDS	R20,0x111
    0148 9542      SWAP	R20
    0149 704F      ANDI	R20,0xF
(0071) 	CSN=0;						// Spi enable for write a spi command	
    014A B388      IN	R24,P18
    014B 7F8E      ANDI	R24,0xFE
    014C BB88      OUT	P18,R24
(0072) 	SpiWrite(WTA);				// Write address command
    014D E202      LDI	R16,0x22
    014E DFA6      RCALL	_SpiWrite
(0073) 	//for (i=0;i<TX_AWF;i++) 
(0074) 	for (i=0;i<len;i++)
    014F 2766      CLR	R22
    0150 C009      RJMP	0x015A
(0075) 	{
(0076) 		SpiWrite(TxAddress[i]);
    0151 E08A      LDI	R24,0xA
    0152 E091      LDI	R25,1
    0153 2FE6      MOV	R30,R22
    0154 27FF      CLR	R31
    0155 0FE8      ADD	R30,R24
    0156 1FF9      ADC	R31,R25
    0157 8100      LDD	R16,0+Z
    0158 DF9C      RCALL	_SpiWrite
    0159 9563      INC	R22
    015A 1764      CP	R22,R20
    015B F3A8      BCS	0x0151
(0077) 		//delayus(10);
(0078) 	}	
(0079) 	CSN=1;						// Spi disable
    015C B388      IN	R24,P18
    015D 6081      ORI	R24,1
    015E BB88      OUT	P18,R24
(0080) }
    015F 940E054B  CALL	pop_gset2
    0161 9508      RET
_Config905:
  i                    --> R20
    0162 940E0524  CALL	push_gset1
(0081) 
(0082) /*******************************************************************************************/
(0083) //function Config905();			//配置905寄存器
(0084) /*******************************************************************************************/
(0085) void Config905(void)
(0086) {
(0087) 	uchar i;					
(0088) 	CSN=0;						// Spi enable for write a spi command
    0164 B388      IN	R24,P18

⌨️ 快捷键说明

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