Test program to send MAX!-Messages with a RFM22-Module
Dependencies: RF22 TextLCD TextLCDScroll mbed RF22Max
Diff: main.cpp
- Revision:
- 0:94dd393bd9bb
- Child:
- 1:b71f9a293c54
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Mon Jan 16 19:06:53 2012 +0000 @@ -0,0 +1,306 @@ + +// Test code used during library development, showing how +// to do various things, and how to call various functions +// ported to mbed by Karl Zweimueller + +#include "mbed.h" + +#include <RF22.h> + +Serial pc(USBTX, USBRX); + +// mbed LEDs +//DigitalOut led1(LED1); +//DigitalOut led2(LED2); +//DigitalOut led3(LED3); +//DigitalOut led4(LED4); + + +// Singleton instance of the radio +//rf22(PinName slaveSelectPin , PinName mosi, PinName miso, PinName sclk, PinName interrupt ); +RF22 rf22(p14,p11,p12,p13,p15); + +void setup() { + + if (!rf22.init()) + pc.printf("RF22 init failed\n\r"); +} + +void +test_read_write() { + uint8_t val; + rf22.spiWrite(RF22_REG_42_CHECK_HEADER0, 10); + val = rf22.spiRead(RF22_REG_42_CHECK_HEADER0); + pc.printf("%n\r\n",val); + + rf22.spiWrite(RF22_REG_42_CHECK_HEADER0, 5); + val = rf22.spiRead(RF22_REG_42_CHECK_HEADER0); + pc.printf("%n\r\n", val); + pc.printf("-----"); +} + +void +test_adc() { + uint8_t val = rf22.adcRead(RF22_ADCSEL_GND); + pc.printf("%n\r\n", val); +} + +void test_temp() { + float val = rf22.temperatureRead(); + pc.printf("%3.1f\r\n", (val/2)-64); +} + +void +test_burst_read() { + uint8_t buf[127]; + rf22.spiBurstRead(0, buf, sizeof(buf)); + uint8_t i; + for (i = 0; i < 127; i++) { + pc.printf("%x : %x\n\r",i,buf[i]); + } +} + +void test_burst_write() { + uint8_t buf[] = "Hello"; + rf22.spiBurstWrite(RF22_REG_7F_FIFO_ACCESS, buf, sizeof(buf)); +} + +void +test_wut() { + pc.printf("WUT Start"); + rf22.setWutPeriod(10000); // 10000, 0, 0 -> 1 secs + rf22.spiWrite(RF22_REG_07_OPERATING_MODE1, RF22_ENWT); + // Wait for the interrupt to occur + while (1) { + uint8_t val = rf22.spiRead(RF22_REG_04_INTERRUPT_STATUS2); + if (val & RF22_IWUT) + break; + } + rf22.spiWrite(RF22_REG_07_OPERATING_MODE1, 0); + + pc.printf("WUT Interrupt bit detected OK"); +} + +void +test_set_frequency() { + if (!rf22.setFHStepSize(0)) + pc.printf("setFHStepSize 1 Fail"); + if (!rf22.setFHChannel(0)) + pc.printf("setFHChannel 1 Fail"); + if (!rf22.setFrequency(434.0)) + pc.printf("setFrequency 1 Fail"); + if (!rf22.setFrequency(240.0)) + pc.printf("setFrequency 2 Fail"); + if (!rf22.setFrequency(929.9999)) // Higher than this produces FREQERR on my 06 silicon + pc.printf("setFrequency 3 Fail"); + if (rf22.setFrequency(960.1)) // Should fail + pc.printf("setFrequency 4 Fail"); + + pc.printf("-------------"); +} + +void +test_rssi() { + rf22.setModeRx(); + pc.printf("Start\n\r"); + float f = 848.0; + while (f < 888.0) { + rf22.setFrequency(f); + wait_ms(200); // Wait for freq to settle + uint8_t rssi = rf22.rssiRead(); + + pc.printf("%f: %i\n\r",f,rssi); + f += 1.0; + } + pc.printf("End\n\r"); + rf22.setModeIdle(); + pc.printf("\n\r-------------\n\r"); +} + +// Sends 0.5 secs of PN9 modulated with with GFSK at full power +void test_tx_pn9() { + rf22.setFrequency(434.0); + rf22.setTxPower(RF22_TXPOW_17DBM); + rf22.setModeRx(); + // Takes a little while to start + wait(1); + pc.printf("%x \n\r",rf22.statusRead()); + rf22.setModemConfig(RF22::FSK_PN9_Rb2Fd5); +// rf22.setModemConfig(RF22::UnmodulatedCarrier); + rf22.setModeTx(); // Turns off Rx + // Takes a little while to start + wait(1); + pc.printf("%x \n\r",rf22.statusRead()); + wait_ms(500); + rf22.setModeIdle(); + // Takes a little while to turn off the transmitter + wait_ms(10); + pc.printf("%x \n\r",rf22.statusRead()); + pc.printf("-------------"); + wait_ms(500); +} + +// Connect analog test points to GPIO1 and GPIO2 +void test_analog_gpio() { + rf22.setFrequency(434.0); + rf22.setModeRx(); + // GPIO1 for Test N output + rf22.spiWrite(RF22_REG_0C_GPIO_CONFIGURATION1, 0x0c); + // GPIO2 for Test P output + rf22.spiWrite(RF22_REG_0D_GPIO_CONFIGURATION2, 0x0d); + rf22.spiWrite(RF22_REG_50_ANALOG_TEST_BUS_SELECT, 15); // Detector? + while (1); +} + +void test_modem_config() { + if (rf22.setModemConfig((RF22::ModemConfigChoice)255)) // Should fail + pc.printf("setModemConfig 1 failed"); + if (!rf22.setModemConfig(RF22::FSK_Rb2Fd5)) + pc.printf("setModemConfig 2 failed"); + if (!rf22.setModemConfig(RF22::FSK_Rb2_4Fd36)) + pc.printf("setModemConfig 3 failed"); + if (!rf22.setModemConfig(RF22::GFSK_Rb2_4Fd36)) + pc.printf("setModemConfig 3 failed"); + if (!rf22.setModemConfig(RF22::OOK_Rb40Bw335)) + pc.printf("setModemConfig 4 failed"); + + pc.printf("-------------"); +} + +// This works with test_rx below +void test_tx() { + pc.printf("Start Send...\n\r"); + if (!rf22.setFrequency(869.50)) + pc.printf("setFrequency failed"); + if (!rf22.setModemConfig(RF22::GFSK_Rb2Fd5)) + pc.printf("setModemConfig failed"); + //uint8_t data[] = "hello"; + // 255 octets: + uint8_t data[] = "12345678901234567890123456789012345678901234567890123456789012312345678901234567890123456789012345678901234567890123456789012312345678901234567890123456789012345678901234567890123456789012312345678901234567890123456789012345678901234567890123456789012345"; + rf22.send(data, sizeof(data)); + rf22.waitPacketSent(); + pc.printf("Send OK\n\r"); + +} + +// This works with test_tx above +void test_rx() { + pc.printf("Start Receive...\n\r"); + //if (!rf22.setFrequency(869.50)) + if (!rf22.setFrequency(869.49)) // sending frequesnce doesn't work!!! Seems to be a problem if combining RFM22B-S1 with -S2 + pc.printf("setFrequency failed\n\r"); + if (!rf22.setModemConfig(RF22::GFSK_Rb2Fd5)) + pc.printf("setModemConfig failed\n\r"); + + //while (1) { + uint8_t buf[RF22_MAX_MESSAGE_LEN]; + uint8_t len = sizeof(buf); + if (rf22.recv(buf, &len)) // Should fail, no message available + pc.printf("recv 1 failed\n\r"); + + //rf22.waitAvailable(); + if (rf22.waitAvailableTimeout(6000)) { + if (rf22.recv(buf, &len)) + pc.printf("got one in user: >%s<\n\r",(char*)buf); + + else + pc.printf("recv 2 failed\n\r"); + } else + pc.printf("recv timeout\n\r"); + + //} +} + +void loop() { +// test_read_write(); +// test_adc(); +// test_temp(); +// test_burst_read(); +// test_burst_write(); +// test_wut(); +// test_set_frequency(); +// test_rssi(); + test_tx_pn9(); +// test_analog_gpio(); +// test_modem_config(); +// test_tx(); +// test_rx(); + +// while (1); + wait_ms(1000); +} + +/*float start = 868.0; + float end = 868.8; +*/ +//869,40 - 869,65 Allgemein +float start = 869.4; +float end = 869.65; +float step = 0.02; + +void spec() { + rf22.setModeRx(); + float freq; + pc.printf("\033[H"); // Home + pc.printf("\033[2J"); // Clear Screen + for (freq = start; freq < end; freq += step) { + rf22.setFrequency(freq); + wait_ms(10); // Let the freq settle + uint8_t rssi = rf22.rssiRead(); + uint8_t stars = rssi / 8; + + pc.printf("%f: ",freq); + +// Serial.print(rssi, DEC); + uint8_t i; + for (i = 0; i < stars; i++) + pc.putc('*'); + pc.printf("\033[K\n\r"); // DElete to EOL + + } + pc.printf("------------------\n\r"); +} + + +int main() { + pc.baud(115200); + + pc.printf("\n\rConnected to mbed\n\r"); + + pc.printf("Pre-setup|"); + setup(); + pc.printf("Post-setup\n\r"); + + + //pc.printf("Pre-test_temp|"); + //test_temp(); + //pc.printf("Post-test_temp\n\r"); + + //pc.printf("Pre-test_set_frequency|"); + //test_set_frequency(); + //pc.printf("Post-test_set_frequency\n\r"); + + /* while (1){ + pc.printf("Pre-test_rssi|"); + test_rssi(); + pc.printf("Post-test_rssi\n\r"); + } + + while (1) { + spec(); + } + */ + + while (1) { + test_tx(); + rf22.setModeRx(); + wait(0.5); + test_rx(); + wait(2); + spec(); + } + + //pc.printf("Ready.\n\r"); +} + +