void enableWOR(void) { cc1100_strobe(SIDLE); RFstatus |= WORenabled; cc1100_strobe(SWOR); }
void waitTX(void) { unsigned char status; unsigned char x; x=1; while (x) { status = cc1100_strobe(SNOP); switch ( 0xf0 & status) { case 0x70: cc1100_strobe(SFTX); case 0x10: case 0x00: if (RFstatus & WORsend) { switch_to_idle(); } else if (RFstatus & WORenabled) cc1100_strobe(SWOR); else if (RFstatus & WORrxon) cc1100_strobe(SRX); else if (RFstatus & RXenabled) cc1100_strobe(SRX); else { switch_to_idle(); } x=0; break; } } }
void RF_sendWOR(unsigned char addr) { unsigned char b[2]; unsigned int WOR_cb; b[0]=0x01; b[1]=addr; VICIntEnClr = INT_EINT0; switch_to_idle(); RFstatus |= WORsend; cc1100_write1(0x18,conf[0x18] & 0xCF); cc1100_strobe(SCAL); waitTX(); WOR_cb = addTimerCB(WORsend_timeout, 101); startCB(WOR_cb); while (RFstatus & WORsend) { cc1100_write(TX_fifo | BURST,b,2); cc1100_strobe(STX); waitTX(); } stopCB(WOR_cb); removeTimerCB(WOR_cb); cc1100_write1(0x18,conf[0x18]); waitTX(); VICIntEnable = INT_EINT0; }
void RF_send(unsigned char* b, int payload_cnt) { switch_to_idle_1(); cc1100_strobe(SFTX); cc1100_strobe(SCAL); cc1100_write(TX_fifo | BURST, b, payload_cnt); cc1100_strobe(STX); }
void cc1100IRQ (void) { if (cc1100_read1(0x3B | READ | BURST) > 0) { RF_getfifo(RFbuf); cc1100_strobe(SIDLE); cc1100_strobe(SFRX); struct cc1100frame_ *RXframe; RXframe = (struct cc1100frame_ *)&RFbuf[0]; if ((RXframe->len == 1) && ((RXframe->destAddr == cc1100Addr) || (RXframe->destAddr == 0x00))) { switch_WOR_RX(); } if(RFstatus & WORenabled) cc1100_strobe(SWOR); else cc1100_strobe(SRX); if (RXframe->len > 3) { setCBIntervall(WORrx_cb,WORrx_time); switch ( RXframe->packetType) { case 0x01: draw_block(0,50,128,10,3,DRAW_ERASE); draw_string(0, 50, (char*)&RFbuf[headerLen], 3, DRAW_PUT); break; case 0x02: if (RXframe->data[0] == 0x01) { RXframe->destAddr = RXframe->srcAddr; RXframe->srcAddr = cc1100Addr; RXframe->data[0] = 0x02; RXframe->len = 0x04; switch_to_idle(); RF_send(RFbuf); } else if (RFbuf[headerLen] == 0x02) { RFstatus |= Received; } break; case 0x03: if ((RXframe->data[0] == 0x01) && (timeInfo & time_accurate)) { send_time(RXframe->srcAddr); } else if (RFbuf[headerLen] == 0x02) { memcpy((unsigned char *)&time,(unsigned char *)&RXframe->data[1],3); memcpy((unsigned char *)&date,(unsigned char *)&RXframe->data[4],4); timeInfo |=0x02; VICSoftInt = INT_EINT2; } } } } waitTX(); EXTINT = 0x01; }
void WORrx_timeout(void) { stopCB(WORrx_cb); removeTimerCB(WORrx_cb); RFstatus &= ~WORrxon; draw_ant(100,0,DRAW_ERASE); cc1100_write1(0x16,conf[0x16]); RFstatus |= WORenabled; cc1100_strobe(SIDLE); cc1100_strobe(SWOR); }
void RF_send(unsigned char* b) { VICIntEnClr = INT_EINT0; if(RFstatus & WORenabled) { switch_to_idle(); } cc1100_write(TX_fifo | BURST,b,b[0]+1); cc1100_strobe(STX); waitTX(); VICIntEnable = INT_EINT0; }
void cc1100_init(void) { unsigned long xx = 0x200; PINSEL1 &= 0xffffff00; //GDO0 SCK1 MISO1 MOSI1 as GPIO FIODIR0 |= (CS1 | MOSI1 | SCK1); //output PCONP &= 0xfffffbff; PCONP |= (1<<21); FIOSET0 = SCK1; FIOCLR0 = MOSI1; FIOCLR0 = CS1; while(xx) { asm volatile("nop" : :); xx--; } FIOSET0 = CS1; xx=0x200; while(xx) { asm volatile("nop" : :); xx--; } FIOCLR0 = CS1; FIOCLR0 = SCK1; while (FIOPIN0 & MISO1); PINSEL1 |= 0x000002A8; //SCK1 MISO1 MOSI1 as SPI1 SSPCR0 = 0x0007; SSPCPSR = 0x02; SSPCR1 = 0x02; SSPDR = SRES; while (FIOPIN0 & MISO1); while (SSPSR & (1<<4)); xx = SSPDR; cc1100_write((0x00 | BURST ),(unsigned char*)conf,0x2f); cc1100_write1(PATABLE,0xC0); cc1100_strobe(SIDLE); cc1100_strobe(SPWD); }
void switch_to_idle_1() { cc1100_strobe(SIDLE); while (cc1100_read1(MARCSTATE) != 01); }
void switch_to_idle() { cc1100_strobe(SIDLE); while (cc1100_read1(0x35 | READ | BURST) != 01); }