?? ptr8000.lst
字號:
__text_start:
__start:
002A E5CF LDI R28,0x5F
002B E0D4 LDI R29,4
002C BFCD OUT 0x3D,R28
002D BFDE OUT 0x3E,R29
002E 51C0 SUBI R28,0x10
002F 40D0 SBCI R29,0
0030 EA0A LDI R16,0xAA
0031 8308 STD Y+0,R16
0032 2400 CLR R0
0033 E6E0 LDI R30,0x60
0034 E0F0 LDI R31,0
0035 E010 LDI R17,0
0036 3AE4 CPI R30,0xA4
0037 07F1 CPC R31,R17
0038 F011 BEQ 0x003B
0039 9201 ST R0,Z+
003A CFFB RJMP 0x0036
003B 8300 STD Z+0,R16
003C E5E4 LDI R30,0x54
003D E0F0 LDI R31,0
003E E6A0 LDI R26,0x60
003F E0B0 LDI R27,0
0040 E010 LDI R17,0
0041 35E4 CPI R30,0x54
0042 07F1 CPC R31,R17
0043 F021 BEQ 0x0048
0044 95C8 LPM
0045 9631 ADIW R30,1
0046 920D ST R0,X+
0047 CFF9 RJMP 0x0041
0048 940E0181 CALL _main
_exit:
004A CFFF RJMP _exit
_nrf905_Config:
004B 940E020B CALL push_gset2
FILE: D:\IccAvr\Pei\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 片選開
004D 98C4 CBI 0x18,4
(0124) nrf905_SpiRW(WC); // Write config command
004E 2700 CLR R16
004F 2711 CLR R17
0050 D02A RCALL _nrf905_SpiRW
(0125) nrf905_SpiRW(CH_NO_BYTE); //中心頻率低8位
0051 E40C LDI R16,0x4C
0052 E010 LDI R17,0
0053 D027 RCALL _nrf905_SpiRW
(0126) nrf905_SpiRW(PA_PWR_10dBm | HFREQ_PLL_433MHz); //發射+10dBm,發射頻率433MHz,中心頻率第9位=0
0054 E00C LDI R16,0xC
0055 E010 LDI R17,0
0056 D024 RCALL _nrf905_SpiRW
(0127) nrf905_SpiRW(TX_AFW_4BYTE | RX_AFW_4BYTE); //接收地址寬度4字節,發送地址寬度4字節
0057 E404 LDI R16,0x44
0058 E010 LDI R17,0
0059 D021 RCALL _nrf905_SpiRW
(0128) nrf905_SpiRW(RX_PW_32BYTE); //接收數據寬度32字節
005A E200 LDI R16,0x20
005B E010 LDI R17,0
005C D01E RCALL _nrf905_SpiRW
(0129) nrf905_SpiRW(TX_PW_32BYTE); //發送數據寬度32字節
005D E200 LDI R16,0x20
005E E010 LDI R17,0
005F D01B RCALL _nrf905_SpiRW
(0130) nrf905_SpiRW(RX_ADDRESS_0); //接收有效地址第1字節
0060 E102 LDI R16,0x12
0061 E010 LDI R17,0
0062 E020 LDI R18,0
0063 E030 LDI R19,0
0064 D016 RCALL _nrf905_SpiRW
(0131) nrf905_SpiRW(RX_ADDRESS_1); //接收有效地址第2字節
0065 E304 LDI R16,0x34
0066 E010 LDI R17,0
0067 E020 LDI R18,0
0068 E030 LDI R19,0
0069 D011 RCALL _nrf905_SpiRW
(0132) nrf905_SpiRW(RX_ADDRESS_2); //接收有效地址第3字節
006A E506 LDI R16,0x56
006B E010 LDI R17,0
006C E020 LDI R18,0
006D E030 LDI R19,0
006E D00C RCALL _nrf905_SpiRW
(0133) nrf905_SpiRW(RX_ADDRESS_3); //接收有效地址第4字節
006F E708 LDI R16,0x78
0070 E010 LDI R17,0
0071 E020 LDI R18,0
0072 E030 LDI R19,0
0073 D007 RCALL _nrf905_SpiRW
(0134) nrf905_SpiRW(CRC16_EN | XOF_16MHz); //CRC16模式使能,晶體振蕩器頻率16MHz
0074 ED08 LDI R16,0xD8
0075 E010 LDI R17,0
0076 D004 RCALL _nrf905_SpiRW
(0135) SET(PORTB,CSN); // Disable Spi
0077 9AC4 SBI 0x18,4
0078 940E0202 CALL pop_gset2
007A 9508 RET
_nrf905_SpiRW:
temp --> R20
val --> R16
007B 940E020D CALL push_gset1
(0136) }
(0137)
(0138) uchar nrf905_SpiRW(uchar val)
(0139) {uchar temp;
(0140)
(0141) SPDR=val;
007D B90F OUT 0x0F,R16
(0142) while ((SPSR&(1<<SPIF))==0);
007E 9B77 SBIS 0x0E,7
007F CFFE RJMP 0x007E
(0143) temp=SPDR;
0080 B14F IN R20,0x0F
(0144) return temp;
0081 2F04 MOV R16,R20
0082 940E0210 CALL pop_gset1
0084 9508 RET
(0145) }
(0146)
(0147) //PwrDown->StandBy
(0148) void nrf905_StandBy()
(0149) {
(0150) SET(PORTB,PWR);
_nrf905_StandBy:
0085 9AC0 SBI 0x18,0
(0151) CLR(PORTB,TRXCE);
0086 98C1 CBI 0x18,1
(0152) CLR(PORTB,TX_EN);
0087 98C2 CBI 0x18,2
0088 9508 RET
(0153) }
(0154)
(0155) //->PwrDown
(0156) void nrf905_Off()
(0157) {
(0158) CLR(PORTB,PWR);
_nrf905_Off:
0089 98C0 CBI 0x18,0
008A 9508 RET
(0159) }
(0160)
(0161) //->ShockBurst Send
(0162) void nrf905_TxOn()
(0163) {
(0164) SET(PORTB,PWR);
_nrf905_TxOn:
008B 9AC0 SBI 0x18,0
(0165) SET(PORTB,TX_EN);
008C 9AC2 SBI 0x18,2
(0166) CLR(PORTB,TRXCE);
008D 98C1 CBI 0x18,1
008E 9508 RET
(0167) }
(0168)
(0169) //->ShockBurst Send
(0170) void nrf905_TxSend()
(0171) {
(0172) SET(PORTB,TRXCE);
_nrf905_TxSend:
008F 9AC1 SBI 0x18,1
(0173) DelayUs(20);//>10us
0090 E104 LDI R16,0x14
0091 E010 LDI R17,0
0092 940E01EF CALL _DelayUs
(0174) CLR(PORTB,TRXCE);//只發送一次
0094 98C1 CBI 0x18,1
0095 9508 RET
(0175) }
(0176)
(0177) //->ShockBurst Recv
(0178) void nrf905_RxOn()
(0179) {
(0180) SET(PORTB,PWR);
_nrf905_RxOn:
0096 9AC0 SBI 0x18,0
(0181) CLR(PORTB,TX_EN);//maybe first
0097 98C2 CBI 0x18,2
(0182) SET(PORTB,TRXCE);
0098 9AC1 SBI 0x18,1
0099 9508 RET
(0183) }
(0184)
(0185) //初始化nrf905
(0186) void nrf905_Init()
(0187) {
(0188) nrf905_StandBy();
_nrf905_Init:
009A DFEA RCALL _nrf905_StandBy
(0189) DelayMs(10);//!!!must >3ms
009B E00A LDI R16,0xA
009C 940E01E1 CALL _DelayMs
(0190) nrf905_Config();
009E DFAC RCALL _nrf905_Config
(0191)
(0192) nrf905_SpiTest();//test...
009F D002 RCALL _nrf905_SpiTest
(0193) nrf905_RxOn();
00A0 DFF5 RCALL _nrf905_RxOn
00A1 9508 RET
_nrf905_SpiTest:
i --> R20
00A2 940E020D CALL push_gset1
(0194) }
(0195)
(0196) //測試:通過讀配置,判斷SPI操作是否正確
(0197) void nrf905_SpiTest()
(0198) {uchar i;
(0199) CLR(PORTB,CSN);
00A4 98C4 CBI 0x18,4
(0200) nrf905_SpiRW(RC); //讀配置
00A5 E100 LDI R16,0x10
00A6 DFD4 RCALL _nrf905_SpiRW
(0201) for (i=0;i<10;i++)
00A7 2744 CLR R20
00A8 C00A RJMP 0x00B3
(0202) {
(0203) RxBuf[i]= nrf905_SpiRW(0);//read from nrf905
00A9 2700 CLR R16
00AA DFD0 RCALL _nrf905_SpiRW
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -