//-------------------------------------------------------------------- void ccTX (void) { uint8_t cnt = 0xff; GIMSK &= ~_BV (CC1100_INT); // Going from RX to TX does not work if there was a reception less than 0.5 // sec ago. Due to CCA? Using IDLE helps to shorten this period(?) ccStrobe (CC1100_SIDLE); while (cnt-- && (ccStrobe (CC1100_STX) & 0x70) != 2) _delay_us (10); }
static void it_tunein(void) { int8_t i; #ifdef ARM AT91C_BASE_AIC->AIC_IDCR = 1 << AT91C_ID_PIOA; // disable INT - we'll poll... AT91C_BASE_PIOA->PIO_PPUER = _BV(CC1100_CS_PIN); //Enable pullup AT91C_BASE_PIOA->PIO_OER = _BV(CC1100_CS_PIN); //Enable output AT91C_BASE_PIOA->PIO_PER = _BV(CC1100_CS_PIN); //Enable PIO control #else EIMSK &= ~_BV(CC1100_INT); SET_BIT( CC1100_CS_DDR, CC1100_CS_PIN ); // CS as output #endif CC1100_DEASSERT; // Toggle chip select signal my_delay_us(30); CC1100_ASSERT; my_delay_us(30); CC1100_DEASSERT; my_delay_us(45); ccStrobe( CC1100_SRES ); // Send SRES command my_delay_us(100); CC1100_ASSERT; // load configuration cc1100_sendbyte( 0 | CC1100_WRITE_BURST ); for(uint8_t i = 0; i < 13; i++) { cc1100_sendbyte(__LPM(CC1100_ITCFG+i)); } // Tune to standard IT-Frequency cc1100_sendbyte(it_frequency[0]); // Modify Freq. for 433.92MHZ, or whatever cc1100_sendbyte(it_frequency[1]); cc1100_sendbyte(it_frequency[2]); for (i = 16; i<EE_CC1100_CFG_SIZE; i++) { cc1100_sendbyte(__LPM(CC1100_ITCFG+i)); } CC1100_DEASSERT; uint8_t *pa = EE_CC1100_PA; CC1100_ASSERT; // setup PA table cc1100_sendbyte( CC1100_PATABLE | CC1100_WRITE_BURST ); for (uint8_t i = 0;i<8;i++) { cc1100_sendbyte(erb(pa++)); } CC1100_DEASSERT; ccStrobe( CC1100_SCAL ); my_delay_ms(1); cc_on = 1; // Set CC_ON }
void it_tunein(void) { int8_t i; #ifdef USE_HAL hal_CC_GDO_init(CC_INSTANCE,INIT_MODE_OUT_CS_IN); hal_enable_CC_GDOin_int(CC_INSTANCE,FALSE); // disable INT - we'll poll... #else EIMSK &= ~_BV(CC1100_INT); SET_BIT( CC1100_CS_DDR, CC1100_CS_PIN ); // CS as output #endif CC1100_DEASSERT; // Toggle chip select signal my_delay_us(30); CC1100_ASSERT; my_delay_us(30); CC1100_DEASSERT; my_delay_us(45); ccStrobe( CC1100_SRES ); // Send SRES command my_delay_us(100); CC1100_ASSERT; // load configuration cc1100_sendbyte( 0 | CC1100_WRITE_BURST ); for(uint8_t i = 0; i < 13; i++) { cc1100_sendbyte(__LPM(CC1100_ITCFG+i)); } // Tune to standard IT-Frequency cc1100_sendbyte(it_frequency[0]); // Modify Freq. for 433.92MHZ, or whatever cc1100_sendbyte(it_frequency[1]); cc1100_sendbyte(it_frequency[2]); for (i = 16; i<EE_CC1100_CFG_SIZE; i++) { cc1100_sendbyte(__LPM(CC1100_ITCFG+i)); } CC1100_DEASSERT; uint8_t *pa = EE_CC1100_PA; CC1100_ASSERT; // setup PA table cc1100_sendbyte( CC1100_PATABLE | CC1100_WRITE_BURST ); for (uint8_t i = 0;i<8;i++) { cc1100_sendbyte(erb(pa++)); } CC1100_DEASSERT; ccStrobe( CC1100_SCAL ); my_delay_ms(1); #ifndef USE_RF_MODE cc_on = 1; // Set CC_ON #endif }
//-------------------------------------------------------------------- void ccreg(char *in) { uint8_t hb, out, addr; if(in[1] == 'w' && fromhex(in+2, &addr, 1) && fromhex(in+4, &hb, 1)) { cc1100_writeReg(addr, hb); ccStrobe( CC1100_SCAL ); ccRX(); DH2(addr); DH2(hb); DNL(); } else if(fromhex(in+1, &hb, 1)) { if(hb == 0x99) { for(uint8_t i = 0; i < 0x30; i++) { DH2(cc1100_readReg(i)); if((i&7) == 7) DNL(); } } else { out = cc1100_readReg(hb); DC('C'); // prefix DH2(hb); // register number DS_P( PSTR(" = ") ); DH2(out); // result, hex DS_P( PSTR(" / ") ); DU(out,2); // result, decimal DNL(); } } }
void native_func(char *in) { uint8_t mode = 0; if(in[1] == 'r') { // Reception on // "Er<x>" - where <x> is mode if (in[2]) fromdec(in+2, &mode); if (!mode || mode>MAX_MODES) { DS_P(PSTR("specify valid mode number\r\n")); return; } native_init(mode); } else if(in[1] == 'x') { // Reception off if (native_on) ccStrobe( CC1100_SIDLE ); native_on = 0; } DH2(native_on); DNL(); }
//-------------------------------------------------------------------- void ccTX(void) { uint8_t cnt = 0xff; #ifdef ARM AT91C_BASE_AIC->AIC_IDCR = 1 << CC1100_IN_PIO_ID; #else EIMSK &= ~_BV(CC1100_INT); #endif // Going from RX to TX does not work if there was a reception less than 0.5 // sec ago. Due to CCA? Using IDLE helps to shorten this period(?) ccStrobe(CC1100_SIDLE); while(cnt-- && (ccStrobe(CC1100_STX) & CC1100_STATUS_STATE_BM) != CC1100_STATE_TX) my_delay_us(10); }
void native_init(uint8_t mode) { EIMSK &= ~_BV(CC1100_INT); // disable INT - we'll poll... SET_BIT( CC1100_CS_DDR, CC1100_CS_PIN ); // CS as output native_on = 0; CC1100_DEASSERT; // Toggle chip select signal my_delay_us(30); CC1100_ASSERT; my_delay_us(30); CC1100_DEASSERT; my_delay_us(45); ccStrobe( CC1100_SRES ); // Send SRES command my_delay_us(100); if (!mode || mode>MAX_MODES) return; // load configuration for (uint8_t i = 0; i<60; i += 2) { if (pgm_read_byte( &NATIVE_CFG[i] )>0x40) break; cc1100_writeReg( pgm_read_byte(&NATIVE_CFG[i]), pgm_read_byte(&NATIVE_CFG[i+1]) ); } // load special configuration for (uint8_t i = 0; i<20; i += 2) { if (pgm_read_byte( &MODE_CFG[mode-1][i] )>0x40) break; cc1100_writeReg( pgm_read_byte(&MODE_CFG[mode-1][i]), pgm_read_byte(&MODE_CFG[mode-1][i+1]) ); } ccStrobe( CC1100_SCAL ); native_on = mode; checkFrequency(); my_delay_ms(1); }
void ccInitChip(uint8_t *cfg) { #ifdef HAS_MORITZ moritz_on = 0; //loading this configuration overwrites moritz cfg #endif #ifdef ARM AT91C_BASE_AIC->AIC_IDCR = 1 << CC1100_IN_PIO_ID; CC1100_CS_BASE->PIO_PPUER = _BV(CC1100_CS_PIN); //Enable pullup CC1100_CS_BASE->PIO_OER = _BV(CC1100_CS_PIN); //Enable output CC1100_CS_BASE->PIO_PER = _BV(CC1100_CS_PIN); //Enable PIO control #else EIMSK &= ~_BV(CC1100_INT); SET_BIT( CC1100_CS_DDR, CC1100_CS_PIN ); // CS as output #endif CC1100_DEASSERT; // Toggle chip select signal my_delay_us(30); CC1100_ASSERT; my_delay_us(30); CC1100_DEASSERT; my_delay_us(45); ccStrobe( CC1100_SRES ); // Send SRES command my_delay_us(100); CC1100_ASSERT; // load configuration cc1100_sendbyte( 0 | CC1100_WRITE_BURST ); for(uint8_t i = 0; i < EE_CC1100_CFG_SIZE; i++) { cc1100_sendbyte(erb(cfg++)); } CC1100_DEASSERT; uint8_t *pa = EE_CC1100_PA; CC1100_ASSERT; // setup PA table cc1100_sendbyte( CC1100_PATABLE | CC1100_WRITE_BURST ); for (uint8_t i = 0;i<8;i++) { cc1100_sendbyte(erb(pa++)); } CC1100_DEASSERT; ccStrobe( CC1100_SCAL ); my_delay_ms(1); }
//-------------------------------------------------------------------- void ccRX (void) { uint8_t cnt = 0xff; while (cnt-- && (ccStrobe (CC1100_SRX) & 0x70) != 1) _delay_us (10); // reset and enable interrupt GIFR |= _BV (CC1100_INT); GIMSK |= _BV (CC1100_INT); }
void set_ccoff(void) { #ifdef BUSWARE_CUR uint8_t cnt = 0xff; while(cnt-- && (ccStrobe( CC1100_SIDLE ) & 0x70) != 0) my_delay_us(10); ccStrobe(CC1100_SPWD); #else ccStrobe(CC1100_SIDLE); #endif cc_on = 0; #ifdef HAS_ASKSIN asksin_on = 0; #endif #ifdef HAS_MORITZ moritz_on = 0; #endif }
void ccInitChip (void) { GIMSK &= ~_BV (CC1100_INT); SET_BIT (CC1100_CS_DDR, CC1100_CS_PIN); // CS as output SET_BIT (CC1100_OUT_DDR, CC1100_OUT_PIN); // GDO0 as output CLEAR_BIT (CC1100_IN_DDR, CC1100_IN_PIN); // GDO2 as input CC1100_DEASSERT; // Toggle chip select signal _delay_us (30); CC1100_ASSERT; _delay_us (30); CC1100_DEASSERT; _delay_us (45); ccStrobe (CC1100_SRES); // Send SRES command _delay_us (100); CC1100_ASSERT; // load configuration cc1100_sendbyte (0 | CC1100_WRITE_BURST); for (uint8_t i = 0; i < EE_CC1100_CFG_SIZE; i++) { cc1100_sendbyte (CC1100_CFG[i]); } CC1100_DEASSERT; CC1100_ASSERT; // setup PA table cc1100_sendbyte (CC1100_PATABLE | CC1100_WRITE_BURST); for (uint8_t i = 0; i < CC1100_PA_SIZE; i++) { cc1100_sendbyte (CC1100_PA[i]); } CC1100_DEASSERT; ccStrobe (CC1100_SCAL); _delay_ms (1); }
static void fht80b_sendpacket(void) { ccStrobe(CC1100_SIDLE); // Don't let the CC1101 to disturb us // avg. FHT packet is 75ms. // The first delay is larger, as we don't know if we received the first or // second FHT actuator message. my_delay_ms(fht80b_out[2]==FHT_CAN_XMIT ? 155 : 75); addParityAndSendData(fht80b_out, 5, FHT_CSUM_START, 1); ccRX(); // reception might be lost due to LOVF fht_display_buf(fht80b_out); }
//-------------------------------------------------------------------- void ccRX(void) { uint8_t cnt = 0xff; while(cnt-- && (ccStrobe(CC1100_SRX) & CC1100_STATUS_STATE_BM) != CC1100_STATE_RX) my_delay_us(10); #ifdef ARM AT91C_BASE_AIC->AIC_IECR = 1 << CC1100_IN_PIO_ID; #else EIMSK |= _BV(CC1100_INT); #endif }
void native_task(void) { uint8_t len, byte, i; if(!native_on) return; // wait for CC1100_FIFOTHR given bytes to arrive in FIFO: if (bit_is_set( CC1100_IN_PORT, CC1100_IN_PIN )) { // start over syncing ccStrobe( CC1100_SIDLE ); len = cc1100_readReg( CC1100_RXBYTES ) & 0x7f; // read len, transfer RX fifo if (len) { CC1100_ASSERT; cc1100_sendbyte( CC1100_READ_BURST | CC1100_RXFIFO ); DC( 'N' ); DH2(native_on); for (i=0; i<len; i++) { byte = cc1100_sendbyte( 0 ); #if defined(LACROSSE_HMS_EMU) if (i<sizeof(payload)) payload[i] = byte; #endif DH2( byte ); } CC1100_DEASSERT; DNL(); #ifdef LACROSSE_HMS_EMU if (len>=5) dec2hms_lacrosse(payload); #endif } return; } switch (cc1100_readReg( CC1100_MARCSTATE )) { // RX_OVERFLOW case 17: // IDLE case 1: ccStrobe( CC1100_SFRX ); ccStrobe( CC1100_SIDLE ); ccStrobe( CC1100_SNOP ); ccStrobe( CC1100_SRX ); break; } }
void kopp_fc_init(void) { #ifdef ARM AT91C_BASE_AIC->AIC_IDCR = 1 << CC1100_IN_PIO_ID; // disable INT - we'll poll... CC1100_CS_BASE->PIO_PPUER = _BV(CC1100_CS_PIN); //Enable pullup CC1100_CS_BASE->PIO_OER = _BV(CC1100_CS_PIN); //Enable output CC1100_CS_BASE->PIO_PER = _BV(CC1100_CS_PIN); //Enable PIO control #else EIMSK &= ~_BV(CC1100_INT); // disable INT - we'll poll... SET_BIT( CC1100_CS_DDR, CC1100_CS_PIN ); // CS as output #endif // Toggle chip select signal (why?) CC1100_DEASSERT; // Chip Select InActiv my_delay_us(30); CC1100_ASSERT; // Chip Select Activ my_delay_us(30); CC1100_DEASSERT; // Chip Select InActiv my_delay_us(45); ccStrobe( CC1100_SRES ); // Send SRES command (Reset CC110x) my_delay_us(100); // load configuration (CC1100_Kopp_CFG[EE_CC1100_CFG_SIZE]) CC1100_ASSERT; // Chip Select Activ cc1100_sendbyte( 0 | CC1100_WRITE_BURST ); for(uint8_t i = 0; i < EE_CC1100_CFG_SIZE; i++) { cc1100_sendbyte(__LPM(CC1100_Kopp_CFG+i)); } CC1100_DEASSERT; // Chip Select InActiv // If I don't missunderstand the code, in module cc1100.c the pa table is defined as // 00 and C2 what means power off and max. power. // so following code (setup PA table) is not needed ? // did a trial, but does not work // setup PA table (-> Remove as soon as transmitting ok?), table see cc1100.c // this initializes the PA table with the table defined at EE_Prom // which table will be taken depends on command "x00 .... x09" // x00 means -10dbm pa ramping // x09 means +10dBm no pa ramping (see cc1100.c) and commandref.html #ifdef PrintOn // DS_P(PSTR("PA Table values: ")); #endif uint8_t *pa = EE_CC1100_PA; // EE_CC1100_PA+32 means max power??? CC1100_ASSERT; cc1100_sendbyte( CC1100_PATABLE | CC1100_WRITE_BURST); for (uint8_t i = 0; i < 8; i++) { #ifdef PrintOn // DU(erb(pa),0); // ### Claus, mal sehen was im PA Table steht DS_P(PSTR(" ")); #endif cc1100_sendbyte(erb(pa++)); // fncollection.c "erb()"gibt einen EEPROM Wert zurück } #ifdef PrintOn DS_P(PSTR("\r\n")); #endif CC1100_DEASSERT; // Set CC_ON ccStrobe( CC1100_SCAL); // Calibrate Synthesizer and turn it of. ##Claus brauchen wir das my_delay_ms(1); cc_on = 1; kopp_fc_on = 1; //##Claus may be not needed in future (Tx Only) checkFrequency(); }
static void it_send (char *in, uint8_t datatype) { //while (rf_isreceiving()) { //_delay_ms(1); //} int8_t i, j, k; LED_ON(); #if defined (HAS_IRRX) || defined (HAS_IRTX) //Blockout IR_Reception for the moment cli(); #endif // If NOT InterTechno mode if(!intertechno_on) { #ifdef HAS_ASKSIN if (asksin_on) { restore_asksin = 1; asksin_on = 0; } #endif #ifdef HAS_MORITZ if(moritz_on) { restore_moritz = 1; moritz_on = 0; } #endif it_tunein(); my_delay_ms(3); // 3ms: Found by trial and error } ccStrobe(CC1100_SIDLE); ccStrobe(CC1100_SFRX ); ccStrobe(CC1100_SFTX ); ccTX(); // Enable TX int8_t sizeOfPackage = strlen(in)-1; // IT-V1 = 14, IT-V3 = 33, IT-V3-Dimm = 37 int8_t mode = 0; // IT V1 //DU(sizeOfPackage, 3); if (sizeOfPackage == 33 || sizeOfPackage == 37) { mode = 1; // IT V3 } for(i = 0; i < it_repetition; i++) { if (datatype == DATATYPE_IT) { if (mode == 1) { send_IT_sync_V3(); send_IT_latch_V3(); } else { // Sync-Bit for IT V1 send before package CC1100_SET_OUT; // High my_delay_us(it_interval); CC1100_CLEAR_OUT; // Low for(k = 0; k < 31; k++) { my_delay_us(it_interval); } } #ifdef HAS_HOMEEASY } else if (datatype == DATATYPE_HE) { send_IT_sync_HE(DATATYPE_HE); } else if (datatype == DATATYPE_HEEU) { send_IT_sync_HE(DATATYPE_HEEU); #endif } uint8_t startCount = 1; #ifdef HAS_HOMEEASY if (datatype == DATATYPE_HE || datatype == DATATYPE_HEEU) { startCount = 2; } #endif for(j = startCount; j < sizeOfPackage; j++) { if(in[j+1] == '0') { if (datatype == DATATYPE_IT) { if (mode == 1) { send_IT_bit_V3(0); } else { send_IT_bit(0); } #ifdef HAS_HOMEEASY } else { send_IT_bit_HE(0, datatype); #endif } } else if (in[j+1] == '1') { if (datatype == DATATYPE_IT) { if (mode == 1) { send_IT_bit_V3(1); } else { send_IT_bit(1); } #ifdef HAS_HOMEEASY } else { send_IT_bit_HE(1, datatype); #endif } } else if (in[j+1] == '2') { send_IT_bit_V3(2); } else { if (mode == 1) { send_IT_bit_V3(3); } else { send_IT_bit(2); } } } //if (mode == 1) { // send_IT_sync_V3(); //} } //Do it n Times if(intertechno_on) { if(tx_report) { // Enable RX ccRX(); } else { ccStrobe(CC1100_SIDLE); } } #ifdef HAS_ASKSIN else if (restore_asksin) { restore_asksin = 0; rf_asksin_init(); asksin_on = 1; ccRX(); } #endif #ifdef HAS_MORITZ else if (restore_moritz) { restore_moritz = 0; rf_moritz_init(); } #endif else { set_txrestore(); } #if defined (HAS_IRRX) || defined (HAS_IRTX) //Activate IR_Reception again sei(); #endif LED_OFF(); DC('i');DC('s'); #ifdef HAS_HOMEEASY if (datatype == DATATYPE_HE) { DC('h'); } else if (datatype == DATATYPE_HEEU) { DC('e'); } #endif for(j = 1; j < sizeOfPackage; j++) { if(in[j+1] == '0') { DC('0'); } else if (in[j+1] == '1') { DC('1'); } else if (in[j+1] == '2') { DC('2'); } else { if (datatype == DATATYPE_IT) { if (mode == 1) { DC('D'); } else { DC('F'); } } } } DNL(); }
void set_ccoff (void) { ccStrobe (CC1100_SIDLE); cc_on = 0; }
void ccIdle (void) { GIMSK &= ~_BV (CC1100_INT); ccStrobe (CC1100_SIDLE); }
void it_func(char *in) { if (in[1] == 't') { fromdec (in+2, (uint8_t *)&it_interval); DU(it_interval,0); DNL(); } else if (in[1] == 's') { if (in[2] == 'r') { // Modify Repetition-counter fromdec (in+3, (uint8_t *)&it_repetition); DU(it_repetition,0); DNL(); #ifdef HAS_HOMEEASY } else if (in[2] == 'h') { // HomeEasy it_send (in, DATATYPE_HE); } else if (in[2] == 'e') { // HomeEasy EU it_send (in, DATATYPE_HEEU); #endif } else { it_send (in, DATATYPE_IT); // Sending real data } //sending real data } else if (in[1] == 'r') { // Start of "Set Frequency" (f) #ifdef HAS_ASKSIN if (asksin_on) { restore_asksin = 1; asksin_on = 0; } #endif #ifdef HAS_MORITZ if (moritz_on) { restore_moritz = 1; moritz_on = 0; } #endif it_tunein (); intertechno_on = 1; } else if (in[1] == 'f') { // Set Frequency if (in[2] == '0' ) { it_frequency[0] = 0x10; it_frequency[1] = 0xb0; it_frequency[2] = 0x71; } else { fromhex (in+2, it_frequency, 3); } DC('i');DC('f');DC(':'); DH2(it_frequency[0]); DH2(it_frequency[1]); DH2(it_frequency[2]); DNL(); } else if (in[1] == 'x') { // Reset Frequency back to Eeprom value if(0) { ; #ifdef HAS_ASKSIN } else if (restore_asksin) { restore_asksin = 0; rf_asksin_init(); asksin_on = 1; ccRX(); #endif #ifdef HAS_MORITZ } else if (restore_moritz) { restore_moritz = 0; rf_moritz_init(); #endif } else { ccInitChip(EE_CC1100_CFG); // Set back to Eeprom Values if(tx_report) { // Enable RX ccRX(); } else { ccStrobe(CC1100_SIDLE); } } intertechno_on = 0; } }
void send_belfox(char *msg) { uint8_t repeat=BELFOX_REPEAT; uint8_t len=strnlen(msg,BELFOX_LEN+2)-1; // assert if length incorrect if (len != BELFOX_LEN) return; LED_ON(); #if defined (HAS_IRRX) || defined (HAS_IRTX) // Block IR_Reception cli(); #endif #ifdef USE_RF_MODE change_RF_mode(RF_mode_slow); #else #ifdef HAS_MORITZ uint8_t restore_moritz = 0; if(moritz_on) { restore_moritz = 1; moritz_on = 0; set_txreport("21"); } #endif if(!cc_on) set_ccon(); #endif ccTX(); // Enable TX do { send_sync(); // sync for(int i = 1; i <= BELFOX_LEN; i++) // loop input, for example 'L111001100110' send_bit(msg[i] == '1'); CC1100_OUT_PORT &= ~_BV(CC1100_OUT_PIN); // final low to complete last bit my_delay_ms(BELFOX_PAUSE); // pause } while(--repeat > 0); if(TX_REPORT) { // Enable RX ccRX(); } else { ccStrobe(CC1100_SIDLE); } #if defined (HAS_IRRX) || defined (HAS_IRTX) // Activate IR_Reception sei(); #endif #ifdef USE_RF_MODE restore_RF_mode(); #else #ifdef HAS_MORITZ if(restore_moritz) rf_moritz_init(); #endif #endif LED_OFF(); }