Reception working in reflexframe.c.
[goodfet] / shellcode / chipcon / cc1110 / reflexframe.c
1 #include <cc1110.h>
2 #include "cc1110-ext.h"
3
4 char __xdata at 0xfe00 packet[256] ;
5 void carrier(){
6   // Set the system clock source to HS XOSC and max CPU speed,
7   // ref. [clk]=>[clk_xosc.c]
8   SLEEP &= ~SLEEP_OSC_PD;
9   while( !(SLEEP & SLEEP_XOSC_S) );
10   CLKCON = (CLKCON & ~(CLKCON_CLKSPD | CLKCON_OSC)) | CLKSPD_DIV_1;
11   while (CLKCON & CLKCON_OSC);
12   SLEEP |= SLEEP_OSC_PD;
13
14
15   /* Setup radio with settings from SmartRF® Studio. The default settings are
16    * used, except that "unmodulated" is chosen in the "Simple RX tab". This
17    * results in an umodulated carrier with a frequency of approx. 2.433 GHz.
18    */
19   //FSCTRL1   = 0x0A;   // Frequency synthesizer control.
20   //FSCTRL0   = 0x00;   // Frequency synthesizer control.
21   
22   
23   
24   MDMCFG4   = 0x86;   // Modem configuration.
25   MDMCFG3   = 0x83;   // Modem configuration.
26   MDMCFG2   = 0x30;   // Modem configuration.
27   MDMCFG1   = 0x22;   // Modem configuration.
28   MDMCFG0   = 0xF8;   // Modem configuration.
29   
30   /*
31   CHANNR    = 0x00;   // Channel number.
32   DEVIATN   = 0x00;   // Modem deviation setting (when FSK modulation is enabled).
33   FREND1    = 0x56;   // Front end RX configuration.
34   FREND0    = 0x10;   // Front end RX configuration.
35   MCSM0     = 0x14;   // Main Radio Control State Machine configuration.
36   FOCCFG    = 0x16;   // Frequency Offset Compensation Configuration.
37   BSCFG     = 0x6C;   // Bit synchronization Configuration.
38   AGCCTRL2  = 0x03;   // AGC control.
39   AGCCTRL1  = 0x40;   // AGC control.
40   AGCCTRL0  = 0x91;   // AGC control.
41   FSCAL3    = 0xE9;   // Frequency synthesizer calibration.
42   FSCAL2    = 0x2a;   // Frequency synthesizer calibration.
43   FSCAL1    = 0x00;   // Frequency synthesizer calibration.
44   FSCAL0    = 0x1f;   // Frequency synthesizer calibration
45   
46   TEST2     = 0x88;   // Various test settings.
47   TEST1     = 0x31;   // Various test settings.
48   TEST0     = 0x09;   // Various test settings.
49   
50   //FE is too high
51   PA_TABLE0 = 0xFF;   // PA output power setting.
52   PKTCTRL1  = 0x04;   // Packet automation control.
53   PKTCTRL0  = 0x22;   // Packet automation control.
54   ADDR      = 0x00;   // Device address.
55   PKTLEN    = 0xFF;   // Packet length.
56   */
57   /* Settings not from SmartRF® Studio. Setting both sync word registers to
58    * 0xAA = 0b10101010, i.e., the same as the preamble pattern. Not necessary,
59    * but gives control of what the radio attempts to transmit.
60    */
61   
62   //These sync values are better for jamming, but they break reception.
63   //SYNC1     = 0xAA;
64   //SYNC0     = 0xAA;
65
66   /* Put radio in TX. 
67   RFST      = RFST_STX;
68   while ((MARCSTATE & MARCSTATE_MARC_STATE) != MARC_STATE_TX);
69   */
70
71   
72 #define RFON RFST = RFST_SIDLE; RFST = RFST_STX; while ((MARCSTATE & MARCSTATE_MARC_STATE) != MARC_STATE_TX);
73 #define RFOFF RFST = RFST_SIDLE; //while ((MARCSTATE & MARCSTATE_MARC_STATE) != MARC_STATE_IDLE);
74   //RFON;
75   //while(1);  
76   
77   
78 }
79
80
81 void sleepMillis(int ms) {
82         int j;
83         while (--ms > 0) { 
84                 for (j=0; j<1200;j++); // about 1 millisecond
85         };
86 }
87
88 //! Wait for a packet to come, then immediately return.
89 void rxwait(){
90   int i=0;
91
92   //Disable interrupts.
93   RFTXRXIE=0;
94   
95   //idle a bit.
96   RFST=RFST_SIDLE;
97   while(MARCSTATE!=MARC_STATE_IDLE);
98   
99   sleepMillis(10);
100   //Begin to receive.
101   RFST=RFST_SRX;
102   while(MARCSTATE!=MARC_STATE_RX);
103     
104   //Incoming!
105   
106   
107   //Fixed length
108   packet[i++]=PKTLEN;
109   while(i<PKTLEN && MARCSTATE==MARC_STATE_RX){
110     
111     while(MARCSTATE==MARC_STATE_RX && !RFTXRXIF); //Wait for byte to be ready.
112     RFTXRXIF=0;      //Clear the flag.
113     
114     return;
115     
116     packet[i++]=RFD; //Grab the next byte.
117   }
118   
119   
120   
121   //sleepMillis(10);
122   //RFST = RFST_SIDLE; //End receive.  
123 }
124
125 //! Reflexively jam on the present channel by responding to a signal with a carrier wave.
126 void main(){
127   unsigned char threshold=packet[0], i=0, rssi=0;;
128   
129   //Disable interrupts.
130   RFTXRXIE=0;
131   
132   //carrier();
133   
134   //idle a bit.
135   //RFST=RFST_SIDLE;
136   //while(MARCSTATE!=MARC_STATE_IDLE);
137
138   while(1){
139     sleepMillis(5);
140     rxwait();
141     
142     //idle a bit.
143     //RFST=RFST_SIDLE;
144     //while(MARCSTATE!=MARC_STATE_IDLE);
145     //HALT;
146     
147     //RFOFF;
148     
149     //SYNC1=0xAA;
150     //SYNC0=0xAA;
151     
152     //Transmit carrier for 10ms
153     carrier();
154     //RFON;
155     HALT;
156   }  
157 }