int main(int argc, char ** argv) { int res; printf("Start rpiCC2500\n"); TICC *cc = (TICC *) malloc(sizeof(TICC)); res = CC_Init(cc, "/dev/spidev0.0", 25 /*GNO0-pin Not yet used*/); if (res < 0) { printf("Failed to init TICC."); return 1; } perror("SPI init"); usleep(30000); TI_CC_SPIStrobe( cc->fd, TI_CCxxx0_SRES); printf("Wait for RF to be Ready\n"); usleep(40); printf("RF ok\n"); writeRFSettings(cc); printf("BurstReg\n"); TI_CC_SPIWriteBurstReg(cc->fd, TI_CCxxx0_PATABLE, paTable, paTableLen); printf("Strobe\n"); //TI_CC_SPIStrobe(cc->fd, TI_CCxxx0_SRX); // Initialize CCxxxx in RX mode. // When a pkt is received, it will // signal on GDO0 char rxBuffer[50]; printf("entering LOOP\n"); printf("Part No.: %d\n",TI_CC_SPIReadStatus(cc->fd, TI_CCxxx0_PARTNUM)); printf("Version No.: %d\n",TI_CC_SPIReadStatus(cc->fd, TI_CCxxx0_VERSION)); char len = 50; int j,i; for(j=0;j<10;j++){ // for now send every 500ms a message and check for received packages rxBuffer[0] =3; rxBuffer[1] =0x01; rxBuffer[2] =12; rxBuffer[3] =rxBuffer[1]^rxBuffer[2]^0x01; printf("Send Package\n"); RFSendPacket(cc, rxBuffer, 4); usleep(500000); printf("Check for Package\n"); while(RFReceivePacket(cc, rxBuffer, &len)){ printf("Got A Package %d\n",len); for(i =0; i< len; i++){ printf("%d ",rxBuffer[i]); } printf("\n"); //Receiveddata are stored in rxBuffer //Put some intelligence here len = 50; } } printf("exiting LOOP\n"); CC_dispose(cc); free(cc); return 0; }
char WaterLevelValid(void) { // This function builds and transmits a request packet to the sensor module // It then waits until a flag is set within an RX interrupt // that specifies a valid water level condition. rx_water_level_data = 0; // Set new data flag low RFSendPacket(txBuffer, MSGLEN); // Send a request for water level data while(rx_water_level_data == 0); // Hold in loop until sensor data is received. return rxBuffer[WATER_DATA_RX_INDEX]; // Return the byte corresponding to water level data }
__interrupt void port2_ISR (void) { // Build packet txBuffer[0] = 2; // Packet length txBuffer[1] = 0x01; // Packet address txBuffer[2] = (TI_CC_SW_PxIFG & 0xC0) >> 6; // Load switch inputs RFSendPacket(txBuffer, 3); // Send value over RF __delay_cycles(100000); // Switch debounce TI_CC_GDO0_PxIFG &= ~TI_CC_GDO0_PIN; // Clear GDO flag TI_CC_SW_PxIFG &= ~(TI_CC_SW1+TI_CC_SW2); // Clr flag that caused int } // Clear it.
int main(void) { WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer //P2REN |= BIT3; // enable pull up resistor on p2.3 //P2OUT |= BIT3; // This does not seem to be working as expected. // Initialize radio and SPI TI_CC_SPISetup(); // Initialize SPI port TI_CC_PowerupResetCCxxxx(); // Reset CCxxxx writeRFSettings(); // Write RF settings to config reg TI_CC_SPIWriteBurstReg(TI_CCxxx0_PATABLE, paTable, paTableLen);//Write PATABLE // Enable interrupts from radio module TI_CC_GDO0_PxIES |= TI_CC_GDO0_PIN; // Int on falling edge (end of pkt) TI_CC_GDO0_PxIFG &= ~TI_CC_GDO0_PIN; // Clear flag TI_CC_GDO0_PxIE |= TI_CC_GDO0_PIN; // Enable int on end of packet // Enable radio TI_CC_SPIStrobe(TI_CCxxx0_SRX); // Initialize CCxxxx in RX mode. // configure packet // -------------------------------------------- txBuffer[0] = MSGLEN-1; // Packet length txBuffer[1] = 0x01; // Packet address - If this is 0xFF, it's an ack and not data. // Begin data // -------------------------------------------- txBuffer[2] = VALID_LEVEL; // default flag is valid. This is set on request from other module. txBuffer[3] = 0x30; txBuffer[4] = 0x31; txBuffer[5] = 0x34; txBuffer[6] = 0x35; txBuffer[7] = 0x36; txBuffer[8] = 0x37; txBuffer[9] = 0x38; txBuffer[10] = 0x39; // the rest of this data is used as filler. // ------ // End Data txBuffer[11] = 0x00; // terimate // -------------------------------------------- _BIS_SR(GIE); // turn on interrupts. Initialization must be complete by this point while(1) { if(water_level_request) { // Ideally, P2.3 should be pulled high. This is causing strange behavior // on the pin that should be investigated. // Check the status of P2.3 and set the r txBuffer[WATER_DATA_TX_INDEX] = (P2IN & BIT3) ? 0 : VALID_LEVEL;// turn on the pump if the water level is valid. RFSendPacket(txBuffer, MSGLEN); // Send water level data back to controller __delay_cycles(450000); // delay a few cycles. Note that this means requests that take place during // a pump cycle will be ignored completely. water_level_request = 0; // clear requested data flag } } }
__interrupt void Port1_ISR (void) { // If Switch was pressed if(TI_CC_SW_PxIFG & TI_CC_SW1) { // Build packet txBuffer[0] = 2; // Packet length txBuffer[1] = 0x01; // Packet address txBuffer[2] = (~TI_CC_SW_PxIFG << 1) & 0x02; // Load switch inputs RFSendPacket(txBuffer, 3); // Send value over RF __delay_cycles(5000); // Switch debounce } TI_CC_SW_PxIFG &= ~(TI_CC_SW1); // Clr flag that caused int }
__interrupt void port1_ISR (void) { if(P1IFG & (TI_CC_SW1 + TI_CC_SW2)) { // Build packet txBuffer[0] = 2; // Packet length txBuffer[1] = 0x01; // Packet address txBuffer[2] = (~TI_CC_SW_PxIN) & 0x0F; // Load four switch inputs RFSendPacket(txBuffer, 3); // Send value over RF } else if(P1IFG & TI_CC_GDO0_PIN) { char len=2; // Len of pkt to be RXed (only addr // plus data; size byte not incl b/c // stripped away within RX function) if (RFReceivePacket(rxBuffer,&len)) // Fetch packet from CCxxxx TI_CC_LED_PxOUT ^= rxBuffer[1]; // Toggle LEDs according to pkt data } // P1IFG &= ~(TI_CC_SW1+TI_CC_SW2+TI_CC_SW3+TI_CC_SW4);//Clr flag that caused int TI_CC_SW_PxIFG &= ~(TI_CC_SW1+TI_CC_SW2); // Clr flag that caused int TI_CC_GDO0_PxIFG &= ~TI_CC_GDO0_PIN; // After pkt TX, this flag is set. } // Clear it.