NEC Near Field Communication RF module library for mbed H001-000003-001 (950MHz), H001-000013-001 (920MHz), TY24FM-E2024 (2.4GHz)
Dependents: NECnfc_sample Drone_air Drone_ground
NEC Near Field Communication RF module library
NEC製の近距離無線モジュール用のライブラリです。
NECnfc.cpp@0:337524afec9b, 2012-07-17 (annotated)
- Committer:
- okini3939
- Date:
- Tue Jul 17 08:30:31 2012 +0000
- Revision:
- 0:337524afec9b
- Child:
- 1:5d157700a95d
[mbed] converted /juco_aqua/NECnfc
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
okini3939 | 0:337524afec9b | 1 | /** |
okini3939 | 0:337524afec9b | 2 | * NEC Near Field Communication RF module library for mbed |
okini3939 | 0:337524afec9b | 3 | * Copyright (c) 2012 Suga |
okini3939 | 0:337524afec9b | 4 | * Released under the MIT License: http://mbed.org/license/mit |
okini3939 | 0:337524afec9b | 5 | */ |
okini3939 | 0:337524afec9b | 6 | |
okini3939 | 0:337524afec9b | 7 | /** @file |
okini3939 | 0:337524afec9b | 8 | * @brief NEC Near Field Communication RF module library for mbed |
okini3939 | 0:337524afec9b | 9 | * @note H001-000003-001 (950MHz), TY24FM-E2024 (2.4GHz) |
okini3939 | 0:337524afec9b | 10 | */ |
okini3939 | 0:337524afec9b | 11 | |
okini3939 | 0:337524afec9b | 12 | #include "mbed.h" |
okini3939 | 0:337524afec9b | 13 | #include "NECnfc.h" |
okini3939 | 0:337524afec9b | 14 | #include "dbg.h" |
okini3939 | 0:337524afec9b | 15 | #include <string.h> |
okini3939 | 0:337524afec9b | 16 | |
okini3939 | 0:337524afec9b | 17 | |
okini3939 | 0:337524afec9b | 18 | // host to network short |
okini3939 | 0:337524afec9b | 19 | #define htons( x ) ( (( (x) << 8 ) & 0xFF00) | (( (x) >> 8 ) & 0x00FF) ) |
okini3939 | 0:337524afec9b | 20 | #define ntohs( x ) htons(x) |
okini3939 | 0:337524afec9b | 21 | // host to network long |
okini3939 | 0:337524afec9b | 22 | #define htonl( x ) ( (( (x) << 24 ) & 0xFF000000) \ |
okini3939 | 0:337524afec9b | 23 | | (( (x) << 8 ) & 0x00FF0000) \ |
okini3939 | 0:337524afec9b | 24 | | (( (x) >> 8 ) & 0x0000FF00) \ |
okini3939 | 0:337524afec9b | 25 | | (( (x) >> 24 ) & 0x000000FF) ) |
okini3939 | 0:337524afec9b | 26 | #define ntohl( x ) htonl(x) |
okini3939 | 0:337524afec9b | 27 | |
okini3939 | 0:337524afec9b | 28 | |
okini3939 | 0:337524afec9b | 29 | NECnfc::NECnfc (PinName p_tx, PinName p_rx, PinName p_reset) : rf(p_tx, p_rx), reset(p_reset) { |
okini3939 | 0:337524afec9b | 30 | rxbuf = (char *)&rxmsg; |
okini3939 | 0:337524afec9b | 31 | msgno = 0; |
okini3939 | 0:337524afec9b | 32 | rxlen = 0; |
okini3939 | 0:337524afec9b | 33 | rxmode = 0; |
okini3939 | 0:337524afec9b | 34 | rxflg = 0; |
okini3939 | 0:337524afec9b | 35 | } |
okini3939 | 0:337524afec9b | 36 | |
okini3939 | 0:337524afec9b | 37 | int NECnfc::begin (int ch, NECBAUD baud, NECUART uart, NECPWR power, NECTYPE type) { |
okini3939 | 0:337524afec9b | 38 | int no; |
okini3939 | 0:337524afec9b | 39 | struct ifMessage ifmsg; |
okini3939 | 0:337524afec9b | 40 | // high power, retry 0 |
okini3939 | 0:337524afec9b | 41 | char rfconf9[] = {power, ch, baud, 1, 0, uart, 1, 0xff, 0xff, |
okini3939 | 0:337524afec9b | 42 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
okini3939 | 0:337524afec9b | 43 | 0x00, 0x00, 0x83, 0x41}; |
okini3939 | 0:337524afec9b | 44 | char rfconf2[] = {ch, power, 0, 1, 2, 1, 0, 1, 0, 1, 2, 0xff, 0xff, |
okini3939 | 0:337524afec9b | 45 | 0, 0, 0, 1, 0, 0x00, 0x00, 0x83, 0x41}; |
okini3939 | 0:337524afec9b | 46 | |
okini3939 | 0:337524afec9b | 47 | rf.baud(38400); |
okini3939 | 0:337524afec9b | 48 | rf.attach(this, &NECnfc::isr_rx, Serial::RxIrq); |
okini3939 | 0:337524afec9b | 49 | |
okini3939 | 0:337524afec9b | 50 | reset = 0; // reset |
okini3939 | 0:337524afec9b | 51 | wait_ms(100); |
okini3939 | 0:337524afec9b | 52 | reset = 1; |
okini3939 | 0:337524afec9b | 53 | wait_ms(100); |
okini3939 | 0:337524afec9b | 54 | |
okini3939 | 0:337524afec9b | 55 | if (type == NECTYPE_950MHz) { |
okini3939 | 0:337524afec9b | 56 | no = send(NECMSG_WRITE_CONFIG, 0xffffffff, rfconf9, sizeof(rfconf9)); |
okini3939 | 0:337524afec9b | 57 | } else { |
okini3939 | 0:337524afec9b | 58 | return 0; |
okini3939 | 0:337524afec9b | 59 | rfconf2[1] = (power == NECPWR_HIGH ? 8 : 0); |
okini3939 | 0:337524afec9b | 60 | no = send(NECMSG_WRITE_CONFIG, 0xffffffff, rfconf2, sizeof(rfconf2)); |
okini3939 | 0:337524afec9b | 61 | } |
okini3939 | 0:337524afec9b | 62 | DBG("rfconf %d\r\n", no); |
okini3939 | 0:337524afec9b | 63 | if (! read(&ifmsg) || ifmsg.msgid != NECMSG_ACK || ifmsg.msgno != no) { |
okini3939 | 0:337524afec9b | 64 | return -1; |
okini3939 | 0:337524afec9b | 65 | } |
okini3939 | 0:337524afec9b | 66 | |
okini3939 | 0:337524afec9b | 67 | switch (uart) { |
okini3939 | 0:337524afec9b | 68 | case UART_4800: |
okini3939 | 0:337524afec9b | 69 | rf.baud(4800); |
okini3939 | 0:337524afec9b | 70 | break; |
okini3939 | 0:337524afec9b | 71 | case UART_9600: |
okini3939 | 0:337524afec9b | 72 | rf.baud(9600); |
okini3939 | 0:337524afec9b | 73 | break; |
okini3939 | 0:337524afec9b | 74 | case UART_19200: |
okini3939 | 0:337524afec9b | 75 | rf.baud(19200); |
okini3939 | 0:337524afec9b | 76 | break; |
okini3939 | 0:337524afec9b | 77 | case UART_38400: |
okini3939 | 0:337524afec9b | 78 | rf.baud(38400); |
okini3939 | 0:337524afec9b | 79 | break; |
okini3939 | 0:337524afec9b | 80 | case UART_56700: |
okini3939 | 0:337524afec9b | 81 | rf.baud(56700); |
okini3939 | 0:337524afec9b | 82 | break; |
okini3939 | 0:337524afec9b | 83 | case UART_115200: |
okini3939 | 0:337524afec9b | 84 | rf.baud(115200); |
okini3939 | 0:337524afec9b | 85 | break; |
okini3939 | 0:337524afec9b | 86 | } |
okini3939 | 0:337524afec9b | 87 | |
okini3939 | 0:337524afec9b | 88 | return 0; |
okini3939 | 0:337524afec9b | 89 | } |
okini3939 | 0:337524afec9b | 90 | |
okini3939 | 0:337524afec9b | 91 | void NECnfc::isr_rx () { |
okini3939 | 0:337524afec9b | 92 | char dat; |
okini3939 | 0:337524afec9b | 93 | |
okini3939 | 0:337524afec9b | 94 | dat = rf.getc(); |
okini3939 | 0:337524afec9b | 95 | DBG("%02x ", dat); |
okini3939 | 0:337524afec9b | 96 | |
okini3939 | 0:337524afec9b | 97 | if (dat == 0x0f) { |
okini3939 | 0:337524afec9b | 98 | // start (1/2) |
okini3939 | 0:337524afec9b | 99 | rxmode = 1; |
okini3939 | 0:337524afec9b | 100 | } else |
okini3939 | 0:337524afec9b | 101 | if (rxmode == 1) { |
okini3939 | 0:337524afec9b | 102 | if (dat == 0x5a) { |
okini3939 | 0:337524afec9b | 103 | // start (2/2) |
okini3939 | 0:337524afec9b | 104 | rxmode = 2; |
okini3939 | 0:337524afec9b | 105 | rxlen = 0; |
okini3939 | 0:337524afec9b | 106 | rxbuf[rxlen] = 0x0f; |
okini3939 | 0:337524afec9b | 107 | rxlen ++; |
okini3939 | 0:337524afec9b | 108 | rxbuf[rxlen] = dat; |
okini3939 | 0:337524afec9b | 109 | rxlen ++; |
okini3939 | 0:337524afec9b | 110 | } else { |
okini3939 | 0:337524afec9b | 111 | if (rxlen) { |
okini3939 | 0:337524afec9b | 112 | // continue (data) |
okini3939 | 0:337524afec9b | 113 | rxmode = 2; |
okini3939 | 0:337524afec9b | 114 | rxbuf[rxlen] = 0x0f; |
okini3939 | 0:337524afec9b | 115 | rxlen ++; |
okini3939 | 0:337524afec9b | 116 | rxbuf[rxlen] = dat; |
okini3939 | 0:337524afec9b | 117 | rxlen ++; |
okini3939 | 0:337524afec9b | 118 | } else { |
okini3939 | 0:337524afec9b | 119 | // unknown |
okini3939 | 0:337524afec9b | 120 | rxmode = 0; |
okini3939 | 0:337524afec9b | 121 | } |
okini3939 | 0:337524afec9b | 122 | } |
okini3939 | 0:337524afec9b | 123 | } else |
okini3939 | 0:337524afec9b | 124 | if (rxmode == 2) { |
okini3939 | 0:337524afec9b | 125 | // data |
okini3939 | 0:337524afec9b | 126 | rxbuf[rxlen] = dat; |
okini3939 | 0:337524afec9b | 127 | rxlen ++; |
okini3939 | 0:337524afec9b | 128 | if (rxlen >= rxmsg.length) { |
okini3939 | 0:337524afec9b | 129 | rxmode = 3; |
okini3939 | 0:337524afec9b | 130 | rxflg = 1; |
okini3939 | 0:337524afec9b | 131 | } |
okini3939 | 0:337524afec9b | 132 | } |
okini3939 | 0:337524afec9b | 133 | } |
okini3939 | 0:337524afec9b | 134 | |
okini3939 | 0:337524afec9b | 135 | int NECnfc::send (int msgid, unsigned long dest, char *param, int len) { |
okini3939 | 0:337524afec9b | 136 | int i; |
okini3939 | 0:337524afec9b | 137 | struct ifMessage ifmsg; |
okini3939 | 0:337524afec9b | 138 | unsigned char *buf = (unsigned char *)&ifmsg; |
okini3939 | 0:337524afec9b | 139 | |
okini3939 | 0:337524afec9b | 140 | if (len > 240) len = 240; |
okini3939 | 0:337524afec9b | 141 | msgno ++; |
okini3939 | 0:337524afec9b | 142 | ifmsg.start = htons(0x0f5a); |
okini3939 | 0:337524afec9b | 143 | ifmsg.length = 13 + len; |
okini3939 | 0:337524afec9b | 144 | ifmsg.msgid = msgid; |
okini3939 | 0:337524afec9b | 145 | ifmsg.msgno = msgno; |
okini3939 | 0:337524afec9b | 146 | ifmsg.dstid = htonl(dest); |
okini3939 | 0:337524afec9b | 147 | ifmsg.srcid = htonl(0xffffffff); |
okini3939 | 0:337524afec9b | 148 | memcpy(ifmsg.parameter, param, len); |
okini3939 | 0:337524afec9b | 149 | |
okini3939 | 0:337524afec9b | 150 | for (i = 0; i < ifmsg.length; i ++) { |
okini3939 | 0:337524afec9b | 151 | rf.putc(buf[i]); |
okini3939 | 0:337524afec9b | 152 | } |
okini3939 | 0:337524afec9b | 153 | |
okini3939 | 0:337524afec9b | 154 | return ifmsg.msgno; |
okini3939 | 0:337524afec9b | 155 | } |
okini3939 | 0:337524afec9b | 156 | |
okini3939 | 0:337524afec9b | 157 | int NECnfc::read (struct ifMessage *ifmsg, int timeout) { |
okini3939 | 0:337524afec9b | 158 | Timer timer; |
okini3939 | 0:337524afec9b | 159 | |
okini3939 | 0:337524afec9b | 160 | timer.start(); |
okini3939 | 0:337524afec9b | 161 | while (timer.read_ms() < timeout) { |
okini3939 | 0:337524afec9b | 162 | if (rxflg) { |
okini3939 | 0:337524afec9b | 163 | memcpy(ifmsg, &rxmsg, rxlen); |
okini3939 | 0:337524afec9b | 164 | rxflg = 0; |
okini3939 | 0:337524afec9b | 165 | rxmode = 0; |
okini3939 | 0:337524afec9b | 166 | return rxlen; |
okini3939 | 0:337524afec9b | 167 | } |
okini3939 | 0:337524afec9b | 168 | } |
okini3939 | 0:337524afec9b | 169 | return 0; |
okini3939 | 0:337524afec9b | 170 | } |
okini3939 | 0:337524afec9b | 171 | |
okini3939 | 0:337524afec9b | 172 | int NECnfc::readable () { |
okini3939 | 0:337524afec9b | 173 | return rxflg; |
okini3939 | 0:337524afec9b | 174 | } |