ese519

Dependencies:   addressable_leds

Dependents:   led-mrf-osc_full

Committer:
Jing_Qiu
Date:
Sat Mar 21 02:42:59 2015 +0000
Revision:
1:d4c1d8dc8ced
Parent:
0:284274252007
revised

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Jing_Qiu 0:284274252007 1 /* mbed MRF24J40 (IEEE 802.15.4 tranceiver) Library
Jing_Qiu 0:284274252007 2 * Copyright (c) 2011 Jeroen Hilgers
Jing_Qiu 0:284274252007 3 *
Jing_Qiu 0:284274252007 4 * Permission is hereby granted, free of charge, to any person obtaining a copy
Jing_Qiu 0:284274252007 5 * of this software and associated documentation files (the "Software"), to deal
Jing_Qiu 0:284274252007 6 * in the Software without restriction, including without limitation the rights
Jing_Qiu 0:284274252007 7 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
Jing_Qiu 0:284274252007 8 * copies of the Software, and to permit persons to whom the Software is
Jing_Qiu 0:284274252007 9 * furnished to do so, subject to the following conditions:
Jing_Qiu 0:284274252007 10 *
Jing_Qiu 0:284274252007 11 * The above copyright notice and this permission notice shall be included in
Jing_Qiu 0:284274252007 12 * all copies or substantial portions of the Software.
Jing_Qiu 0:284274252007 13 *
Jing_Qiu 0:284274252007 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
Jing_Qiu 0:284274252007 15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
Jing_Qiu 0:284274252007 16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
Jing_Qiu 0:284274252007 17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
Jing_Qiu 0:284274252007 18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
Jing_Qiu 0:284274252007 19 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
Jing_Qiu 0:284274252007 20 * THE SOFTWARE.
Jing_Qiu 0:284274252007 21 */
Jing_Qiu 0:284274252007 22
Jing_Qiu 0:284274252007 23 #ifndef MRF24J40_H
Jing_Qiu 0:284274252007 24 #define MRF25J40_H
Jing_Qiu 0:284274252007 25
Jing_Qiu 0:284274252007 26 #include "mbed.h"
Jing_Qiu 0:284274252007 27
Jing_Qiu 0:284274252007 28 /** MRF24J40 class. Provides a simple send/receive API for a microchip
Jing_Qiu 0:284274252007 29 ** MFR24J40 IEEE 802.15.4 tranceiver. The tranceiver is available on a
Jing_Qiu 0:284274252007 30 ** module that can easilly be soldered to some header pins to use it with
Jing_Qiu 0:284274252007 31 ** an mbed on a breadboard. The module is called 'MRF24J40MA' and can be
Jing_Qiu 0:284274252007 32 ** ordered for example by www.farnell.com.
Jing_Qiu 0:284274252007 33 *
Jing_Qiu 0:284274252007 34 * Example:
Jing_Qiu 0:284274252007 35 * @code
Jing_Qiu 0:284274252007 36 * #include "mbed.h"
Jing_Qiu 0:284274252007 37 * #include "MRF24J40.h"
Jing_Qiu 0:284274252007 38 *
Jing_Qiu 0:284274252007 39 * // RF tranceiver to link with handheld.
Jing_Qiu 0:284274252007 40 * MRF24J40 mrf(p11, p12, p13, p14, p21);
Jing_Qiu 0:284274252007 41 *
Jing_Qiu 0:284274252007 42 * // LEDs
Jing_Qiu 0:284274252007 43 * DigitalOut led1(LED1);
Jing_Qiu 0:284274252007 44 * DigitalOut led2(LED2);
Jing_Qiu 0:284274252007 45 * DigitalOut led3(LED3);
Jing_Qiu 0:284274252007 46 * DigitalOut led4(LED4);
Jing_Qiu 0:284274252007 47 *
Jing_Qiu 0:284274252007 48 * // Timer.
Jing_Qiu 0:284274252007 49 * Timer timer;
Jing_Qiu 0:284274252007 50 *
Jing_Qiu 0:284274252007 51 * // Serial port for showing RX data.
Jing_Qiu 0:284274252007 52 * Serial pc(USBTX, USBRX);
Jing_Qiu 0:284274252007 53 *
Jing_Qiu 0:284274252007 54 * // Send / receive buffers.
Jing_Qiu 0:284274252007 55 * // IMPORTANT: The MRF24J40 is intended as zigbee tranceiver; it tends
Jing_Qiu 0:284274252007 56 * // to reject data that doesn't have the right header. So the first
Jing_Qiu 0:284274252007 57 * // 8 bytes in txBuffer look like a valid header. The remaining 120
Jing_Qiu 0:284274252007 58 * // bytes can be used for anything you like.
Jing_Qiu 0:284274252007 59 * uint8_t txBuffer[128]= {1, 8, 0, 0xA1, 0xB2, 0xC3, 0xD4, 0x00};
Jing_Qiu 0:284274252007 60 *
Jing_Qiu 0:284274252007 61 * uint8_t rxBuffer[128];
Jing_Qiu 0:284274252007 62 * uint8_t rxLen;
Jing_Qiu 0:284274252007 63 *
Jing_Qiu 0:284274252007 64 * int main (void)
Jing_Qiu 0:284274252007 65 * {
Jing_Qiu 0:284274252007 66 * uint8_t count = 0;
Jing_Qiu 0:284274252007 67 * pc.baud(115200);
Jing_Qiu 0:284274252007 68 * timer.start();
Jing_Qiu 0:284274252007 69 * while(1)
Jing_Qiu 0:284274252007 70 * {
Jing_Qiu 0:284274252007 71 * // Check if any data was received.
Jing_Qiu 0:284274252007 72 * rxLen = mrf.Receive(rxBuffer, 128);
Jing_Qiu 0:284274252007 73 * if(rxLen)
Jing_Qiu 0:284274252007 74 * {
Jing_Qiu 0:284274252007 75 * // Toggle LED 1 upon each reception of data.
Jing_Qiu 0:284274252007 76 * led1 = led1^1;
Jing_Qiu 0:284274252007 77 * // Send to serial.
Jing_Qiu 0:284274252007 78 * // IMPORTANT: The last two bytes of the received data
Jing_Qiu 0:284274252007 79 * // are the checksum used in the transmission.
Jing_Qiu 0:284274252007 80 * for(uint8_t i=0; i<rxLen; i++)
Jing_Qiu 0:284274252007 81 * {
Jing_Qiu 0:284274252007 82 * pc.printf("0x%02X ", rxBuffer[i]);
Jing_Qiu 0:284274252007 83 * }
Jing_Qiu 0:284274252007 84 * pc.printf("\r\n");
Jing_Qiu 0:284274252007 85 * }
Jing_Qiu 0:284274252007 86 *
Jing_Qiu 0:284274252007 87 * // Each second, send some data.
Jing_Qiu 0:284274252007 88 * if(timer.read_ms() >= 1000)
Jing_Qiu 0:284274252007 89 * {
Jing_Qiu 0:284274252007 90 * timer.reset();
Jing_Qiu 0:284274252007 91 * // Toggle LED 2.
Jing_Qiu 0:284274252007 92 * led2 = led2^1;
Jing_Qiu 0:284274252007 93 *
Jing_Qiu 0:284274252007 94 * // UART.
Jing_Qiu 0:284274252007 95 * pc.printf("TXD\r\n");
Jing_Qiu 0:284274252007 96 *
Jing_Qiu 0:284274252007 97 * // Send counter value.
Jing_Qiu 0:284274252007 98 * count++;
Jing_Qiu 0:284274252007 99 * txBuffer[8] = count;
Jing_Qiu 0:284274252007 100 * mrf.Send(txBuffer, 9);
Jing_Qiu 0:284274252007 101 * }
Jing_Qiu 0:284274252007 102 * }
Jing_Qiu 0:284274252007 103 * }
Jing_Qiu 0:284274252007 104 * @endcode
Jing_Qiu 0:284274252007 105 */
Jing_Qiu 0:284274252007 106
Jing_Qiu 0:284274252007 107
Jing_Qiu 0:284274252007 108 class MRF24J40
Jing_Qiu 0:284274252007 109 {
Jing_Qiu 0:284274252007 110 public:
Jing_Qiu 0:284274252007 111 /** Create a MRF24J40 object and initizalize it.
Jing_Qiu 0:284274252007 112 *
Jing_Qiu 0:284274252007 113 * @param pin mosi Spi MOSI pin connected to MRF's SDI.
Jing_Qiu 0:284274252007 114 * @param pin miso Spi MISO pin connected to MRF's SDO.
Jing_Qiu 0:284274252007 115 * @param pin sck Spi SCK pin connected to MRF's SCK.
Jing_Qiu 0:284274252007 116 * @param pin cs Pin connected to MRF's #CS.
Jing_Qiu 0:284274252007 117 * @param pin reset Pin connected to MRF's #Reset.
Jing_Qiu 0:284274252007 118 */
Jing_Qiu 0:284274252007 119 MRF24J40(PinName mosi, PinName miso, PinName sck, PinName cs, PinName reset);//, PinName irq, PinName wake);
Jing_Qiu 0:284274252007 120
Jing_Qiu 0:284274252007 121 /** Reset the MRF24J40 and initialize it.
Jing_Qiu 0:284274252007 122 */
Jing_Qiu 0:284274252007 123 void Reset(void); // Reset chip and configure it.
Jing_Qiu 0:284274252007 124
Jing_Qiu 0:284274252007 125 /** Send data.
Jing_Qiu 0:284274252007 126 *
Jing_Qiu 0:284274252007 127 * Note that the MRF24J40 only handles data with a valid IEEE 802.15.4
Jing_Qiu 0:284274252007 128 * header. See the example how to get around this.
Jing_Qiu 0:284274252007 129 *
Jing_Qiu 0:284274252007 130 * @param data Pointer to data to be send.
Jing_Qiu 0:284274252007 131 * @param length Length of the data to be send in bytes.
Jing_Qiu 0:284274252007 132 */
Jing_Qiu 0:284274252007 133 void Send(uint8_t *data, uint8_t length); // Send data.
Jing_Qiu 0:284274252007 134
Jing_Qiu 0:284274252007 135 /** Check if any data was received.
Jing_Qiu 0:284274252007 136 *
Jing_Qiu 0:284274252007 137 * Note that the MRF24J40 appends two bytes of CRC for each packet.
Jing_Qiu 0:284274252007 138 * So you will receive two bytes more than were send with the 'Send' function.
Jing_Qiu 0:284274252007 139 *
Jing_Qiu 0:284274252007 140 * @param data Pointer to buffer where received data can be placed.
Jing_Qiu 0:284274252007 141 * @param maxLength Maximum amount of data to be placed in the buffer.
Jing_Qiu 0:284274252007 142 * @param returns The number of bytes written into the buffer.
Jing_Qiu 0:284274252007 143 */
Jing_Qiu 0:284274252007 144 uint8_t Receive(uint8_t *data, uint8_t maxLength); // Receive data if ready.
Jing_Qiu 0:284274252007 145
Jing_Qiu 0:284274252007 146 // void DebugDump(Serial &ser);
Jing_Qiu 0:284274252007 147
Jing_Qiu 0:284274252007 148 private:
Jing_Qiu 0:284274252007 149 SPI mSpi;
Jing_Qiu 0:284274252007 150 DigitalOut mCs;
Jing_Qiu 0:284274252007 151 DigitalOut mReset;
Jing_Qiu 0:284274252007 152 // DigitalIn mIrq;
Jing_Qiu 0:284274252007 153 // DigitalIn mWake;
Jing_Qiu 0:284274252007 154
Jing_Qiu 0:284274252007 155 uint8_t ReadShort (uint8_t address);
Jing_Qiu 0:284274252007 156 void WriteShort (uint8_t address, uint8_t data);
Jing_Qiu 0:284274252007 157 uint8_t ReadLong (uint16_t address);
Jing_Qiu 0:284274252007 158 void WriteLong (uint16_t address, uint8_t data);
Jing_Qiu 0:284274252007 159 };
Jing_Qiu 0:284274252007 160
Jing_Qiu 0:284274252007 161 #endif