void announceInit() { // Open socket do { spiWriteWord(REG_S2_PORT0, ANNOUNCE_PORT); spiWriteReg(REG_S2_MR, MR_UDP); spiWriteReg(REG_S2_CR, CR_OPEN); if(spiReadReg(REG_S2_SR) != SOCK_UDP) spiWriteReg(REG_S2_CR, CR_CLOSE); } while(spiReadReg(REG_S2_SR) != SOCK_UDP); DBG_ANN(tracePGMlnAnn(mDebugAnn_DONE);) }
void announcePoll() { uint16_t packetSize = spiReadWord(REG_S2_RX_RSR0); if(packetSize) { announcePacket(packetSize); // Close the socket spiWriteReg(REG_S2_CR, CR_CLOSE); announceInit(); } }
void announceReply() { uint8_t txBuffer[100]; uint8_t* txPtr; uint8_t packetLength = 0; uint16_t writePointer; uint8_t value; uint8_t i; writePointer = spiReadWord(REG_S2_TX_WR0) + S2_TX_START; txPtr = txBuffer + 2; // Send IP address in hex // for(i = REG_SIPR0; i <= REG_SIPR3; i++) { value = spiReadReg(i); *txPtr++ = hex[value >> 4]; *txPtr++ = hex[value & 0xf]; } // // Tag on ident string // memcpy_P(txPtr, bootloaderIdentString, bootloaderIdentStringLength); packetLength = 8 + bootloaderIdentStringLength; // Write packet length at start of packet txBuffer[0] = 0; txBuffer[1] = packetLength; packetLength += 2; txPtr = txBuffer; while(packetLength--) { spiWriteReg(writePointer++, *txPtr++); if(writePointer == S2_TX_END) writePointer = S2_TX_START; } spiWriteWord(REG_S2_TX_WR0, writePointer - S2_TX_START); spiWriteReg(REG_S2_CR, CR_SEND); while(spiReadReg(REG_S2_CR)); }
/** * CC1101_writeReg * * Write single register into the CC1101 IC via SPI * * 'regAddr' Register address * 'value' Value to be writen */ void CC1101_writeReg(byte regAddr, byte value) { cc1101_Select(); // Select CC1101 wait_Miso(); // Wait until MISO goes low // // waits are needed since CSn is triggered by GPIO which is not in accordance with SPI peripheral which takes few cycles to shift out after you order it // spi_send(regAddr); // Send register address // DSK6713_waitusec(5); // spi_send(value); // Send value // DSK6713_waitusec(20); spiWriteReg(regAddr, value); cc1101_Deselect(); // Deselect CC1101 }
/** * cmdStrobe * * Send command strobe to the CC1101 IC via SPI * * 'cmd' Command strobe */ void CC1101_cmdStrobe(byte cmd) { cc1101_Select(); // Select CC1101 wait_Miso(); // Wait until MISO goes low // spi_send(cmd); // Send strobe command // // // send again, for some reason first send does not work // DSK6713_waitusec(10); // spi_send(cmd); // Send strobe command // // DSK6713_waitusec(20); spiWriteReg(cmd,0x00); // basically we only need to send 1 byte cc1101_Deselect(); // Deselect CC1101 }
/** * reset * * Reset CC1101 */ void CC1101_reset(void) { cc1101_Deselect(); // Deselect CC1101 DSK6713_waitusec(5); cc1101_Select(); // Select CC1101 DSK6713_waitusec(10); cc1101_Deselect(); // Deselect CC1101 DSK6713_waitusec(41); cc1101_Select(); // Select CC1101 wait_Miso(); // Wait until MISO goes low //spi_send(CC1101_SRES); // Send reset command strobe spiWriteReg(CC1101_SRES,0x00); wait_Miso(); // Wait until MISO goes low cc1101_Deselect(); // Deselect CC1101 CC1101_setDefaultRegs(); // Reconfigure CC1101 //setRegsFromEeprom(); // Take user settings from EEPROM }
//FIXME: void announcePacket(uint16_t packetSize) { void announcePacket() { uint8_t buffer[ANNOUNCE_DATA_SIZE]; uint16_t packetLength; // Transfer entire packet to RAM uint8_t* bufPtr = buffer; uint16_t count; readPointer = spiReadWord(REG_S2_RX_RD0) + S2_RX_START; // Read destination IP address for(count = 0; count < 4; count++) { spiWriteReg(REG_S2_DIPR0 + count, readNextByte()); } // Read destination port - but ignore it and respond on 5555 anyway. readNextByte(); readNextByte(); spiWriteWord(REG_S2_DPORT0, ANNOUNCE_PORT); // Read packet length packetLength = readNextByte() | (readNextByte() << 8); // Trim overlong packets if(packetLength > ANNOUNCE_DATA_SIZE) packetLength = ANNOUNCE_DATA_SIZE; for(count = packetLength; --count;) { *bufPtr++ = readNextByte(); } spiWriteWord(REG_S2_RX_RD0, readPointer - S2_RX_START); // Write back new pointer spiWriteWord(REG_S2_CR, CR_RECV); // Receive again // Dump packet bufPtr = buffer; // Parse packet if(memcmp(buffer, "arduino", 7) == 0) announceReply(); }