Forum: Mikrocontroller und Digitale Elektronik CC110L OOK sendet ein Bit zu viel!?


von Info (Gast)


Angehängte Dateien:

Lesenswert?

TI Launchpad mit MSP430G2553 @ 1 MHz und AIR Booster Pack mit Anaren 
LR09A (CC110L [das ist ein abgespeckter CC1101] mit 27 MHz und 900 MHz 
PCB-Antenne)

http://www.ti.com/product/MSP430G2553
http://www.ti.com/tool/msp-exp430g2
http://www.ti.com/tool/430boost-cc110l
https://www.anaren.com/air/air-boosterpack
http://www.ti.com/product/CC110L

Der folgende Code soll ein einfaches Byte mit OOK senden. Nachdem ich 
die richtige Quarzfrequenz eingestellt und CRC_EN und APPEND_STATUS 
manuell deaktiviert habe, wie sie aus SMARTRF Studio 7 herauskommen 
(einschließlich ungültiger Wert 0x127 für RESERVED @ 0x2A -> siehe 
Datenblatt, hier wird fälschlich der Dezimalwert als Hex ausgegeben. 
Default ist 0x7F. Macht aber keinen Unterschied.), wird das Byte auch 
gesendet, aber das letzte Bit hat doppelte Länge bzw. es wird ein Bit 
angehängt.

Ich sehe keine weitere Einstellung, die das verursachen könnten. Es 
passiert auch nur, wenn das letzte Bit 1 ist (z.B. 0xAA vs 0xA9).

In den Errata steht nur was von einem doppelt gesendeten Byte.

1
#include <msp430.h>
2
#include "stdint.h"
3
#include "stdbool.h"
4
5
// Anaren AIR booster pack with LR09A (868/9xx MHz)
6
// CC110L
7
#define GDO2_BIT   BIT0 // P1
8
#define SCLK_BIT   BIT5 // P1
9
#define MISO_BIT   BIT6 // P1
10
#define MOSI_BIT   BIT7 // P1
11
12
#define GDO0_BIT   BIT6 // P2
13
#define CSN_BIT    BIT7 // P2
14
15
// 2553
16
//#define LEDrd_BIT  BIT0 // P1
17
#define RX_BIT     BIT1 // P1
18
#define TX_BIT     BIT2 // P1
19
#define button_BIT BIT3 // P1
20
//#define LEDgn_BIT  BIT6 // P1
21
22
uint8_t status;
23
uint8_t test;
24
25
uint8_t
26
softSPI(
27
    uint8_t write
28
    )
29
{
30
  uint8_t read = 0;
31
32
  P1OUT &= ~(SCLK_BIT);
33
34
  uint8_t n;
35
  for(n=8; n--;){
36
37
    // OUT
38
    if (write & 1<<n){
39
      P1OUT |= MOSI_BIT;
40
    }
41
    else{
42
      P1OUT &= ~(MOSI_BIT);
43
    }
44
45
    // CLOCK
46
    P1OUT |= SCLK_BIT;
47
48
    // IN
49
    if (P1IN & MISO_BIT){
50
      read |= 1<<n;
51
    }
52
53
    P1OUT &= ~(SCLK_BIT);
54
  }
55
56
  return read;
57
}
58
59
uint8_t
60
CC(
61
    bool rw,
62
    bool burst,
63
    uint8_t address,
64
    uint8_t data
65
    )
66
{
67
  uint8_t header =
68
       (rw<<7)      //
69
      |(burst<<6)      //
70
      |(address & 0x3F)  // 0x00 to 0x2E.
71
      ;
72
73
  P2OUT &= ~(CSN_BIT);
74
  while(P1IN & MISO_BIT);
75
76
  /*uint8_t*/ status = softSPI(header);
77
  uint8_t read   = softSPI(data);
78
79
  P2OUT |= CSN_BIT;
80
81
  return read;
82
}
83
84
uint8_t CS(
85
    bool rw,
86
    uint8_t address
87
    )
88
{
89
  uint8_t header =
90
       (rw<<7)      //
91
      //|(0<<6)      //
92
      |(address & 0x3D)  // 0x30 through 0x3D).
93
      ;
94
95
  P2OUT &= ~(CSN_BIT);
96
  while(P1IN & MISO_BIT);
97
98
  uint8_t status = softSPI(header);
99
100
  P2OUT |= CSN_BIT;
101
102
  return status;
103
}
104
105
int main(void) {
106
  
107
    // Stop watchdog timer
108
    WDTCTL = WDTPW | WDTHOLD;
109
110
    BCSCTL1 = CALBC1_1MHZ;
111
    DCOCTL =  CALDCO_1MHZ;
112
113
    // serial
114
    P1DIR = TX_BIT;
115
    P2DIR = 0;
116
117
    // CC110x soft-SPI
118
    P1DIR |= (MOSI_BIT | SCLK_BIT);
119
120
    P2OUT |= CSN_BIT;
121
    P2DIR |= (CSN_BIT);
122
    P2SEL &= ~(CSN_BIT);
123
    P2SEL2 &= ~(CSN_BIT);
124
125
    // Manual Reset
126
127
    // Set SCLK = 1 and SI = 0.
128
    P1OUT |= (SCLK_BIT);
129
    P1OUT &= ~(MOSI_BIT);
130
131
    // Strobe CSn low / high.
132
    //P2OUT &= ~(CSN_BIT);
133
    //P2OUT |= CSN_BIT;
134
    // Hold CSn low and then high for at least 40 µs relative to pulling CSn low
135
    P2OUT &= ~(CSN_BIT);
136
    P2OUT |= CSN_BIT;
137
    uint8_t n;
138
    for(n=10; n; n--);
139
140
    // Pull CSn low and wait for SO to go low ( CHIP_RDYn).
141
    P2OUT &= ~(CSN_BIT);
142
    while(P1IN & MISO_BIT);
143
144
    // Issue the SRES strobe on the SI line.
145
    CS(0, 0x30);  // Reset
146
147
    CS(0, 0x30);  // Reset
148
149
    CS(0, 0x30);  // Reset
150
151
    // When SO goes low again, reset is complete and the chip is in the IDLE state.
152
153
    CS(0, 0x3D);  // NOP, TX FIFO free
154
    CS(1, 0x3D);  // NOP, RX FIFO bytes
155
156
    CC(true, true, 0x30, 0);  // chip
157
    CC(true, true, 0x31, 0);  // version
158
159
    CS(1, 0x3A);  // flush RX FIFO
160
    CS(1, 0x3B);  // flush TX FIFO
161
162
    //PATABLE
163
  P2OUT &= ~(CSN_BIT);
164
  while(P1IN & MISO_BIT);
165
  softSPI( (0<<7)|(1<<6)|0x3E );
166
  softSPI(0x00);
167
  softSPI(0x50);
168
  P2OUT |= CSN_BIT;
169
170
171
  P2OUT &= ~(CSN_BIT);
172
  while(P1IN & MISO_BIT);
173
  softSPI( (1<<7)|(1<<6)|0x3E );
174
  softSPI( (1<<7)|0x00);
175
  softSPI( (1<<7)|0x00);
176
  P2OUT |= CSN_BIT;
177
178
179
180
    // Rf settings for CC110L
181
  CC(false, false, 0x0000, 0x29);   // IOCFG2             GDO2 Output Pin Configuration
182
  CC(false, false, 0x0001, 0x2E);   // IOCFG1             GDO1 Output Pin Configuration
183
  CC(false, false, 0x0002, 0x06);   // IOCFG0             GDO0 Output Pin Configuration
184
  CC(false, false, 0x0003, 0x47);   // FIFOTHR            RX FIFO and TX FIFO Thresholds
185
  CC(false, false, 0x0004, 0xD3);   // SYNC1              Sync Word, High Byte
186
  CC(false, false, 0x0005, 0x91);   // SYNC0              Sync Word, Low Byte
187
  CC(false, false, 0x0006, 0x01);   // PKTLEN             Packet Length
188
  CC(false, false, 0x0007, 0x00);   // PKTCTRL1           Packet Automation Control
189
  CC(false, false, 0x0008, 0x00);   // PKTCTRL0           Packet Automation Control
190
  CC(false, false, 0x0009, 0x00);   // ADDR               Device Address
191
  CC(false, false, 0x000A, 0x00);   // CHANNR             Channel number
192
  CC(false, false, 0x000B, 0x06);   // FSCTRL1            Frequency Synthesizer Control
193
  CC(false, false, 0x000C, 0x00);   // FSCTRL0            Frequency Synthesizer Control
194
  CC(false, false, 0x000D, 0x20);   // FREQ2              Frequency Control Word, High Byte
195
  CC(false, false, 0x000E, 0x28);   // FREQ1              Frequency Control Word, Middle Byte
196
  CC(false, false, 0x000F, 0xC5);   // FREQ0              Frequency Control Word, Low Byte
197
  CC(false, false, 0x0010, 0xF6);   // MDMCFG4            Modem Configuration
198
  CC(false, false, 0x0011, 0x84);   // MDMCFG3            Modem Configuration
199
  CC(false, false, 0x0012, 0x30);   // MDMCFG2            Modem Configuration
200
  CC(false, false, 0x0013, 0x22);   // MDMCFG1            Modem Configuration
201
  CC(false, false, 0x0014, 0xE5);   // MDMCFG0            Modem Configuration
202
  CC(false, false, 0x0015, 0x14);   // DEVIATN            Modem Deviation Setting
203
  CC(false, false, 0x0016, 0x07);   // MCSM2              Main Radio Control State Machine Configuration
204
  CC(false, false, 0x0017, 0x30);   // MCSM1              Main Radio Control State Machine Configuration
205
  CC(false, false, 0x0018, 0x18);   // MCSM0              Main Radio Control State Machine Configuration
206
  CC(false, false, 0x0019, 0x16);   // FOCCFG             Frequency Offset Compensation Configuration
207
  CC(false, false, 0x001A, 0x6C);   // BSCFG              Bit Synchronization Configuration
208
  CC(false, false, 0x001B, 0x03);   // AGCCTRL2           AGC Control
209
  CC(false, false, 0x001C, 0x40);   // AGCCTRL1           AGC Control
210
  CC(false, false, 0x001D, 0x91);   // AGCCTRL0           AGC Control
211
  CC(false, false, 0x0020, 0xFB);   // RESERVED_0X20      Use setting from SmartRF Studio
212
  CC(false, false, 0x0021, 0x56);   // FREND1             Front End RX Configuration
213
  CC(false, false, 0x0022, 0x11);   // FREND0             Front End TX Configuration
214
  CC(false, false, 0x0023, 0xE9);   // FSCAL3             Frequency Synthesizer Calibration
215
  CC(false, false, 0x0024, 0x2A);   // FSCAL2             Frequency Synthesizer Calibration
216
  CC(false, false, 0x0025, 0x00);   // FSCAL1             Frequency Synthesizer Calibration
217
  CC(false, false, 0x0026, 0x1F);   // FSCAL0             Frequency Synthesizer Calibration
218
  CC(false, false, 0x0029, 0x89);   // RESERVED_0X29      Use setting from SmartRF Studio
219
  CC(false, false, 0x002A, 0x127);  // RESERVED_0X2A      Use setting from SmartRF Studio
220
  CC(false, false, 0x002B, 0x63);   // RESERVED_0X2B      Use setting from SmartRF Studio
221
  CC(false, false, 0x002C, 0x81);   // TEST2              Various Test Settings
222
  CC(false, false, 0x002D, 0x35);   // TEST1              Various Test Settings
223
  CC(false, false, 0x002E, 0x09);   // TEST0              Various Test Settings
224
225
    test = CC(false, false, 0x3F, 0xB1);
226
227
    CS(0, 0x35);  // TX strobe
228
229
    for(;;)
230
    CS(0, 0x3D);  // NOP, TX FIFO free
231
232
    LPM0;
233
    for(;;);
234
}


(CC110L last bit twice double duplicate)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.