69 #include <util/delay.h>
73 #include "sicslowmac.h"
77 #define RADIO_CCA_DONE_MASK (1 << 7)
78 #define RADIO_CCA_IDLE_MASK (1 << 6)
80 #define RADIO_START_CCA (1)
82 #define RADIO_TRANSMISSION_SUCCESS (0)
83 #define RADIO_BUSY_CHANNEL (3)
84 #define RADIO_MIN_IEEE_FRAME_LENGTH (5)
110 static radio_rx_callback rx_frame_callback;
111 static uint8_t rssi_val;
112 static uint8_t rx_mode;
118 uint8_t RF230_radio_on, RF230_rsigsi;
119 uint16_t RF230_sendpackets,RF230_receivepackets,RF230_sendfail,RF230_receivefail;
123 static parsed_frame_t parsed_frame;
127 static void radio_rx_start_event(uint32_t
const isr_timestamp, uint8_t
const frame_length);
128 static void radio_trx_end_event(uint32_t
const isr_timestamp);
163 radio_rx_callback rx_callback)
189 if ((version_number != RF230_REVA) && (version_number != RF230_REVB))
204 user_rx_event = rx_event;
205 user_trx_end_event = trx_end_event;
209 rx_frame_callback = rx_callback;
216 radio_frame_data(
void)
218 return rx_frame.
data;
222 radio_frame_length(
void)
229 radio_rx_start_event(uint32_t
const isr_timestamp, uint8_t
const frame_length)
236 user_rx_event(isr_timestamp, frame_length);
241 radio_get_saved_rssi_value(
void)
248 radio_trx_end_event(uint32_t
const isr_timestamp)
250 volatile uint8_t status;
253 if (user_trx_end_event){
254 user_trx_end_event(isr_timestamp);
260 RF230_rsigsi=rssi_val;
261 RF230_receivepackets++;
263 parsed_frame.time = isr_timestamp;
264 parsed_frame.rssi = rssi_val;
276 event_object_t event;
282 case TRAC_SUCCESS_DATA_PENDING:
283 event.event = MAC_EVENT_ACK;
286 case TRAC_CHANNEL_ACCESS_FAILURE:
287 event.event = MAC_EVENT_NACK;
292 case TRAC_SUCCESS_WAIT_FOR_ACK:
332 if ((channel < RF230_MIN_CHANNEL) ||
333 (channel > RF230_MAX_CHANNEL)){
352 if ((trx_state ==
RX_ON) ||
364 return channel_set_status;
395 if (power_level > TX_PWR_17_2DBM){
458 if (ed_threshold > RF230_MAX_ED_THRESHOLD){
492 if ((current_state ==
RX_ON) ||
547 if (voltage_threshold > BATTERY_MONITOR_HIGHEST_VOLTAGE){
583 BATTERY_MONITOR_VOLTAGE_UNDER_THRESHOLD){
587 return batmon_status;
630 if (clock_speed > CLKM_16MHZ){
639 if (direct ==
false){
680 return filter_calibration_status;
717 return pll_calibration_status;
778 bool sleeping =
false;
811 uint8_t original_state;
814 if (!((new_state ==
TRX_OFF) ||
815 (new_state ==
RX_ON) ||
837 if (new_state == original_state){
871 if (original_state ==
TRX_OFF){
884 if (new_state ==
RX_ON ||
892 return set_state_status;
921 return enter_sleep_status;
952 return leave_sleep_status;
993 if (auto_crc_on ==
true){
1044 RF230_sendpackets++;
1087 uint16_t pan_id = ((uint16_t)(pan_id_15_8 << 8)) | pan_id_7_0;
1101 uint8_t pan_byte = new_pan_id & 0xFF;
1104 pan_byte = (new_pan_id >> 8*1) & 0xFF;
1121 uint16_t short_address = ((uint16_t)(short_address_15_8 << 8)) | short_address_7_0;
1123 return short_address;
1135 uint8_t short_address_byte = new_short_address & 0xFF;
1138 short_address_byte = (new_short_address >> 8*1) & 0xFF;
1213 uint8_t back_off_exponent = (be_csma_seed1 & 0xC0) >> 6;
1214 uint8_t csma_retries = (be_csma_seed1 & 0x38) >> 3;
1215 uint8_t seed1 = (be_csma_seed1 & 0x07);
1240 bool success =
false;
1243 uint16_t temp, counter;
1244 uint8_t osccal_saved;
1245 uint8_t tccr2b, tccr1b, tccr1a;
1251 #define TARGETVAL ((1000000ULL * 256 * 32) / F_CPU)
1254 osccal_saved = OSCCAL;
1270 for (counter = 0; counter < 1000; counter++){
1278 TCCR2B = (1 << CS21) | (1 << CS20);
1280 TCCR1B = (1 << CS12) | (1 << CS11);
1283 while (!(TIFR2 & (1 << TOV2))){
1294 if (temp < (uint16_t)(0.995 * TARGETVAL)){
1297 }
else if (temp > (uint16_t)(1.005 * TARGETVAL)){
1316 OSCCAL = osccal_saved;
1341 uint8_t osccal_original = OSCCAL;
1342 volatile uint16_t temp;
1357 while (ASSR & ((1 << TCN2UB)|(1 << OCR2AUB)|(1 << TCR2AUB)|(1 << TCR2BUB))) { ; }
1362 uint8_t counter = 128;
1363 bool cal_ok =
false;
1368 while (ASSR & ((1 << TCN2UB)|(1 << OCR2AUB)|(1 << TCR2AUB)|(1 << TCR2BUB))) { ; }
1379 while (!(TIFR2 & (1 << TOV2))){
1386 #define cal_upper (31250*1.05) // 32812 = 0x802c
1387 #define cal_lower (31250*0.95) // 29687 = 0x73f7
1389 if (temp < cal_lower) {
1392 }
else if (temp > cal_upper) {
1401 }
while ((counter != 0) && (
false == cal_ok));
1403 if (
true != cal_ok) {
1405 OSCCAL = osccal_original;
1410 ASSR &= ~(1 << AS2);