📄 tx.lst
字号:
01F3 DE8B RCALL _Write_ConfigureWord
(0412)
(0413) RegisterValueH=0x01;
01F4 E041 LDI R20,1
(0414) RegisterValueL=0Xe4; //安全模式不使能
01F5 EE64 LDI R22,0xE4
(0415) Write_ConfigureWord(SECCTRL0,RegisterValueH,RegisterValueL);
01F6 8368 STD Y+0,R22
01F7 2F24 MOV R18,R20
01F8 E109 LDI R16,0x19
01F9 DE85 RCALL _Write_ConfigureWord
(0416)
(0417) //RegisterValueH=128;
(0418) //RegisterValueL=128;
(0419) //Write_ConfigureWord(SECCTRL1,RegisterValueH,RegisterValueL); //???????????????????????调试时修改
(0420)
(0421) RegisterValueH=0;
01FA 2744 CLR R20
(0422) RegisterValueL=TX_length; //RXFIFO的极限值
01FB E760 LDI R22,0x70
(0423) Write_ConfigureWord(IOCFG0,RegisterValueH,RegisterValueL); //???????????????????????调试时修改
01FC 8368 STD Y+0,R22
01FD 2F24 MOV R18,R20
01FE E10C LDI R16,0x1C
01FF DE7F RCALL _Write_ConfigureWord
(0424)
(0425) disable_spi(); //禁止SPI口
0200 940E02A7 CALL _disable_spi
0202 9621 ADIW R28,1
0203 940E02A9 CALL pop_gset2
0205 9508 RET
FILE: C:\AVR\cc2420驱动程序\code\common.c
(0001) #include "common.h"
(0002)
(0003) /*******************************************
(0004) *函数功能:延时600us用于电压校准器的启动延时
(0005) *输入参数:无
(0006) *输出参数:无
(0007) *返 回 值:无
(0008) ********************************************/
(0009) void Delay600us(void)
(0010) {
(0011) unsigned char i,t;
(0012) for (i=0;i<5;i++)
_Delay600us:
i --> R16
t --> R18
0206 2700 CLR R16
0207 C006 RJMP 0x020E
(0013) {
(0014) for (t=0;t<250;t++)
0208 2722 CLR R18
0209 C001 RJMP 0x020B
020A 9523 INC R18
020B 3F2A CPI R18,0xFA
020C F3E8 BCS 0x020A
020D 9503 INC R16
020E 3005 CPI R16,5
020F F3C0 BCS 0x0208
0210 9508 RET
(0015) {
(0016) ;
(0017) }
(0018) }
(0019) }
(0020)
(0021) /*******************************************
(0022) *函数功能:延时10ms用于发送数据包的间隔测试
(0023) *输入参数:无
(0024) *输出参数:无
(0025) *返 回 值:无
(0026) ********************************************/
(0027) void Delay10ms(void)
(0028) {
(0029) unsigned int t,i;
(0030) for (t=0;t<3500;t++)
_Delay10ms:
t --> R16
i --> R18
0211 2700 CLR R16
0212 2711 CLR R17
0213 C00B RJMP 0x021F
(0031) {
(0032) for (i=0;i<3;i++)
0214 2722 CLR R18
0215 2733 CLR R19
0216 C002 RJMP 0x0219
0217 5F2F SUBI R18,0xFF
0218 4F3F SBCI R19,0xFF
0219 3023 CPI R18,3
021A E0E0 LDI R30,0
021B 073E CPC R19,R30
021C F3D0 BCS 0x0217
021D 5F0F SUBI R16,0xFF
021E 4F1F SBCI R17,0xFF
021F 3A0C CPI R16,0xAC
0220 E0ED LDI R30,0xD
0221 071E CPC R17,R30
0222 F388 BCS 0x0214
0223 9508 RET
(0033) {;}
(0034) }
(0035) }
(0036)
(0037) /*
(0038) *函数功能:led端口初始化程序
(0039) *输入参数:无
(0040) *输出参数:无
(0041) *返 回 值:无
(0042) */
(0043) void initled(void)
(0044) {
(0045) DDRA|=((1<<DDA1)|(1<<DDA0));//设置A口的输出引脚
_initled:
0224 B38A IN R24,0x1A
0225 6083 ORI R24,3
0226 BB8A OUT 0x1A,R24
0227 9508 RET
FILE: C:\AVR\cc2420驱动程序\code\main.c
(0001) #include "cc2420.h"
(0002) #include "spi.h"
(0003)
(0004) unsigned char Data_TXFIFO[TX_length]; //要写入TXFIFO中的数据,包括帧长度,MAC头,MAC有效负载等部分
(0005) unsigned char serial_num=0; //数据序号
(0006)
(0007)
(0008) void main(void)
(0009) {
(0010) unsigned char i;
(0011) unsigned int j;
(0012)
(0013) initled();
_main:
j --> R22
i --> R20
0228 940E0224 CALL _initled
(0014) init_spi();
022A 940E028D CALL _init_spi
(0015)
(0016) LED_YELLOW;
022C 9AD8 SBI 0x1B,0
022D 98D9 CBI 0x1B,1
(0017) PORTB |=(1<<CSn); //CSN引脚置位,停止SPI操作,
022E 9AC0 SBI 0x18,0
(0018) PORTB |=1<<SCK; // Spi clock line init high
022F 9AC1 SBI 0x18,1
(0019) PORTE |=1<<RST; //注意该引脚低电平时,cc2420处于复位状态
0230 9A1A SBI 0x03,2
(0020)
(0021) Data_TXFIFO[0]=TX_length+1; //第一字节为帧长度,不包括长度域本身的字节,但包含帧校验序列2字节
0231 E781 LDI R24,0x71
0232 93800101 STS Data_TXFIFO,R24
(0022)
(0023) //帧控制域,无安全,确认要求,数据帧,包含16位的目标地址,源地址,目标PAN标识符,源PAN标识符
(0024) Data_TXFIFO[1]=0x88; //高字节
0234 E888 LDI R24,0x88
0235 93800102 STS Data_TXFIFO+1,R24
(0025) Data_TXFIFO[2]=0x01; //低字节
0237 E081 LDI R24,1
0238 93800103 STS Data_TXFIFO+2,R24
(0026)
(0027) //目的PAN标识符
(0028) Data_TXFIFO[4]=0x23;
023A E283 LDI R24,0x23
023B 93800105 STS 0x105,R24
(0029) Data_TXFIFO[5]=0x45;
023D E485 LDI R24,0x45
023E 93800106 STS 0x106,R24
(0030)
(0031) //目的地址
(0032) Data_TXFIFO[6]=0x15;
0240 E185 LDI R24,0x15
0241 93800107 STS 0x107,R24
(0033) Data_TXFIFO[7]=0x73;
0243 E783 LDI R24,0x73
0244 93800108 STS 0x108,R24
(0034)
(0035) //源PAN标识符
(0036) Data_TXFIFO[8]=0x86;
0246 E886 LDI R24,0x86
0247 93800109 STS 0x109,R24
(0037) Data_TXFIFO[9]=0x49;
0249 E489 LDI R24,0x49
024A 9380010A STS 0x10A,R24
(0038)
(0039) //源地址
(0040) Data_TXFIFO[10]=0x59;
024C E589 LDI R24,0x59
024D 9380010B STS 0x10B,R24
(0041) Data_TXFIFO[11]=0x04;
024F E084 LDI R24,4
0250 9380010C STS 0x10C,R24
(0042)
(0043) //有效负载
(0044) for (i=12;i<TX_length;i++)
0252 E04C LDI R20,0xC
0253 C00A RJMP 0x025E
(0045) {
(0046) Data_TXFIFO[i]=i-12;
0254 E081 LDI R24,1
0255 E091 LDI R25,1
0256 2FE4 MOV R30,R20
0257 27FF CLR R31
0258 0FE8 ADD R30,R24
0259 1FF9 ADC R31,R25
025A 2F84 MOV R24,R20
025B 508C SUBI R24,0xC
025C 8380 STD Z+0,R24
025D 9543 INC R20
025E 3740 CPI R20,0x70
025F F3A0 BCS 0x0254
(0047) }
(0048)
(0049) Set_Configure(); //初始化设置配置字
0260 940E01DB CALL _Set_Configure
(0050) PwDown_Idle(); //从掉电模式转换到空闲模式
0262 940E01BC CALL _PwDown_Idle
(0051)
(0052) j=0;
0264 2766 CLR R22
0265 2777 CLR R23
0266 C021 RJMP 0x0288
(0053) while(1)
(0054) {
(0055) j++;
0267 5F6F SUBI R22,0xFF
0268 4F7F SBCI R23,0xFF
(0056) if (j==2048)
0269 3060 CPI R22,0
026A E0E8 LDI R30,0x8
026B 077E CPC R23,R30
026C F409 BNE 0x026E
(0057) {
(0058) break;
026D C01B RJMP 0x0289
(0059) }
(0060) AllStates_Idle();
026E 940E01CA CALL _AllStates_Idle
(0061) //序列号
(0062) Data_TXFIFO[3]=serial_num;
0270 90200100 LDS R2,serial_num
0272 92200104 STS Data_TXFIFO+3,R2
(0063) serial_num++;
0274 2D82 MOV R24,R2
0275 5F8F SUBI R24,0xFF
0276 93800100 STS serial_num,R24
(0064) if(serial_num==250)
0278 3F8A CPI R24,0xFA
0279 F419 BNE 0x027D
(0065) {
(0066) serial_num=0;
027A 2422 CLR R2
027B 92200100 STS serial_num,R2
(0067) }
(0068)
(0069) Write_TXFIFO(TX_length,Data_TXFIFO); //将数据写入到TXFIFO中
027D E021 LDI R18,1
027E E031 LDI R19,1
027F E700 LDI R16,0x70
0280 940E00DE CALL _Write_TXFIFO
(0070) Idle_Tx(); //启动发送
0282 940E01CD CALL _Idle_Tx
(0071)
(0072) Delay10ms();
0284 940E0211 CALL _Delay10ms
(0073) Delay10ms();
0286 940E0211 CALL _Delay10ms
0288 CFDE RJMP 0x0267
(0074) }
(0075) LED_RED;
0289 98D8 CBI 0x1B,0
028A 9AD9 SBI 0x1B,1
(0076) while(1){;}
028B CFFF RJMP 0x028B
028C 9508 RET
FILE: C:\AVR\cc2420驱动程序\code\spi.c
(0001) #include"spi.h"
(0002)
(0003) /*************************************************
(0004) 函数功能:初始化SPI口
(0005) 输入参数:无
(0006) 返回值:无
(0007) **************************************************/
(0008) void init_spi(void)
(0009) {
(0010) unsigned char temp;
(0011) DDRB|=(1<<MOSI)|(1<<SCK)|(1<<CSn);//设置MOSI、SCK和SS 为输出,其他为输入
_init_spi:
temp --> R16
028D B387 IN R24,0x17
028E 6087 ORI R24,7
028F BB87 OUT 0x17,R24
(0012) DDRE|=(1<<VREGEN)|(1<<RST);
0290 B182 IN R24,0x02
0291 608C ORI R24,0xC
0292 B982 OUT 0x02,R24
(0013)
(0014) SPCR = (1<<SPE)|(1<<MSTR);//|(1<<SPR0);// 使能SPI,主机模式,设置时钟速率为fck/4
0293 E580 LDI R24,0x50
0294 B98D OUT 0x0D,R24
(0015) SPSR = BIT(SPI2X); //SPI时钟加倍
0295 E081 LDI R24,1
0296 B98E OUT 0x0E,R24
(0016)
(0017) temp = SPSR; //!!! 读一次SPSR为了清除SPIF位和WCOL位
0297 B10E IN R16,0x0E
(0018)
(0019) temp = SPDR; //清空SPI,和中断标志,使SPI空闲
0298 B10F IN R16,0x0F
0299 9508 RET
_SpiWrite:
temp --> R20
temp1 --> R22
data_spi --> R16
029A 940E02B5 CALL push_gset2
(0020) }
(0021)
(0022) /**************************************************
(0023) 函数功能:写SPI一个字节
(0024) 输入参数:SPI指令
(0025) 返回值:对应指令的结果
(0026) **************************************************/
(0027) unsigned char SpiWrite(unsigned char data_spi)
(0028) {
(0029) unsigned char temp,temp1;
(0030) SPDR=data_spi;
029C B90F OUT 0x0F,R16
(0031) while(!(SPSR & (1<<SPIF))){;}//等待传输结束
029D 9B77 SBIS 0x0E,7
029E CFFE RJMP 0x029D
(0032) temp1=SPDR;
029F B16F IN R22,0x0F
(0033) temp = SPSR;
02A0 B14E IN R20,0x0E
(0034)
(0035) return temp1;
02A1 2F06 MOV R16,R22
02A2 940E02A9 CALL pop_gset2
02A4 9508 RET
(0036) }
(0037)
(0038) /*******************************************
(0039) *函数功能:使能SPI口
(0040) *输入参数:无
(0041) *输出参数:无
(0042) *返 回 值:无
(0043) ********************************************/
(0044) void enable_spi(void)
(0045) {
(0046) PORTB &=~(1<<CSn); //使能SPI口
_enable_spi:
02A5 98C0 CBI 0x18,0
02A6 9508 RET
(0047) }
(0048)
(0049) /*******************************************
(0050) *函数功能:禁止SPI口
(0051) *输入参数:无
(0052) *输出参数:无
(0053) *返 回 值:无
(0054) ********************************************/
(0055) void disable_spi(void)
(0056) {
(0057) PORTB |=(1<<CSn); //禁止SPI口
FILE: <library>
_disable_spi:
02A7 9AC0 SBI 0x18,0
02A8 9508 RET
pop_gset2:
02A9 E0E2 LDI R30,2
02AA 940C02BB JMP pop
pop_gset4:
02AC E0E8 LDI R30,0x8
02AD 940C02BB JMP pop
push_gset5:
02AF 92FA ST R15,-Y
02B0 92EA ST R14,-Y
push_gset4:
02B1 92DA ST R13,-Y
02B2 92CA ST R12,-Y
push_gset3:
02B3 92BA ST R11,-Y
02B4 92AA ST R10,-Y
push_gset2:
02B5 937A ST R23,-Y
02B6 936A ST R22,-Y
push_gset1:
02B7 935A ST R21,-Y
02B8 934A ST R20,-Y
02B9 9508 RET
pop_gset1:
02BA E0E1 LDI R30,1
pop:
02BB 9149 LD R20,Y+
02BC 9159 LD R21,Y+
02BD FDE0 SBRC R30,0
02BE 9508 RET
02BF 9169 LD R22,Y+
02C0 9179 LD R23,Y+
02C1 FDE1 SBRC R30,1
02C2 9508 RET
02C3 90A9 LD R10,Y+
02C4 90B9 LD R11,Y+
02C5 FDE2 SBRC R30,2
02C6 9508 RET
02C7 90C9 LD R12,Y+
02C8 90D9 LD R13,Y+
02C9 FDE3 SBRC R30,3
02CA 9508 RET
02CB 90E9 LD R14,Y+
02CC 90F9 LD R15,Y+
02CD 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -