📄 nrf2401a.lis
字号:
.module nrf2401A.C
.area text(rom, con, rel)
0000 .dbfile D:\IccAvr\Pei\PTR4000\nrf2401A.C
0000 .dbfunc e nrf2401A_WR _nrf2401A_WR fV
0000 ; i -> R20
0000 ; temp -> R22
0000 ; val -> R16
.even
0000 _nrf2401A_WR::
0000 0E940000 xcall push_gset2
0004 .dbline -1
0004 .dbline 74
0004 ; #include "config.h"
0004 ;
0004 ; extern void DelayMs(uchar ms);
0004 ; extern void DelayUs(uint us);
0004 ;
0004 ; //注意:
0004 ; //1、nef2401A配置字是先写第15字节的!!
0004 ; //2、发送后要延时等发送结束后才能转回接收模式,否则数据发送不出
0004 ;
0004 ;
0004 ; #define SIZE 25 //最大数据包长度 32-ADDR4-CRC2=26Byte
0004 ; #define ADDRSIZE 4 //地址长度Byte
0004 ;
0004 ; #define CH_NO 2 //频段编号
0004 ;
0004 ; #define BPS_1M //编译控制:1M or 250Kbps
0004 ;
0004 ; uchar TxBuf[SIZE],RxBuf[SIZE];
0004 ;
0004 ; /*-------------------------------------------------------------------------------------------
0004 ; nrf2401A配置寄存器宏定义
0004 ; nrf2401A配置寄存器(15Byte)
0004 ; 工作频率f=2.4G+CH_NO*1MHz
0004 ; -------------------------------------------------------------------------------------------*/
0004 ; #define RX_ADDRESS 0xCCCCCCCC //接收有效地址(本方)
0004 ; #define TX_ADDRESS 0xCCCCCCCC //发送有效地址(对方)
0004 ;
0004 ; #define CH_NO_FREQ CH_NO<<1 //工作频段 Byte1.7-2
0004 ; #define RX_EN 1 //接收发送切换 Byte1.0 1接收 0发送
0004 ;
0004 ; #define RX2EN_YES 128 //第2接收通道使能1 Byte2.7
0004 ; #define RX2EN_NO 0 //第2接收通道使能0 Byte2.7
0004 ; #define CM_SHOCK 64 //收发模式ShockBurst Byte2.6
0004 ; #define CM_DIRECT 0 //收发模式DirectMode Byte2.6
0004 ; #define RFDR_1M 32 //空中Baud=1M Byte2.5
0004 ; #define RFDR_250K 0 //空中Baud=250K Byte2.5
0004 ; #define XOF_20MHz 4*4 //晶体振荡器频率20MHz Byte2.4~2
0004 ; #define XOF_16MHz 3*4 //晶体振荡器频率16MHz
0004 ; #define XOF_12MHz 2*4 //晶体振荡器频率12MHz
0004 ; #define XOF_8MHz 1*4 //晶体振荡器频率8MHz
0004 ; #define XOF_4MHz 0*4 //晶体振荡器频率4MHz
0004 ; #define PA_PWR_0 0 //输出功率-20dBm Byte2.1~0
0004 ; #define PA_PWR_1 1 //输出功率-10dBm
0004 ; #define PA_PWR_2 2 //输出功率-5dBm
0004 ; #define PA_PWR_3 3 //输出功率 0dBm
0004 ;
0004 ; #define ADDR_W (ADDRSIZE<<5) //地址位数 Byte3.7~2
0004 ; #define CRC_MODE_16BIT 2 //CRC16模式 Byte3.1 1
0004 ; #define CRC_MODE_8BIT 0 //CRC8模式 Byte3.1
0004 ; #define CRC_EN 1 //CRC使能 Byte3.0 1
0004 ; #define CRC16_EN 3 //CRC16模式使能
0004 ; #define CRC8_EN 1 //CRC8模式使能
0004 ;
0004 ; #define RX_ADDRESS_0 RX_ADDRESS & 0xff //通道1接收有效地址第1字节 Byte4
0004 ; #define RX_ADDRESS_1 (RX_ADDRESS >> 8) & 0xff //通道1接收有效地址第2字节 Byte5
0004 ; #define RX_ADDRESS_2 (RX_ADDRESS >> 16) & 0xff //通道1接收有效地址第3字节 Byte6
0004 ; #define RX_ADDRESS_3 RX_ADDRESS >> 24 //通道1接收有效地址第4字节 Byte7
0004 ; #define RX_ADDRESS_4 0 //通道1接收有效地址第5字节 Byte8
0004 ;
0004 ; #define RX_ADDRESS2 0 //Byte9,10,11,12,13字节为通道2接收地址
0004 ;
0004 ; #define DATA1_W SIZE*8 //接收通道1数据包长度,Bit计算 Byte14
0004 ; #define DATA2_W SIZE*8 //接收通道2数据包长度,Bit计算 Byte15
0004 ;
0004 ; #define TX_ADDRESS_4 0 //发送有效地址第5字节
0004 ; #define TX_ADDRESS_3 TX_ADDRESS >> 24 //发送有效地址第4字节
0004 ; #define TX_ADDRESS_2 (TX_ADDRESS >> 16) & 0xff //发送有效地址第3字节
0004 ; #define TX_ADDRESS_1 (TX_ADDRESS >> 8) & 0xff //发送有效地址第2字节
0004 ; #define TX_ADDRESS_0 TX_ADDRESS & 0xff //发送有效地址第1字节
0004 ;
0004 ;
0004 ; //写1Byte
0004 ; void nrf2401A_WR(uchar val)
0004 ; {uchar temp,i;
0004 .dbline 76
0004 ; //MSB first 高位开始,先输出DATA,然后CLK_Up,再CLK_Dn
0004 ; SET(DDRA,DATA);//置DATA输出
0004 D59A sbi 0x1a,5
0006 .dbline 77
0006 ; temp=val;
0006 602F mov R22,R16
0008 .dbline 79
0008 ;
0008 ; for (i=0;i<8;i++)
0008 4427 clr R20
000A 0EC0 xjmp L5
000C L2:
000C .dbline 80
000C ; {
000C .dbline 81
000C ; if ((temp&0x80)>0)
000C 2224 clr R2
000E 862F mov R24,R22
0010 8078 andi R24,128
0012 2816 cp R2,R24
0014 10F4 brsh L6
0016 .dbline 82
0016 ; SET(PORTA,DATA);
0016 DD9A sbi 0x1b,5
0018 01C0 xjmp L7
001A L6:
001A .dbline 84
001A ; else
001A ; CLR(PORTA,DATA);
001A DD98 cbi 0x1b,5
001C L7:
001C .dbline 86
001C 0000 nop
001E .dbline 87
001E DC9A sbi 0x1b,4
0020 .dbline 88
0020 0000 nop
0022 .dbline 89
0022 DC98 cbi 0x1b,4
0024 .dbline 91
0024 660F lsl R22
0026 .dbline 92
0026 L3:
0026 .dbline 79
0026 4395 inc R20
0028 L5:
0028 .dbline 79
0028 4830 cpi R20,8
002A 80F3 brlo L2
002C .dbline -2
002C L1:
002C 0E940000 xcall pop_gset2
0030 .dbline 0 ; func end
0030 0895 ret
0032 .dbsym r i 20 c
0032 .dbsym r temp 22 c
0032 .dbsym r val 16 c
0032 .dbend
0032 .dbfunc e nrf2401A_RD _nrf2401A_RD fc
0032 ; i -> R16
0032 ; temp -> R18
.even
0032 _nrf2401A_RD::
0032 .dbline -1
0032 .dbline 97
0032 ;
0032 ; NOP();
0032 ; SET(PORTA,CLK);
0032 ; NOP();
0032 ; CLR(PORTA,CLK);
0032 ;
0032 ; temp=temp<<1;
0032 ; }
0032 ; }
0032 ;
0032 ; //读1Byte
0032 ; uchar nrf2401A_RD()
0032 ; {uchar temp,i;
0032 .dbline 99
0032 ; //MSB first 高位开始,先读入DATA,然后CLK_Up,再CLK_Dn
0032 ; CLR(DDRA,DATA);//置DATA输入
0032 D598 cbi 0x1a,5
0034 .dbline 100
0034 ; temp=0;
0034 2227 clr R18
0036 .dbline 102
0036 ;
0036 ; for (i=0;i<8;i++)
0036 0027 clr R16
0038 0CC0 xjmp L12
003A L9:
003A .dbline 103
003A ; {
003A .dbline 104
003A ; temp=temp<<1;
003A 220F lsl R18
003C .dbline 105
003C ; if ((PINA&(1<<DATA))>0)
003C 2224 clr R2
003E 89B3 in R24,0x19
0040 8072 andi R24,32
0042 2816 cp R2,R24
0044 08F4 brsh L13
0046 .dbline 106
0046 ; temp=temp|1;
0046 2160 ori R18,1
0048 L13:
0048 .dbline 108
0048 0000 nop
004A .dbline 109
004A DC9A sbi 0x1b,4
004C .dbline 110
004C 0000 nop
004E .dbline 111
004E DC98 cbi 0x1b,4
0050 .dbline 112
0050 L10:
0050 .dbline 102
0050 0395 inc R16
0052 L12:
0052 .dbline 102
0052 0830 cpi R16,8
0054 90F3 brlo L9
0056 .dbline 114
0056 ;
0056 ; NOP();
0056 ; SET(PORTA,CLK);
0056 ; NOP();
0056 ; CLR(PORTA,CLK);
0056 ; }
0056 ;
0056 ; return temp;
0056 022F mov R16,R18
0058 .dbline -2
0058 L8:
0058 .dbline 0 ; func end
0058 0895 ret
005A .dbsym r i 16 c
005A .dbsym r temp 18 c
005A .dbend
005A .dbfunc e nrf2401A_StandBy _nrf2401A_StandBy fV
.even
005A _nrf2401A_StandBy::
005A .dbline -1
005A .dbline 119
005A ; }
005A ;
005A ; //PwrDown->StandBy
005A ; void nrf2401A_StandBy()
005A ; {
005A .dbline 120
005A ; SET(PORTA,PWR2);
005A D89A sbi 0x1b,0
005C .dbline 121
005C ; CLR(PORTA,CE);
005C D998 cbi 0x1b,1
005E .dbline 122
005E ; CLR(PORTA,CS);
005E DA98 cbi 0x1b,2
0060 .dbline -2
0060 L15:
0060 .dbline 0 ; func end
0060 0895 ret
0062 .dbend
0062 .dbfunc e nrf2401A_Off _nrf2401A_Off fV
.even
0062 _nrf2401A_Off::
0062 .dbline -1
0062 .dbline 127
0062 ; }
0062 ;
0062 ; //->PwrDown
0062 ; void nrf2401A_Off()
0062 ; {
0062 .dbline 128
0062 ; CLR(PORTA,PWR2);
0062 D898 cbi 0x1b,0
0064 .dbline 129
0064 ; CLR(PORTA,CE);
0064 D998 cbi 0x1b,1
0066 .dbline 130
0066 ; CLR(PORTA,CS);
0066 DA98 cbi 0x1b,2
0068 .dbline -2
0068 L16:
0068 .dbline 0 ; func end
0068 0895 ret
006A .dbend
006A .dbfunc e nrf2401A_RwOn _nrf2401A_RwOn fV
.even
006A _nrf2401A_RwOn::
006A .dbline -1
006A .dbline 135
006A ; }
006A ;
006A ; //配置模式
006A ; void nrf2401A_RwOn()
006A ; {
006A .dbline 136
006A ; SET(PORTA,PWR2);
006A D89A sbi 0x1b,0
006C .dbline 137
006C ; CLR(PORTA,CE);
006C D998 cbi 0x1b,1
006E .dbline 138
006E ; SET(PORTA,CS);
006E DA9A sbi 0x1b,2
0070 .dbline -2
0070 L17:
0070 .dbline 0 ; func end
0070 0895 ret
0072 .dbend
0072 .dbfunc e nrf2401A_Run _nrf2401A_Run fV
.even
0072 _nrf2401A_Run::
0072 .dbline -1
0072 .dbline 144
0072 ;
0072 ; }
0072 ;
0072 ; //工作模式
0072 ; void nrf2401A_Run()
0072 ; {
0072 .dbline 145
0072 ; SET(PORTA,PWR2);
0072 D89A sbi 0x1b,0
0074 .dbline 146
0074 ; CLR(PORTA,CS);//first
0074 DA98 cbi 0x1b,2
0076 .dbline 147
0076 ; SET(PORTA,CE);
0076 D99A sbi 0x1b,1
0078 .dbline -2
0078 L18:
0078 .dbline 0 ; func end
0078 0895 ret
007A .dbend
007A .dbfunc e nrf2401A_Config _nrf2401A_Config fV
.even
007A _nrf2401A_Config::
007A .dbline -1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -