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製の近距離無線モジュール用のライブラリです。

詳細はこちら

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?

UserRevisionLine numberNew 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 }