static void cc1101_driver_init(void) { // Take the SPI mutex before any radio access xSemaphoreTake(spi_mutex, portMAX_DELAY); // Initialize the radio driver cc1101_init(); cc1101_cmd_idle(); // configure the radio behavior cc1101_cfg_append_status(CC1101_APPEND_STATUS_ENABLE); cc1101_cfg_crc_autoflush(CC1101_CRC_AUTOFLUSH_DISABLE); cc1101_cfg_white_data(CC1101_DATA_WHITENING_ENABLE); cc1101_cfg_crc_en(CC1101_CRC_CALCULATION_ENABLE); cc1101_cfg_freq_if(0x06); cc1101_cfg_fs_autocal(CC1101_AUTOCAL_NEVER); cc1101_cfg_mod_format(CC1101_MODULATION_MSK); cc1101_cfg_sync_mode(CC1101_SYNCMODE_30_32); cc1101_cfg_manchester_en(CC1101_MANCHESTER_DISABLE); // set channel bandwidth (500 kHz) cc1101_cfg_chanbw_e(0); cc1101_cfg_chanbw_m(2); // set channel spacing 200kHz cc1101_cfg_chanspc_e(0x2); cc1101_cfg_chanspc_m(0xE5); // set data rate (0xD/0x2F is 250kbps) cc1101_cfg_drate_e(0x0D); cc1101_cfg_drate_m(0x2F); // go to idle after RX and TX cc1101_cfg_rxoff_mode(CC1101_RXOFF_MODE_IDLE); cc1101_cfg_txoff_mode(CC1101_TXOFF_MODE_IDLE); // Set channel cc1101_cfg_chan(radio_channel); // Set FIFO threshold to middle cc1101_cfg_fifo_thr(7); // Set gdo0 SYNC word detection (both RX and TX) cc1101_gdo0_int_disable(); cc1101_cfg_gdo0(CC1101_GDOx_SYNC_WORD); cc1101_gdo0_int_set_rising_edge(); cc1101_gdo0_register_callback(sync_irq); cc1101_gdo0_int_enable(); // Calibrate a first time cc1101_cmd_calibrate(); // Configure TX power cc1101_cfg_patable(&radio_power, 1); cc1101_cfg_pa_power(0); // Release mutex xSemaphoreGive(spi_mutex); }
static void vInitMac(void) { /* Leds */ LEDS_INIT(); LEDS_OFF(); /* Initialize the radio driver */ cc1101_init(); cc1101_cmd_idle(); cc1101_cfg_append_status(CC1101_APPEND_STATUS_ENABLE); cc1101_cfg_crc_autoflush(CC1101_CRC_AUTOFLUSH_DISABLE); cc1101_cfg_white_data(CC1101_DATA_WHITENING_ENABLE); cc1101_cfg_crc_en(CC1101_CRC_CALCULATION_ENABLE); cc1101_cfg_freq_if(0x0C); cc1101_cfg_fs_autocal(CC1101_AUTOCAL_NEVER); cc1101_cfg_mod_format(CC1101_MODULATION_MSK); cc1101_cfg_sync_mode(CC1101_SYNCMODE_30_32); cc1101_cfg_manchester_en(CC1101_MANCHESTER_DISABLE); // set channel bandwidth (560 kHz) cc1101_cfg_chanbw_e(0); cc1101_cfg_chanbw_m(2); // set data rate (0xD/0x2F is 250kbps) cc1101_cfg_drate_e(0x0D); cc1101_cfg_drate_m(0x2F); uint8_t table[] = {CC1101_868MHz_TX_12dBm}; cc1101_cfg_patable(table, 1); cc1101_cfg_pa_power(0); }
int sif_main(int argc, char *argv[]) { if (argc >= 2) { if (!strcmp(argv[1], "init")) { return sif_init(); } else if (!strcmp(argv[1], "gpio") && argc == 4) { vsn_sif.gpio[0] = atoi(argv[2]); vsn_sif.gpio[1] = atoi(argv[3]); sif_gpio1_update(); sif_gpio2_update(); printf("GPIO States: %2x %2x\n", vsn_sif.gpio[0], vsn_sif.gpio[1]); return 0; } else if (!strcmp(argv[1], "pwr") && argc == 3) { int val = atoi(argv[2]); //STM32_TIM_SETCOMPARE(vsn_sif.tim8, GPIO_OUT_PWRPWM_TIM8_CH, val); STM32_TIM_SETCOMPARE(vsn_sif.tim3, GPIO_OUT_PWM_TIM3_CH, val); return 0; } else if (!strcmp(argv[1], "time") && argc == 3) { struct timespec t_set; t_set.tv_sec = atoi(argv[2]); clock_settime(CLOCK_REALTIME, &t_set); } else if (!strcmp(argv[1], "free")) { size_t page = 0, stpage = 0xFFFF; ssize_t status; do { status = up_progmem_ispageerased(page++); /* Is this beginning of new free space section */ if (status == 0) { if (stpage == 0xFFFF) stpage = page-1; } else if (status != 0) { if (stpage != 0xFFFF) { printf("Free Range:\t%lu\t-\t%lu\n", (unsigned long)stpage, (unsigned long)(page-2)); stpage = 0xFFFF; } } } while (status >= 0); return 0; } else if (!strcmp(argv[1], "erase") && argc == 3) { size_t page = atoi(argv[2]); printf("Erase result: %d\n", up_progmem_erasepage(page)); return 0; } else if (!strcmp(argv[1], "flash") && argc == 3) { size_t page = atoi(argv[2]); size_t addr = page * up_progmem_pagesize(page); printf("Write result: %d (writing to address %lxh)\n", up_progmem_write(addr, "Test", 4), (unsigned long)addr); return 0; } else if (!strcmp(argv[1], "i2c") && argc == 3) { int val = atoi(argv[2]); I2C_SETFREQUENCY(vsn_sif.i2c1, 100000); struct lis331dl_dev_s * lis = lis331dl_init(vsn_sif.i2c1, val); if (lis) { const struct lis331dl_vector_s * a; int i; uint32_t time_stamp = clock_systimer(); /* Set to 400 Hz : 3 = 133 Hz/axis */ lis331dl_setconversion(lis, false, true); /* Sample some values */ for (i=0; i<1000;) { if ((a = lis331dl_getreadings(lis))) { i++; printf("%d %d %d\n", a->x, a->y, a->z); } else if (errno != 11) { printf("Readings errno %d\n", errno); break; } } printf("Time diff = %d\n", clock_systimer() - time_stamp); lis331dl_deinit(lis); } else printf("Exit point: errno=%d\n", errno); return 0; } else if (!strcmp(argv[1], "pga")) { int gain = atoi(argv[2]); gain = vsn_muxbus_setpgagain(gain); printf("Gain changed: %d\n", gain); return 0; } else if (!strcmp(argv[1], "cc")) { struct cc1101_dev_s * cc; uint8_t buf[64]; int sta; cc = cc1101_init(vsn_sif.spi2, CC1101_PIN_GDO0, GPIO_CC1101_GDO0, &cc1101_rfsettings_ISM1_868MHzGFSK100kbps); if (cc) { /* Work-around: enable falling edge, event and interrupt */ stm32_gpiosetevent(GPIO_CC1101_GDO0, false, true, true, cc1101_eventcb); /* Enable clock to ARM PLL, allowing to speed-up to 72 MHz */ cc1101_setgdo(cc, CC1101_PIN_GDO2, CC1101_GDO_CLK_XOSC3); cc1101_setchannel(cc, 0); /* AV Test Hex, receive on that channel */ cc1101_receive(cc); /* Enter RX mode */ while (1) { fflush(stdout); sta = cc1101_read(cc, buf, 64); if (sta > 0) { printf("Received %d bytes: rssi=%d [dBm], LQI=%d (CRC %s)\n", sta, cc1101_calcRSSIdBm(buf[sta-2]), buf[sta-1]&0x7F, (buf[sta-1]&0x80)?"OK":"BAD"); cc1101_write(cc, buf, 61); cc1101_send(cc); printf("Packet send back\n"); cc1101_receive(cc); } } } } } fprintf(stderr, "%s:\tinit\n\tgpio\tA B\n\tpwr\tval\n", argv[0]); fprintf(stderr, "rtc time = %u, time / systick = %u / %u\n", up_rtc_time(), time(NULL), clock_systimer()); return -1; }
void mac_init(uint8_t channel) { // initialize the unique serial number chip and set node address accordingly ds2411_init(); node_addr = (((uint16_t)ds2411_id.serial1)<<8) + (ds2411_id.serial0); // seed the random number generator srand(node_addr); // reset callbacks received_cb = 0x0; sent_cb = 0x0; error_cb = 0x0; // initialize the timerB timerB_init(); timerB_start_ACLK_div(1); timerB_register_cb(ALARM_RETRY, tx_try); // configure the radio cc1101_init(); cc1101_cmd_idle(); /* configure the radio behaviour */ cc1101_cfg_append_status(CC1101_APPEND_STATUS_ENABLE); cc1101_cfg_crc_autoflush(CC1101_CRC_AUTOFLUSH_DISABLE); cc1101_cfg_white_data(CC1101_DATA_WHITENING_ENABLE); cc1101_cfg_crc_en(CC1101_CRC_CALCULATION_ENABLE); cc1101_cfg_freq_if(0x0E); cc1101_cfg_fs_autocal(CC1101_AUTOCAL_IDLE_TO_TX_RX); cc1101_cfg_mod_format(CC1101_MODULATION_MSK); cc1101_cfg_sync_mode(CC1101_SYNCMODE_30_32); cc1101_cfg_manchester_en(CC1101_MANCHESTER_DISABLE); cc1101_cfg_cca_mode(CC1101_CCA_MODE_RSSI_PKT_RX); // freq = 860MHz cc1101_write_reg(CC1101_REG_FREQ2, 0x1F); cc1101_write_reg(CC1101_REG_FREQ1, 0xDA); cc1101_write_reg(CC1101_REG_FREQ0, 0x12); // configure the radio channel (300kHz spacing) cc1101_cfg_chanspc_e(0x3); cc1101_cfg_chanspc_m(0x6C); cc1101_cfg_chan(channel<<1); // channel x2 to get 600kHz spacing // rise CCA threshold cc1101_cfg_carrier_sense_abs_thr(5); // set channel bandwidth (560 kHz) cc1101_cfg_chanbw_e(0); cc1101_cfg_chanbw_m(2); // set data rate (0xD/0x2F is 250kbps) cc1101_cfg_drate_e(0x0D); cc1101_cfg_drate_m(0x2F); // go to RX after RX and TX cc1101_cfg_rxoff_mode(CC1101_RXOFF_MODE_IDLE); cc1101_cfg_txoff_mode(CC1101_TXOFF_MODE_RX); uint8_t table[1] = {CC1101_868MHz_TX_0dBm}; // table[0] = CC1101_868MHz_TX_m30dBm; // table[0] = CC1101_868MHz_TX_m20dBm; // table[0] = CC1101_868MHz_TX_m15dBm; // table[0] = CC1101_868MHz_TX_m10dBm; // table[0] = CC1101_868MHz_TX_m6dBm; table[0] = CC1101_868MHz_TX_0dBm; // table[0] = CC1101_868MHz_TX_5dBm; // table[0] = CC1101_868MHz_TX_7dBm; // table[0] = CC1101_868MHz_TX_10dBm; // table[0] = CC1101_868MHz_TX_12dBm; cc1101_cfg_patable(table, 1); cc1101_cfg_pa_power(0); // set IDLE state, flush everything, and start rx cc1101_cmd_idle(); cc1101_cmd_flush_rx(); cc1101_cmd_flush_tx(); cc1101_cmd_calibrate(); // configure irq cc1101_cfg_gdo0(CC1101_GDOx_SYNC_WORD); cc1101_gdo0_int_set_falling_edge(); cc1101_gdo0_int_clear(); cc1101_gdo0_int_enable(); cc1101_gdo0_register_callback(rx_parse); // start the machine rx_set(); txframe.length = 0; }
int main(int argc, char * argv[]) { uint8_t rx[64]; char buff[256]; uint8_t length; uint8_t address; uint8_t status; int i; rpi_gpio_init(); cc1101_init(); status = cc1101_read_status(); if (status != 0x0F) { cc1101_strobe(CC1101_STROBE_SIDLE, CC1101_WRITE_SINGLE); } printf("status ok\n\r"); if(argc > 1) { printf("argv: %s\n\r", argv[1]); if(!strcmp(argv[1], "-w")) { if(strlen(argv[2]) == 2) { strcpy(buff, argv[2]); } else { printf("Adress too short\n\r"); return 0; } // translate from ascii hex value to raw value for(i=0;i<2;i++) { if(buff[i] > 0x40 && buff[i] < 0x47) { address += (buff[i] - 55)<<((1-i)*4); } else if (buff[i] > 0x2F && buff[i] < 0x3A) { address += (buff[i]-0x30)<<((1-i)*4); //shift } else { printf("Not a hex number. %.02X\n\r", buff[i]); return 0; } } printf("Address: 0x%.02X\n\r", address); strcpy(buff, argv[3]); length = strlen(buff) + 1; printf("Length: %d\n\r", length); cc1101_send_msg(length, address, buff); cc1101_tx_end_wait(); } else if (!strcmp(argv[1], "-r")) { cc1101_start_rx(); printf("Rx mode started. Waiting...\n\r"); while(length == 0) { do { }while(!READ_GD02); cc1101_rd_burst(CC1101_STROBE_SFTX, &length, 1); //read byte count RX_FIFO } cc1101_rd_burst(CC1101_RX_FIFO, rx,length); rx[length] = '\0'; printf("Received Message:\n\r%s\n\r", rx); } } else { printf("Not enough arguments. Try again.\n\r"); } }
void mac_init(uint8_t channel) { int16_t i; // initialize the unique serial number chip and set node address accordingly ds2411_init(); node_addr = ds2411_id.serial0 & HEADER_ADDR_MASK; // seed the random number generator srand((ds2411_id.serial0<<8)+ds2411_id.serial1); // initialize the timerB, with the beacon perdiod timerB_init(); timerB_start_ACLK_div(TIMERB_DIV_1); timerB_set_alarm_from_now(ALARM_SLOTS, SLOT_LENGTH, SLOT_LENGTH); timerB_register_cb(ALARM_SLOTS, slot_alarm); // configure the radio cc1101_init(); cc1101_cmd_idle(); /* configure the radio behaviour */ cc1101_cfg_append_status(CC1101_APPEND_STATUS_ENABLE); cc1101_cfg_crc_autoflush(CC1101_CRC_AUTOFLUSH_DISABLE); cc1101_cfg_white_data(CC1101_DATA_WHITENING_ENABLE); cc1101_cfg_crc_en(CC1101_CRC_CALCULATION_ENABLE); cc1101_cfg_freq_if(0x0E); cc1101_cfg_fs_autocal(CC1101_AUTOCAL_NEVER); cc1101_cfg_mod_format(CC1101_MODULATION_MSK); cc1101_cfg_sync_mode(CC1101_SYNCMODE_30_32); cc1101_cfg_manchester_en(CC1101_MANCHESTER_DISABLE); cc1101_cfg_cca_mode(CC1101_CCA_MODE_RSSI_PKT_RX); // freq = 860MHz cc1101_write_reg(CC1101_REG_FREQ2, 0x1F); cc1101_write_reg(CC1101_REG_FREQ1, 0xDA); cc1101_write_reg(CC1101_REG_FREQ0, 0x12); // configure the radio channel (300kHz spacing) cc1101_cfg_chanspc_e(0x3); cc1101_cfg_chanspc_m(0x6C); cc1101_cfg_chan(channel<<1); // channel x2 to get 600kHz spacing // set channel bandwidth (560 kHz) cc1101_cfg_chanbw_e(0); cc1101_cfg_chanbw_m(2); // set data rate (0xD/0x2F is 250kbps) cc1101_cfg_drate_e(0x0D); cc1101_cfg_drate_m(0x2F); // go to RX after TX cc1101_cfg_rxoff_mode(CC1101_RXOFF_MODE_STAY_RX); cc1101_cfg_txoff_mode(CC1101_TXOFF_MODE_RX); uint8_t table[] = {CC1101_868MHz_TX_0dBm}; cc1101_cfg_patable(table, 1); cc1101_cfg_pa_power(0); // set IDLE state, flush everything cc1101_cmd_idle(); cc1101_cmd_flush_rx(); cc1101_cmd_flush_tx(); // configure irq cc1101_cfg_gdo0(CC1101_GDOx_SYNC_WORD); cc1101_gdo0_int_set_falling_edge(); // configure the beacon frame beacon_msg.hdr.length = BEACON_LENGTH-1; HEADER_SET_ADDR(beacon_msg.hdr, node_addr); HEADER_SET_TYPE(beacon_msg.hdr,BEACON_TYPE); beacon_msg.seq=0; // initialize the slot management service tdma_mgt_init(); // reset slot count slot_count = -1; // init the data slots for (i=0;i<DATA_SLOT_MAX;i++) { mac_slots[i].ready=0; mac_slots[i].addr=0; } // reset the callback new_data_cb = 0x0; }