📄 avrcc1100.lst
字号:
022A 1784 CP R24,R20
022B F020 BCS 0x0230
(0059) spiWriteReg(CC1100_PKTLEN,pktLength);
022C 2F24 MOV R18,R20
022D E006 LDI R16,6
022E DE9F RCALL _spiWriteReg
022F C002 RJMP 0x0232
(0060)
(0061) else
(0062) return FALSE;
0230 2700 CLR R16
0231 C001 RJMP 0x0233
(0063)
(0064) //ret= NO_ERRO;
(0065) return TRUE;
0232 E001 LDI R16,1
0233 D0D5 RCALL pop_gset1
0234 9508 RET
_setSendType:
regVal --> R20
sendType --> R22
0235 D0CE RCALL push_gset2
0236 2F60 MOV R22,R16
(0066) }
(0067)
(0068) // 设置发送方式
(0069) BOOL setSendType(SendType sendType)
(0070) {
(0071) BYTE regVal;
(0072) //ErroState ret;
(0073) regVal = spiReadReg(CC1100_PKTCTRL1);
0237 E007 LDI R16,7
0238 DE3D RCALL _spiReadReg
0239 2F40 MOV R20,R16
(0074)
(0075) if(sendType == NO_ADDRESS)
023A 2366 TST R22
023B F419 BNE 0x023F
(0076) {
(0077) regVal |= 0x03;
023C 6043 ORI R20,3
(0078) regVal &= 0xFC;
023D 7F4C ANDI R20,0xFC
(0079) }
023E C00C RJMP 0x024B
(0080)
(0081) else if(sendType == UNICAST)
023F 3061 CPI R22,1
0240 F419 BNE 0x0244
(0082) {
(0083) regVal |= 0x03;
0241 6043 ORI R20,3
(0084) regVal &= 0xFD;
0242 7F4D ANDI R20,0xFD
(0085) }
0243 C007 RJMP 0x024B
(0086)
(0087) else if(sendType == BROADCAST)
0244 3062 CPI R22,2
0245 F419 BNE 0x0249
(0088) {
(0089) regVal |= 0x03;
0246 6043 ORI R20,3
(0090) regVal &= 0xFE;
0247 7F4E ANDI R20,0xFE
(0091) }
0248 C002 RJMP 0x024B
(0092)
(0093) else
(0094) //ret = NOT_MATCH;
(0095) return FALSE;
0249 2700 CLR R16
024A C004 RJMP 0x024F
(0096)
(0097) spiWriteReg(CC1100_PKTCTRL1,regVal);
024B 2F24 MOV R18,R20
024C E007 LDI R16,7
024D DE80 RCALL _spiWriteReg
(0098) // ret = NO_ERRO;
(0099) return TRUE;
024E E001 LDI R16,1
024F D0AA RCALL pop_gset2
0250 9508 RET
_setAddress:
addr --> R20
0251 D0B4 RCALL push_gset1
0252 2F40 MOV R20,R16
(0100) }
(0101)
(0102) // 设置CC1100的地址
(0103) BOOL setAddress(BYTE addr)
(0104) {
(0105) //ErroState ret;
(0106) if(addr >=0 && addr <= 255)
0253 3040 CPI R20,0
0254 F038 BCS 0x025C
0255 EF8F LDI R24,0xFF
0256 1784 CP R24,R20
0257 F020 BCS 0x025C
(0107) spiWriteReg(CC1100_ADDR,addr);
0258 2F24 MOV R18,R20
0259 E009 LDI R16,0x9
025A DE73 RCALL _spiWriteReg
025B C002 RJMP 0x025E
(0108)
(0109) else
(0110) //ret = NOT_MATCH;
(0111) return FALSE;
025C 2700 CLR R16
025D C001 RJMP 0x025F
(0112) // ret= NO_ERRO;
(0113) return TRUE;
025E E001 LDI R16,1
025F D0A9 RCALL pop_gset1
0260 9508 RET
(0114) }
(0115)
(0116) // 系统初始化相关函数
(0117) // setup the interupt INT0 for GDO2
(0118) void GDO2Int()
(0119) {
(0120) SREG |= (1<<GIE);
_GDO2Int:
0261 9478 BSET 7
(0121)
(0122) EICRA |= (1<<ISC00)|(1<<ISC01);
0262 91800069 LDS R24,0x69
0264 6083 ORI R24,3
0265 93800069 STS 0x69,R24
(0123) //EICRA &= ~(1<<ISC00);
(0124)
(0125) EIMSK |= (1<<INT0);
0267 9AE8 SBI 0x1D,0
0268 9508 RET
(0126) }
(0127)
(0128) // 配置MCU的SPI口
(0129) void SpiInit()
(0130) {
(0131) /* Set MOSI and SCK output, all others input */
(0132) DDR_SPI = (1<<DD_MOSI)|(1<<DD_SCLK)|(1<<DD_SS);
_SpiInit:
0269 E28C LDI R24,0x2C
026A B984 OUT 0x04,R24
(0133) PORT_SPI &= ~(1<<DD_MOSI);
026B 982B CBI 0x05,3
(0134) /* Enable SPI, Master, set clock rate fck/16 */
(0135) SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
026C E581 LDI R24,0x51
026D BD8C OUT 0x2C,R24
(0136)
(0137) SPCR |= (0<<CPHA)|(0<<CPOL);
026E B42C IN R2,0x2C
026F BC2C OUT 0x2C,R2
(0138) SPCR &= ~(BIT(DORD));
0270 B58C IN R24,0x2C
0271 7D8F ANDI R24,0xDF
0272 BD8C OUT 0x2C,R24
(0139)
(0140) DDRD &= ~BIT(DDD5);
0273 9855 CBI 0x0A,5
0274 9508 RET
(0141)
(0142) }
(0143)
(0144)
(0145)
(0146) // MCU的USART(通用串口)初始化,可以配置波特率
(0147) void serialInit(UINT16 baudrate)
(0148) {
(0149) // 设置串口模式为:8个数据位,1个停止位,无奇偶校验
(0150) UCSR0C = (3<<UCSZ00);
_serialInit:
baudrate --> R16
0275 E086 LDI R24,6
0276 938000C2 STS 0xC2,R24
(0151) // 配置波特率
(0152) UBRR0H = (BYTE)(baudrate>>8);
0278 0118 MOVW R2,R16
0279 2C23 MOV R2,R3
027A 2433 CLR R3
027B 922000C5 STS 0xC5,R2
(0153) UBRR0L = (BYTE)baudrate;
027D 930000C4 STS 0xC4,R16
(0154)
(0155) // 打开串口发送和接收使能
(0156) UCSR0B |= (1<<RXEN0)|(1<<TXEN0);
027F 918000C1 LDS R24,0xC1
0281 6188 ORI R24,0x18
0282 938000C1 STS 0xC1,R24
(0157) //打开接收中断
(0158) USART_RECINT_ENABLE();
0284 918000C1 LDS R24,0xC1
0286 6880 ORI R24,0x80
0287 938000C1 STS 0xC1,R24
0289 9508 RET
FILE: H:\work\myWork\AVR-CC1100\main.c
(0001) /*******************************************************************************************************
(0002) * Compiler: WINAVR
(0003) * Target platform: Atmega88 and Chipcon CC1100
(0004) * Author: 陈思
(0005) *******************************************************************************************************
(0006) * 2007-12-26 13:19:41
(0007) ******************************************************************************************************/
(0008)
(0009) #include "protocol.h"
(0010)
(0011) #define FOSC 1000000
(0012) #define BAUDRATE 4800
(0013) #define BAUDREG FOSC/16/BAUDRATE-1
(0014) #define MAXSIZE 255
(0015)
(0016) //#pragma interrupt_handler USART_INT:iv_USART0_RX
(0017) //#pragma interrupt_handler REC_PKT:iv_INT0
(0018)
(0019) // 表示串口状态的全局变量
(0020) USART_FLAG fUART;
(0021) ChipState fCC1100;
(0022) BYTE RecData[MAXSIZE];
(0023) BYTE RecLen = 0;
(0024)
(0025) // USART 接收到一个字节完成中断
(0026) void USART_INT(void)
(0027)
(0028)
(0029) {
(0030) BYTE recByte;
(0031) USART_RECINT_DISABLE();
_USART_INT:
recByte --> R16
028A 918000C1 LDS R24,0xC1
028C 778F ANDI R24,0x7F
028D 938000C1 STS 0xC1,R24
(0032)
(0033) recByte = UDR0;
028F 910000C6 LDS R16,0xC6
(0034)
(0035) if(recByte == 0xAA)
0291 3A0A CPI R16,0xAA
0292 F441 BNE 0x029B
(0036) {
(0037) if(fUART == USART_IDLE)
0293 90200226 LDS R2,fUART
0295 2022 TST R2
0296 F4F9 BNE 0x02B6
(0038) fUART = USART_RECIEVE;
0297 E082 LDI R24,2
0298 93800226 STS fUART,R24
(0039) }
029A C01B RJMP 0x02B6
(0040) else if(recByte == 0x55)
029B 3505 CPI R16,0x55
029C F441 BNE 0x02A5
(0041) {
(0042) if(fUART == USART_RECIEVE)
029D 91800226 LDS R24,fUART
029F 3082 CPI R24,2
02A0 F4A9 BNE 0x02B6
(0043) fUART = USART_RECIEVE_FINISH;
02A1 E083 LDI R24,3
02A2 93800226 STS fUART,R24
(0044) }
02A4 C011 RJMP 0x02B6
(0045) else
(0046) {
(0047) if(fUART == USART_RECIEVE)
02A5 91800226 LDS R24,fUART
02A7 3082 CPI R24,2
02A8 F469 BNE 0x02B6
(0048) {
(0049) RecData[RecLen+1] = recByte;
02A9 E287 LDI R24,0x27
02AA E091 LDI R25,1
02AB 91E00125 LDS R30,RecLen
02AD 27FF CLR R31
02AE 0FE8 ADD R30,R24
02AF 1FF9 ADC R31,R25
02B0 8300 STD Z+0,R16
(0050) RecLen ++;
02B1 91800125 LDS R24,RecLen
02B3 5F8F SUBI R24,0xFF
02B4 93800125 STS RecLen,R24
(0051) }
(0052) }
(0053)
(0054) USART_RECINT_ENABLE();
02B6 918000C1 LDS R24,0xC1
02B8 6880 ORI R24,0x80
02B9 938000C1 STS 0xC1,R24
02BB 9508 RET
(0055) }
(0056)
(0057) // 检测到数据包的到来,用INT0通知MCU
(0058) void REC_PKT(void)
(0059) {
(0060) INT0_DISABLE(); // 关中断
_REC_PKT:
02BC 98E8 CBI 0x1D,0
(0061)
(0062) // if(fCC1100 == SLEEP)
(0063) spiReceivePacket(RecData,MAXSIZE);
02BD EF2F LDI R18,0xFF
02BE E206 LDI R16,0x26
02BF E011 LDI R17,1
02C0 DED3 RCALL _spiReceivePacket
(0064)
(0065) EIFR |= (1<<INTF0); // 清中断标志位,并开中断
02C1 9AE0 SBI 0x1C,0
(0066) INT0_ENABLE();
02C2 9AE8 SBI 0x1D,0
02C3 9508 RET
_main:
02C4 9722 SBIW R28,2
(0067) }
(0068)
(0069) void main()
(0070) {
(0071) // 系统初始化部分
(0072) CLI();
02C5 94F8 BCLR 7
(0073) WDTCSR = 0x00;
02C6 2422 CLR R2
02C7 92200060 STS 0x60,R2
(0074) fUART = USART_IDLE;
02C9 92200226 STS fUART,R2
(0075)
(0076) SpiInit();
02CB DF9D RCALL _SpiInit
(0077) cc1100Init();
02CC DDA6 RCALL _cc1100Init
(0078) //GDO2Int();
(0079) //GDO2_INT0();
(0080) //serialInit(12);
(0081) NOP();
02CD 0000 NOP
(0082) SEI();
02CE 9478 BSET 7
(0083)
(0084) memset(RecData,0,MAXSIZE);
02CF EF8F LDI R24,0xFF
02D0 E090 LDI R25,0
02D1 8399 STD Y+1,R25
02D2 8388 STD Y+0,R24
02D3 2722 CLR R18
02D4 2733 CLR R19
02D5 E206 LDI R16,0x26
02D6 E011 LDI R17,1
02D7 D017 RCALL _memset
(0085)
(0086) setPktType(DEFINED_LENGTH);
02D8 E001 LDI R16,1
02D9 DF33 RCALL _setPktType
(0087) setAddress(0x00);
02DA 2700 CLR R16
02DB DF75 RCALL _setAddress
(0088) setPktLen(0xFF);
02DC EF0F LDI R16,0xFF
02DD DF46 RCALL _setPktLen
(0089) setSendType(NO_ADDRESS);
02DE 2700 CLR R16
02DF DF55 RCALL _setSendType
(0090)
(0091) spiWriteReg(CC1100_IOCFG0,0x06);
02E0 E026 LDI R18,6
02E1 E002 LDI R16,2
02E2 DDEB RCALL _spiWriteReg
02E3 C007 RJMP 0x02EB
(0092)
(0093) //initWorMode();
(0094)
(0095) /*
(0096) while(1)
(0097) {
(0098) if(fUART == USART_RECIEVE_FINISH)
(0099) {
(0100) CLI();
(0101) RecData[0] = RecLen;
(0102) spiSendPacket(RecData,RecLen+1);
(0103) fUART = USART_IDLE;
(0104)
(0105) memset(RecData,0,RecLen+1);
(0106) RecLen = 0;
(0107)
(0108) SEI();
(0109) }
(0110) }
(0111)
(0112) */
(0113) while(1)
(0114) {
(0115) if(spiReceivePacket(RecData,MAXSIZE))
02E4 EF2F LDI R18,0xFF
02E5 E206 LDI R16,0x26
02E6 E011 LDI R17,1
02E7 DEAC RCALL _spiReceivePacket
02E8 2300 TST R16
02E9 F009 BEQ 0x02EB
(0116) break;
02EA C001 RJMP 0x02EC
02EB CFF8 RJMP 0x02E4
(0117) }
(0118)
(0119)
(0120)
(0121) while(1);
FILE: <library>
02EC CFFF RJMP 0x02EC
02ED 9622 ADIW R28,2
02EE 9508 RET
_memset:
02EF 8188 LDD R24,Y+0
02F0 8199 LDD R25,Y+1
02F1 3080 CPI R24,0
02F2 0789 CPC R24,R25
02F3 F029 BEQ 0x02F9
02F4 2FE0 MOV R30,R16
02F5 2FF1 MOV R31,R17
02F6 9321 ST R18,Z+
02F7 9701 SBIW R24,1
02F8 F7E9 BNE 0x02F6
02F9 9508 RET
pop_gset2:
02FA E0E2 LDI R30,2
02FB C00E RJMP pop
pop_gset3:
02FC E0E4 LDI R30,4
02FD C00C RJMP pop
push_gset5:
02FE 92FA ST R15,-Y
02FF 92EA ST R14,-Y
push_gset4:
0300 92DA ST R13,-Y
0301 92CA ST R12,-Y
push_gset3:
0302 92BA ST R11,-Y
0303 92AA ST R10,-Y
push_gset2:
0304 937A ST R23,-Y
0305 936A ST R22,-Y
push_gset1:
0306 935A ST R21,-Y
0307 934A ST R20,-Y
0308 9508 RET
pop_gset1:
0309 E0E1 LDI R30,1
pop:
030A 9149 LD R20,Y+
030B 9159 LD R21,Y+
030C FDE0 SBRC R30,0
030D 9508 RET
030E 9169 LD R22,Y+
030F 9179 LD R23,Y+
0310 FDE1 SBRC R30,1
0311 9508 RET
0312 90A9 LD R10,Y+
0313 90B9 LD R11,Y+
0314 FDE2 SBRC R30,2
0315 9508 RET
0316 90C9 LD R12,Y+
0317 90D9 LD R13,Y+
0318 FDE3 SBRC R30,3
0319 9508 RET
031A 90E9 LD R14,Y+
031B 90F9 LD R15,Y+
031C 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -