📄 rx.lst
字号:
__start:
__text_start:
0049 EFCF LDI R28,0xFF
004A E1D0 LDI R29,0x10
004B BFCD OUT 0x3D,R28
004C BFDE OUT 0x3E,R29
004D 51C0 SUBI R28,0x10
004E 40D0 SBCI R29,0
004F EA0A LDI R16,0xAA
0050 8308 STD Y+0,R16
0051 2400 CLR R0
0052 E0E6 LDI R30,6
0053 E0F1 LDI R31,1
0054 E019 LDI R17,0x9
0055 37E6 CPI R30,0x76
0056 07F1 CPC R31,R17
0057 F011 BEQ 0x005A
0058 9201 ST R0,Z+
0059 CFFB RJMP 0x0055
005A 8300 STD Z+0,R16
005B E8EC LDI R30,0x8C
005C E0F0 LDI R31,0
005D E0A0 LDI R26,0
005E E0B1 LDI R27,1
005F E010 LDI R17,0
0060 39E2 CPI R30,0x92
0061 07F1 CPC R31,R17
0062 F021 BEQ 0x0067
0063 95C8 LPM
0064 9631 ADIW R30,1
0065 920D ST R0,X+
0066 CFF9 RJMP 0x0060
0067 940E0226 CALL _main
_exit:
0069 CFFF RJMP _exit
_Write_Command:
statueval --> R20
command --> R20
006A 940E029B CALL push_gset1
006C 2F40 MOV R20,R16
FILE: E:\无线传感器网络资料\cc2420驱动\测试1\RX\cc2420.c
(0001) /***************************************
(0002) *2008,浙江工业大学信息与控制研究所
(0003) *All rights reserved
(0004) *
(0005) *文件名称:cc2420.c
(0006) *摘 要:无线收发芯片cc2420驱动程序
(0007) *
(0008) *当前版本:1.0
(0009) *作 者:董齐芬
(0010) *完成日期:2008.8.11
(0011) ****************************************/
(0012)
(0013) #include "cc2420.h"
(0014) #include "spi.h"
(0015) #include "common.h"
(0016)
(0017) /*******************************************
(0018) *函数功能:写命令寄存器
(0019) *输入参数:命令字
(0020) *输出参数:无
(0021) *返 回 值:状态寄存器的值
(0022) ********************************************/
(0023) unsigned char Write_Command(unsigned char command)
(0024) {
(0025) unsigned char statueval;
(0026)
(0027) enable_spi(); //使能SPI口
006D 940E0289 CALL _enable_spi
(0028) statueval=SpiWrite(command);
006F 2F04 MOV R16,R20
0070 940E0280 CALL _SpiWrite
0072 2F40 MOV R20,R16
(0029) disable_spi(); //禁止SPI口
0073 940E028B CALL _disable_spi
(0030)
(0031) return statueval;
0075 2F04 MOV R16,R20
0076 940E029E CALL pop_gset1
0078 9508 RET
_Read_Status:
statuevalue --> R20
0079 940E029B CALL push_gset1
(0032) }
(0033)
(0034) /*******************************************
(0035) *函数功能:读状态寄存器
(0036) *输入参数:无
(0037) *输出参数:无
(0038) *返 回 值:状态寄存器的值
(0039) ********************************************/
(0040) unsigned char Read_Status(void)
(0041) {
(0042) unsigned char statuevalue;
(0043) statuevalue=Write_Command(SNOP); //空操作命令,为了读取当前状态寄存器的值
007B 2700 CLR R16
007C DFED RCALL _Write_Command
007D 2F40 MOV R20,R16
(0044) return statuevalue;
007E 940E029E CALL pop_gset1
0080 9508 RET
_Write_ConfigureWord:
statuevalue --> R20
DataL --> Y+4
DataH --> R22
Addr --> R20
0081 940E0299 CALL push_gset2
0083 2F62 MOV R22,R18
0084 2F40 MOV R20,R16
(0045) }
(0046)
(0047) /*******************************************
(0048) *函数功能:写配置字
(0049) *输入参数:Addr:配置寄存器的地址;
(0050) DataH:配置字的高字节;
(0051) DataL:配置字的低字节;
(0052) *输出参数:无
(0053) *返 回 值:状态寄存器的值
(0054) ********************************************/
(0055) unsigned char Write_ConfigureWord(unsigned char Addr,unsigned char DataH,unsigned char DataL)
(0056) {
(0057) unsigned char statuevalue;
(0058)
(0059) // enable_spi(); //使能SPI口 以具体情况而定使能/禁止SPI口放在何处
(0060) statuevalue=SpiWrite(Addr); //发送配置寄存器的地址,同时返回当前状态寄存器的值
0085 2F04 MOV R16,R20
0086 940E0280 CALL _SpiWrite
0088 2F40 MOV R20,R16
(0061) SpiWrite(DataH); //发送配置字的高字节
0089 2F06 MOV R16,R22
008A 940E0280 CALL _SpiWrite
(0062) SpiWrite(DataL); //发送配置字的低字节
008C 810C LDD R16,Y+4
008D 940E0280 CALL _SpiWrite
(0063) // disable_spi(); //禁止SPI口
(0064)
(0065) return statuevalue;
008F 2F04 MOV R16,R20
0090 940E028D CALL pop_gset2
0092 9508 RET
_Read_ConfigureWord:
statuevalue --> R20
DataL --> Y+4
DataH --> R22
Addr --> R20
0093 940E0299 CALL push_gset2
0095 01B9 MOVW R22,R18
0096 2F40 MOV R20,R16
(0066) }
(0067)
(0068) /*******************************************
(0069) *函数功能:读配置字
(0070) *输入参数:Addr:配置寄存器的地址;
(0071) *输出参数:DataH:配置字的高字节;
(0072) DataL:配置字的低字节;
(0073) *返 回 值:状态寄存器的值
(0074) ********************************************/
(0075) unsigned char Read_ConfigureWord(unsigned char Addr,unsigned char *DataH,unsigned char *DataL)
(0076) {
(0077) unsigned char statuevalue;
(0078)
(0079) Addr|=0x40; //读标志位为1
0097 6440 ORI R20,0x40
(0080) enable_spi(); //使能SPI口 以具体情况而定使能/禁止SPI口放在何处
0098 940E0289 CALL _enable_spi
(0081) statuevalue=SpiWrite(Addr); //发送配置寄存器的地址,同时返回当前状态寄存器的值
009A 2F04 MOV R16,R20
009B 940E0280 CALL _SpiWrite
009D 2F40 MOV R20,R16
(0082) *DataH=SpiWrite(0xff); //读配置字的高字节
009E EF0F LDI R16,0xFF
009F 940E0280 CALL _SpiWrite
00A1 01FB MOVW R30,R22
00A2 8300 STD Z+0,R16
(0083) *DataL=SpiWrite(0xff); //读配置字的低字节
00A3 EF0F LDI R16,0xFF
00A4 940E0280 CALL _SpiWrite
00A6 2E20 MOV R2,R16
00A7 81EC LDD R30,Y+4
00A8 81FD LDD R31,Y+5
00A9 8220 STD Z+0,R2
(0084) disable_spi(); //禁止SPI口
00AA 940E028B CALL _disable_spi
(0085)
(0086) return statuevalue;
00AC 2F04 MOV R16,R20
00AD 940E028D CALL pop_gset2
00AF 9508 RET
_Read_RXFIFO:
Addr --> R20
statuevalue --> R20
i --> R22
p_Data --> R10
Data_Num --> R12
00B0 940E0295 CALL push_gset4
00B2 0159 MOVW R10,R18
00B3 2EC0 MOV R12,R16
(0087) }
(0088)
(0089) /*******************************************
(0090) *函数功能:读RXFIFO
(0091) *输入参数:Data_Num:欲读取的字节个数
(0092) *输出参数:p_Data:存储数据的缓存首地址;
(0093) *返 回 值:状态寄存器的值
(0094) ********************************************/
(0095) unsigned char Read_RXFIFO(unsigned char Data_Num,unsigned char *p_Data)
(0096) {
(0097) unsigned char statuevalue,Addr,i;
(0098)
(0099) Addr=RXFIFO|0x40; //读标志位为1
00B4 E74F LDI R20,0x7F
(0100) enable_spi(); //使能SPI口
00B5 940E0289 CALL _enable_spi
(0101) statuevalue=SpiWrite(Addr);
00B7 2F04 MOV R16,R20
00B8 940E0280 CALL _SpiWrite
00BA 2F40 MOV R20,R16
(0102)
(0103) for(i=0;i<Data_Num;i++)
00BB 2766 CLR R22
00BC C009 RJMP 0x00C6
(0104) {
(0105) *(p_Data+i)=SpiWrite(0xff);
00BD EF0F LDI R16,0xFF
00BE 940E0280 CALL _SpiWrite
00C0 2FE6 MOV R30,R22
00C1 27FF CLR R31
00C2 0DEA ADD R30,R10
00C3 1DFB ADC R31,R11
00C4 8300 STD Z+0,R16
00C5 9563 INC R22
00C6 156C CP R22,R12
00C7 F3A8 BCS 0x00BD
(0106) }
(0107)
(0108) disable_spi(); //禁止SPI口
00C8 940E028B CALL _disable_spi
(0109)
(0110) return statuevalue;
00CA 2F04 MOV R16,R20
00CB 940E0290 CALL pop_gset4
00CD 9508 RET
_Read_RXFIFO_Byte:
Addr --> R20
readvalue --> R20
00CE 940E029B CALL push_gset1
(0111) }
(0112)
(0113) /*******************************************
(0114) *函数功能:读一字节RXFIFO
(0115) *输入参数:无
(0116) *输出参数:无
(0117) *返 回 值:读取的数据
(0118) ********************************************/
(0119) unsigned char Read_RXFIFO_Byte(void)
(0120) {
(0121) unsigned char readvalue,Addr;
(0122)
(0123) Addr=RXFIFO|0x40; //读标志位为1
00D0 E74F LDI R20,0x7F
(0124) enable_spi(); //使能SPI口
00D1 940E0289 CALL _enable_spi
(0125) SpiWrite(Addr);
00D3 2F04 MOV R16,R20
00D4 940E0280 CALL _SpiWrite
(0126) readvalue=SpiWrite(0xff);
00D6 EF0F LDI R16,0xFF
00D7 940E0280 CALL _SpiWrite
00D9 2F40 MOV R20,R16
(0127) disable_spi(); //禁止SPI口
00DA 940E028B CALL _disable_spi
(0128) return readvalue;
00DC 2F04 MOV R16,R20
00DD 940E029E CALL pop_gset1
00DF 9508 RET
_Write_TXFIFO:
statuevalue --> R20
i --> R22
p_Data --> R10
Data_Num --> R12
00E0 940E0295 CALL push_gset4
00E2 0159 MOVW R10,R18
00E3 2EC0 MOV R12,R16
(0129) }
(0130)
(0131) /*******************************************
(0132) *函数功能:写TXFIFO
(0133) *输入参数:Data_Num:欲写入的字节个数
(0134) *输出参数:p_Data:存储数据的缓存首地址;
(0135) *返 回 值:状态寄存器的值
(0136) ********************************************/
(0137) unsigned char Write_TXFIFO(unsigned char Data_Num,unsigned char *p_Data)
(0138) {
(0139) unsigned char statuevalue,i;
(0140)
(0141) enable_spi(); //使能SPI口
00E4 940E0289 CALL _enable_spi
(0142) SpiWrite(TXFIFO);
00E6 E30E LDI R16,0x3E
00E7 940E0280 CALL _SpiWrite
(0143)
(0144) for (i=0;i<Data_Num;i++)
00E9 2766 CLR R22
00EA C00F RJMP 0x00FA
(0145) {
(0146) statuevalue=SpiWrite(*(p_Data+i));
00EB 2FE6 MOV R30,R22
00EC 27FF CLR R31
00ED 0DEA ADD R30,R10
00EE 1DFB ADC R31,R11
00EF 8100 LDD R16,Z+0
00F0 940E0280 CALL _SpiWrite
00F2 2F40 MOV R20,R16
(0147)
(0148) if ((statuevalue&(1<<TX_UNDERFLOE))!=0x00) //发生下溢
00F3 FF05 SBRS R16,5
00F4 C004 RJMP 0x00F9
(0149) {
(0150) Write_Command(SFLUSHTX);
00F5 E009 LDI R16,0x9
00F6 DF73 RCALL _Write_Command
(0151) enable_spi(); //重新使能SPI口
00F7 940E0289 CALL _enable_spi
00F9 9563 INC R22
00FA 156C CP R22,R12
00FB F378 BCS 0x00EB
(0152) }
(0153) }
(0154)
(0155) disable_spi(); //禁止SPI口
00FC 940E028B CALL _disable_spi
(0156) return statuevalue;
00FE 2F04 MOV R16,R20
00FF 940E0290 CALL pop_gset4
0101 9508 RET
_Write_TXFIFO_Byte:
statuevalue --> R20
p_Data --> R20
0102 940E029B CALL push_gset1
0104 2F40 MOV R20,R16
(0157) }
(0158)
(0159) /*******************************************
(0160) *函数功能:写一字节TXFIFO
(0161) *输入参数:p_Data:要写入的数据
(0162) *输出参数:无
(0163) *返 回 值:状态寄存器的值
(0164) ********************************************/
(0165) unsigned char Write_TXFIFO_Byte(unsigned char p_Data)
(0166) {
(0167) unsigned char statuevalue;
(0168)
(0169) enable_spi(); //使能SPI口
0105 940E0289 CALL _enable_spi
(0170) SpiWrite(TXFIFO);
0107 E30E LDI R16,0x3E
0108 940E0280 CALL _SpiWrite
(0171) statuevalue=SpiWrite(p_Data);
010A 2F04 MOV R16,R20
010B 940E0280 CALL _SpiWrite
010D 2F40 MOV R20,R16
(0172) disable_spi(); //禁止SPI口
010E 940E028B CALL _disable_spi
(0173) return statuevalue;
0110 2F04 MOV R16,R20
0111 940E029E CALL pop_gset1
0113 9508 RET
_Write_RAM:
statuevalue --> R20
i --> R22
p_Data --> R10
Data_Num --> R12
AddrL --> R22
AddrH --> R20
0114 940E0295 CALL push_gset4
0116 2F62 MOV R22,R18
0117 2F40 MOV R20,R16
0118 84C8 LDD R12,Y+8
0119 84AA LDD R10,Y+10
011A 84BB LDD R11,Y+11
(0174) }
(0175)
(0176) /*******************************************
(0177) *函数功能:写RAM
(0178) *输入参数:p_Data:存储数据的缓存首地址;
(0179) Data_Num:要写入的字节数
(0180) AddrH:在选定的RAM存储块中确定RAM地址
(0181) AddrL:选择RAM存储块
(0182) *输出参数:无
(0183) *返 回 值:状态寄存器的值
(0184) ********************************************/
(0185) unsigned char Write_RAM(unsigned char AddrH,unsigned char AddrL,unsigned char Data_Num,unsigned char *p_Data)
(0186) {
(0187) unsigned char statuevalue,i;
(0188) AddrH|=0X80; //访问RAM位置1
011B 6840 ORI R20,0x80
(0189) AddrL<<=6;
011C 0F66 LSL R22
011D 0F66 LSL R22
011E 0F66 LSL R22
011F 0F66 LSL R22
0120 0F66 LSL R22
0121 0F66 LSL R22
(0190) AddrL&=0XDF; //读写操作位置0,表示写操作
0122 7D6F ANDI R22,0xDF
(0191)
(0192) enable_spi(); //使能SPI口
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -