📄 ptr8000.lst
字号:
__text_start:
__start:
2A E5CF LDI R28,0x5F
2B E0D4 LDI R29,4
2C BFCD OUT 0x3D,R28
2D BFDE OUT 0x3E,R29
2E 51C0 SUBI R28,0x10
2F 40D0 SBCI R29,0
30 EA0A LDI R16,0xAA
31 8308 STD Y+0,R16
32 2400 CLR R0
33 E6E0 LDI R30,0x60
34 E0F0 LDI R31,0
35 E010 LDI R17,0
36 3AE4 CPI R30,0xA4
37 07F1 CPC R31,R17
38 F011 BEQ 0x003B
39 9201 ST R0,Z+
3A CFFB RJMP 0x0036
3B 8300 STD Z+0,R16
3C E5E4 LDI R30,0x54
3D E0F0 LDI R31,0
3E E6A0 LDI R26,0x60
3F E0B0 LDI R27,0
40 E010 LDI R17,0
41 E000 LDI R16,0
42 BF0B OUT 0x3B,R16
43 35E4 CPI R30,0x54
44 07F1 CPC R31,R17
45 F021 BEQ 0x004A
46 95C8 LPM
47 9631 ADIW R30,1
48 920D ST R0,X+
49 CFF9 RJMP 0x0043
4A 940E 0177 CALL _main
_exit:
4C CFFF RJMP _exit
FILE: E:\无线通信\nRF905\ptr8000\nrf905.C
(0001) #include "config.h"
(0002)
(0003) extern void DelayMs(uchar ms);
(0004) extern void DelayUs(uint us);
(0005)
(0006) #define SIZE 32
(0007)
(0008) uchar TxBuf[SIZE],RxBuf[SIZE];
(0009)
(0010) /*-------------------------------------------------------------------------------------------
(0011) nrf905配置寄存器宏定义 author:HotPower
(0012) nrf905配置寄存器(10Byte)
(0013) 工作频率f=(422.4+CH_NO/10)*(1+HFREQ_PLL)MHz
(0014) -------------------------------------------------------------------------------------------*/
(0015) #define RX_ADDRESS 0x12345678 //接收有效地址(本方)
(0016) #define TX_ADDRESS 0x12345678 //发送有效地址(对方)
(0017)
(0018) #define CH_NO_FREQ_422_4MHz 0x000 //工作频率422.4MHz(433MHz频段最低频率)
(0019) #define CH_NO_FREQ_422_5MHz 0x001 //工作频率422.5MHz
(0020) #define CH_NO_FREQ_425_0MHz 0x01a //工作频率425.0MHz
(0021) #define CH_NO_FREQ_427_5MHz 0x033 //工作频率427.5MHz
(0022)
(0023) #define CH_NO_FREQ_430_0MHz 0x04c //工作频率430.0MHz
(0024) #define CH_NO_FREQ_433_0MHz 0x06a //工作频率433.0MHz(433MHz频段基准频率)
(0025) #define CH_NO_FREQ_433_1MHz 0x06b //工作频率433.1MHz
(0026) #define CH_NO_FREQ_433_2MHz 0x06c //工作频率433.2MHz
(0027) #define CH_NO_FREQ_434_7MHz 0x07b //工作频率434.7MHz
(0028) #define CH_NO_FREQ_473_5MHz 0x1ff //工作频率473.5MHz(433MHz频段最高频率)
(0029)
(0030) #define CH_NO_FREQ_844_8MHz 0x000 //工作频率844.8MHz(868MHz频段最低频率)
(0031)
(0032) #define CH_NO_FREQ_862_0MHz 0x056 //工作频率862.0MHz
(0033) #define CH_NO_FREQ_868_0MHz 0x074 //工作频率868.0MHz(868MHz频段基准频率)
(0034) #define CH_NO_FREQ_868_2MHz 0x075 //工作频率868.2MHz
(0035) #define CH_NO_FREQ_868_4MHz 0x076 //工作频率868.4MHz
(0036) #define CH_NO_FREQ_869_8MHz 0x07d //工作频率869.8MHz
(0037) #define CH_NO_FREQ_895_8MHz 0x0ff //工作频率895.8MHz
(0038) #define CH_NO_FREQ_896_0MHz 0x100 //工作频率896.0MHz
(0039) #define CH_NO_FREQ_900_0MHz 0x114 //工作频率900.0MHz
(0040) #define CH_NO_FREQ_902_2MHz 0x11f //工作频率902.2MHz
(0041) #define CH_NO_FREQ_902_4MHz 0x120 //工作频率902.4MHz
(0042) #define CH_NO_FREQ_915_0MHz 0x15f //工作频率915.0MHz(915MHz频段基准频率)
(0043) #define CH_NO_FREQ_927_8MHz 0x19f //工作频率927.8MHz
(0044)
(0045) #define CH_NO_FREQ_947_0MHz 0x1ff //工作频率947.0MHz(915MHz频段最高频率)
(0046)
(0047) #define CH_NO_FREQ CH_NO_FREQ_430_0MHz //工作频率433.0MHz
(0048)
(0049)
(0050) #define CH_NO_BYTE CH_NO_FREQ & 0xff //工作频率低8位 Byte0 01101100
(0051)
(0052) #define AUTO_RETRAN 0x20 //重发数据包 Byte1.5 0
(0053) #define RX_RED_PWR 0x10 //接收低功耗模式 Byte1.4 0
(0054) #define PA_PWR__10dBm 0x00 //输出功率-10dBm Byte1.3~2 00
(0055) #define PA_PWR_2dBm 0x04 //输出功率+2dBm Byte1.3~2
(0056) #define PA_PWR_6dBm 0x08 //输出功率+6dBm Byte1.3~2
(0057) #define PA_PWR_10dBm 0x0c //输出功率+10dBm Byte1.3~2
(0058) #define HFREQ_PLL_433MHz 0x00 //工作在433MHz频段 Byte1.1 0
(0059) #define HFREQ_PLL_868MHz 0x02 //工作在868MHz频段 Byte1.1
(0060) #define HFREQ_PLL_915MHz 0x02 //工作在915MHz频段 Byte1.1
(0061) #define CH_NO_BIT8 CH_NO_FREQ >> 8 //工作频率第9位 Byte1.0 0
(0062)
(0063) #define TX_AFW_1BYTE 1 * 16 //发送地址宽度1字节 Byte2.7~4
(0064) #define TX_AFW_2BYTE 2 * 16 //发送地址宽度2字节 Byte2.7~4
(0065) #define TX_AFW_3BYTE 3 * 16 //发送地址宽度3字节 Byte2.7~4
(0066) #define TX_AFW_4BYTE 4 * 16 //发送地址宽度4字节 Byte2.7~4 100
(0067) #define RX_AFW_1BYTE 1 //接收地址宽度1字节 Byte2.3~0
(0068) #define RX_AFW_2BYTE 2 //接收地址宽度2字节 Byte2.3~0
(0069) #define RX_AFW_3BYTE 3 //接收地址宽度3字节 Byte2.3~0
(0070) #define RX_AFW_4BYTE 4 //接收地址宽度4字节 Byte2.3~0 100
(0071)
(0072) #define RX_PW_1BYTE 1 //接收数据宽度1字节 Byte3.5~0
(0073) #define RX_PW_32BYTE 32 //接收数据宽度32字节 Byte3.5~0 00100000
(0074) #define TX_PW_1BYTE 1 //发送数据宽度1字节 Byte4.5~0
(0075) #define TX_PW_32BYTE 32 //发送数据宽度32字节 Byte4.5~0 00100000
(0076)
(0077) #define RX_ADDRESS_0 RX_ADDRESS >> 24 //接收有效地址第1字节 Byte5 11100111
(0078) #define RX_ADDRESS_1 (RX_ADDRESS >> 16) & 0xff //接收有效地址第2字节 Byte6 11100111
(0079) #define RX_ADDRESS_2 (RX_ADDRESS >> 8) & 0xff //接收有效地址第3字节 Byte7 11100111
(0080) #define RX_ADDRESS_3 RX_ADDRESS & 0xff //接收有效地址第4字节 Byte8 11100111
(0081)
(0082) #define CRC_MODE_16BIT 0x80 //CRC16模式 Byte9.7 1
(0083) #define CRC_MODE_8BIT 0x00 //CRC8模式 Byte9.7
(0084) #define CRC_EN 0x40 //CRC使能 Byte9.6 1
(0085) #define CRC16_EN 0xc0 //CRC16模式使能 Byte9.7~6 11
(0086) #define CRC8_EN 0x40 //CRC8模式使能 Byte9.7~6
(0087) #define XOF_20MHz 0x20 //晶体振荡器频率20MHz Byte9.5~3
(0088) #define XOF_16MHz 0x18 //晶体振荡器频率16MHz Byte9.5~3 100
(0089) #define XOF_12MHz 0x10 //晶体振荡器频率12MHz Byte9.5~3
(0090) #define XOF_8MHz 0x08 //晶体振荡器频率8MHz Byte9.5~3
(0091) #define XOF_4MHz 0x00 //晶体振荡器频率4MHz Byte9.5~3
(0092) #define UP_CLK_EN 0x40 //输出时钟使能 Byte9.2 1
(0093) #define UP_CLK_FREQ_500kHz 0x03 //输出时钟频率500kHz Byte9.1~0 11
(0094) #define UP_CLK_FREQ_1MHz 0x02 //输出时钟频率1MHz Byte9.1~0
(0095) #define UP_CLK_FREQ_2MHz 0x01 //输出时钟频率2MHz Byte9.1~0
(0096) #define UP_CLK_FREQ_4MHz 0x00 //输出时钟频率4MHz Byte9.1~0
(0097)
(0098) #define UP_CLK_EN_500kHz 0x43 //输出时钟频率500kHz Byte9.2~0 111
(0099) #define UP_CLK_EN_1MHz 0x42 //输出时钟频率1MHz Byte9.2~0
(0100) #define UP_CLK_EN_2MHz 0x41 //输出时钟频率2MHz Byte9.2~0
(0101) #define UP_CLK_EN_4MHz 0x40 //输出时钟频率4MHz Byte9.2~0
(0102)
(0103) #define TX_ADDRESS_0 TX_ADDRESS >> 24 //发送有效地址第1字节
(0104) #define TX_ADDRESS_1 (TX_ADDRESS >> 16) & 0xff //发送有效地址第2字节
(0105) #define TX_ADDRESS_2 (TX_ADDRESS >> 8) & 0xff //发送有效地址第3字节
(0106) #define TX_ADDRESS_3 TX_ADDRESS & 0xff //发送有效地址第4字节
(0107)
(0108) /*-----------------------------------------------
(0109) nrf905命令控制字 author:HotPower
(0110) ------------------------------------------------*/
(0111) #define WC 0x00 // Write configuration register command
(0112) #define RC 0x10 // Read configuration register command
(0113) #define WTP 0x20 // Write TX Payload command
(0114) #define RTP 0x21 // Read TX Payload command
(0115) #define WTA 0x22 // Write TX Address command
(0116) #define RTA 0x23 // Read TX Address command
(0117) #define RRP 0x24 // Read RX Payload command
(0118)
(0119)
(0120) //配置nRF905
(0121) void nrf905_Config(void)
(0122) {
(0123) CLR(PORTB,CSN); // Spi 片选开
_nrf905_Config:
4D 98C4 CBI 0x18,4
(0124) nrf905_SpiRW(WC); // Write config command
4E 2700 CLR R16
4F 2711 CLR R17
50 D028 RCALL _nrf905_SpiRW
(0125) nrf905_SpiRW(CH_NO_BYTE); //中心频率低8位
51 E40C LDI R16,0x4C
52 E010 LDI R17,0
53 D025 RCALL _nrf905_SpiRW
(0126) nrf905_SpiRW(PA_PWR_10dBm | HFREQ_PLL_433MHz); //发射+10dBm,发射频率433MHz,中心频率第9位=0
54 E00C LDI R16,0xC
55 E010 LDI R17,0
56 D022 RCALL _nrf905_SpiRW
(0127) nrf905_SpiRW(TX_AFW_4BYTE | RX_AFW_4BYTE); //接收地址宽度4字节,发送地址宽度4字节
57 E404 LDI R16,0x44
58 E010 LDI R17,0
59 D01F RCALL _nrf905_SpiRW
(0128) nrf905_SpiRW(RX_PW_32BYTE); //接收数据宽度32字节
5A E200 LDI R16,0x20
5B E010 LDI R17,0
5C D01C RCALL _nrf905_SpiRW
(0129) nrf905_SpiRW(TX_PW_32BYTE); //发送数据宽度32字节
5D E200 LDI R16,0x20
5E E010 LDI R17,0
5F D019 RCALL _nrf905_SpiRW
(0130) nrf905_SpiRW(RX_ADDRESS_0); //接收有效地址第1字节
60 E102 LDI R16,0x12
61 E010 LDI R17,0
62 E020 LDI R18,0
63 E030 LDI R19,0
64 D014 RCALL _nrf905_SpiRW
(0131) nrf905_SpiRW(RX_ADDRESS_1); //接收有效地址第2字节
65 E304 LDI R16,0x34
66 E010 LDI R17,0
67 E020 LDI R18,0
68 E030 LDI R19,0
69 D00F RCALL _nrf905_SpiRW
(0132) nrf905_SpiRW(RX_ADDRESS_2); //接收有效地址第3字节
6A E506 LDI R16,0x56
6B E010 LDI R17,0
6C E020 LDI R18,0
6D E030 LDI R19,0
6E D00A RCALL _nrf905_SpiRW
(0133) nrf905_SpiRW(RX_ADDRESS_3); //接收有效地址第4字节
6F E708 LDI R16,0x78
70 E010 LDI R17,0
71 E020 LDI R18,0
72 E030 LDI R19,0
73 D005 RCALL _nrf905_SpiRW
(0134) nrf905_SpiRW(CRC16_EN | XOF_16MHz); //CRC16模式使能,晶体振荡器频率16MHz
74 ED08 LDI R16,0xD8
75 E010 LDI R17,0
76 D002 RCALL _nrf905_SpiRW
(0135) SET(PORTB,CSN); // Disable Spi
77 9AC4 SBI 0x18,4
78 9508 RET
_nrf905_SpiRW:
temp --> R10
val --> R16
79 92AA ST R10,-Y
(0136) }
(0137)
(0138) uchar nrf905_SpiRW(uchar val)
(0139) {uchar temp;
(0140)
(0141) SPDR=val;
7A B90F OUT 0x0F,R16
(0142) while ((SPSR&(1<<SPIF))==0);
7B 9B77 SBIS 0x0E,7
7C CFFE RJMP 0x007B
(0143) temp=SPDR;
7D B0AF IN R10,0x0F
(0144) return temp;
7E 2D0A MOV R16,R10
7F 90A9 LD R10,Y+
80 9508 RET
(0145) }
(0146)
(0147) //PwrDown->StandBy
(0148) void nrf905_StandBy()
(0149) {
(0150) SET(PORTB,PWR);
_nrf905_StandBy:
81 9AC0 SBI 0x18,0
(0151) CLR(PORTB,TRXCE);
82 98C1 CBI 0x18,1
(0152) CLR(PORTB,TX_EN);
83 98C2 CBI 0x18,2
84 9508 RET
(0153) }
(0154)
(0155) //->PwrDown
(0156) void nrf905_Off()
(0157) {
(0158) CLR(PORTB,PWR);
_nrf905_Off:
85 98C0 CBI 0x18,0
86 9508 RET
(0159) }
(0160)
(0161) //->ShockBurst Send
(0162) void nrf905_TxOn()
(0163) {
(0164) SET(PORTB,PWR);
_nrf905_TxOn:
87 9AC0 SBI 0x18,0
(0165) SET(PORTB,TX_EN);
88 9AC2 SBI 0x18,2
(0166) CLR(PORTB,TRXCE);
89 98C1 CBI 0x18,1
8A 9508 RET
(0167) }
(0168)
(0169) //->ShockBurst Send
(0170) void nrf905_TxSend()
(0171) {
(0172) SET(PORTB,TRXCE);
_nrf905_TxSend:
8B 9AC1 SBI 0x18,1
(0173) DelayUs(20);//>10us
8C E104 LDI R16,0x14
8D E010 LDI R17,0
8E 940E 01E1 CALL _DelayUs
(0174) CLR(PORTB,TRXCE);//只发送一次
90 98C1 CBI 0x18,1
91 9508 RET
(0175) }
(0176)
(0177) //->ShockBurst Recv
(0178) void nrf905_RxOn()
(0179) {
(0180) SET(PORTB,PWR);
_nrf905_RxOn:
92 9AC0 SBI 0x18,0
(0181) CLR(PORTB,TX_EN);//maybe first
93 98C2 CBI 0x18,2
(0182) SET(PORTB,TRXCE);
94 9AC1 SBI 0x18,1
95 9508 RET
(0183) }
(0184)
(0185) //初始化nrf905
(0186) void nrf905_Init()
(0187) {
(0188) nrf905_StandBy();
_nrf905_Init:
96 DFEA RCALL _nrf905_StandBy
(0189) DelayMs(10);//!!!must >3ms
97 E00A LDI R16,0xA
98 940E 01D3 CALL _DelayMs
(0190) nrf905_Config();
9A DFB2 RCALL _nrf905_Config
(0191)
(0192) nrf905_SpiTest();//test...
9B D002 RCALL _nrf905_SpiTest
(0193) nrf905_RxOn();
9C DFF5 RCALL _nrf905_RxOn
9D 9508 RET
_nrf905_SpiTest:
i --> R20
9E 934A ST R20,-Y
(0194) }
(0195)
(0196) //测试:通过读配置,判断SPI操作是否正确
(0197) void nrf905_SpiTest()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -