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:
Thu Apr 07 00:56:50 2016 +0000
Revision:
7:9c963cb53ef7
Parent:
4:07e752ff8dce
bug fix;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
okini3939 4:07e752ff8dce 1 #include "NECnfc.h"
okini3939 4:07e752ff8dce 2
okini3939 4:07e752ff8dce 3 int NECnfc::setRfConfig (enum NECPWR power, int ch, NECBAUD baud) {
okini3939 4:07e752ff8dce 4 char cmd[3];
okini3939 4:07e752ff8dce 5
okini3939 4:07e752ff8dce 6 switch (_type) {
okini3939 4:07e752ff8dce 7 case TYPE_2400MHz:
okini3939 4:07e752ff8dce 8 if (ch < 0 || ch > 15) return -1;
okini3939 4:07e752ff8dce 9 power = (enum NECPWR)(power >= PWR_HIGH ? 0x0f : 0x00);
okini3939 4:07e752ff8dce 10 case TYPE_950MHz:
okini3939 4:07e752ff8dce 11 if (power == PWR_LOW && (ch < 1 || ch > 33)) return -1;
okini3939 4:07e752ff8dce 12 if (power >= PWR_MID && (ch < 17 || ch > 31)) return -1;
okini3939 4:07e752ff8dce 13 break;
okini3939 4:07e752ff8dce 14 case TYPE_920MHz:
okini3939 4:07e752ff8dce 15 if (power <= PWR_MID && (ch < 24 || ch > 38)) return -1;
okini3939 4:07e752ff8dce 16 if (power >= PWR_HIGH && (ch < 24 || ch > 37 || ch == 32)) return -1;
okini3939 4:07e752ff8dce 17 break;
okini3939 4:07e752ff8dce 18 }
okini3939 4:07e752ff8dce 19
okini3939 4:07e752ff8dce 20 if (_type == TYPE_2400MHz) {
okini3939 4:07e752ff8dce 21 cmd[0] = ch;
okini3939 4:07e752ff8dce 22 if (send(NECMSG_WRITE_CHANNEL, NEC_DUMMYID, cmd, 1)) {
okini3939 4:07e752ff8dce 23 return -1;
okini3939 4:07e752ff8dce 24 }
okini3939 4:07e752ff8dce 25 cmd[0] = power;
okini3939 4:07e752ff8dce 26 if (send(NECMSG_WRITE_RFCONF, NEC_DUMMYID, cmd, 1)) {
okini3939 4:07e752ff8dce 27 return -1;
okini3939 4:07e752ff8dce 28 }
okini3939 4:07e752ff8dce 29 } else {
okini3939 4:07e752ff8dce 30 cmd[0] = power;
okini3939 4:07e752ff8dce 31 cmd[1] = ch;
okini3939 4:07e752ff8dce 32 cmd[2] = baud;
okini3939 4:07e752ff8dce 33 if (send(NECMSG_WRITE_RFCONF, NEC_DUMMYID, cmd, 3)) {
okini3939 4:07e752ff8dce 34 return -1;
okini3939 4:07e752ff8dce 35 }
okini3939 4:07e752ff8dce 36 }
okini3939 4:07e752ff8dce 37 return 0;
okini3939 4:07e752ff8dce 38 }
okini3939 4:07e752ff8dce 39
okini3939 4:07e752ff8dce 40 unsigned int NECnfc::getId () {
okini3939 4:07e752ff8dce 41
okini3939 4:07e752ff8dce 42 if (send(NECMSG_READ_DEFAULT, NEC_DUMMYID, NULL, 0)) {
okini3939 4:07e752ff8dce 43 return 0;
okini3939 4:07e752ff8dce 44 }
okini3939 4:07e752ff8dce 45 if (_type == TYPE_2400MHz) {
okini3939 4:07e752ff8dce 46 _id = (_rxmsg.parameter[23] << 24) | (_rxmsg.parameter[24] << 16) | (_rxmsg.parameter[25] << 8) | _rxmsg.parameter[26];
okini3939 4:07e752ff8dce 47 } else {
okini3939 4:07e752ff8dce 48 _id = (_rxmsg.parameter[21] << 24) | (_rxmsg.parameter[22] << 16) | (_rxmsg.parameter[23] << 8) | _rxmsg.parameter[24];
okini3939 4:07e752ff8dce 49 }
okini3939 4:07e752ff8dce 50 return _id;
okini3939 4:07e752ff8dce 51 }
okini3939 4:07e752ff8dce 52
okini3939 4:07e752ff8dce 53 unsigned int NECnfc::getSystemId () {
okini3939 4:07e752ff8dce 54 unsigned int id;
okini3939 4:07e752ff8dce 55
okini3939 4:07e752ff8dce 56 if (send(NECMSG_READ_DEFAULT, NEC_DUMMYID, NULL, 0)) {
okini3939 4:07e752ff8dce 57 return 0;
okini3939 4:07e752ff8dce 58 }
okini3939 4:07e752ff8dce 59
okini3939 4:07e752ff8dce 60 if (_type == TYPE_2400MHz) {
okini3939 4:07e752ff8dce 61 id = (_rxmsg.parameter[19] << 24) | (_rxmsg.parameter[20] << 16) | (_rxmsg.parameter[21] << 8) | _rxmsg.parameter[22];
okini3939 4:07e752ff8dce 62 } else {
okini3939 4:07e752ff8dce 63 id = (_rxmsg.parameter[17] << 24) | (_rxmsg.parameter[18] << 16) | (_rxmsg.parameter[19] << 8) | _rxmsg.parameter[20];
okini3939 4:07e752ff8dce 64 }
okini3939 4:07e752ff8dce 65 return id;
okini3939 4:07e752ff8dce 66 }
okini3939 4:07e752ff8dce 67
okini3939 4:07e752ff8dce 68 int NECnfc::setSystemId (unsigned int id) {
okini3939 4:07e752ff8dce 69 int len;
okini3939 4:07e752ff8dce 70 char buf[24];
okini3939 4:07e752ff8dce 71
okini3939 4:07e752ff8dce 72 if (send(NECMSG_READ_DEFAULT, NEC_DUMMYID, NULL, 0)) {
okini3939 4:07e752ff8dce 73 return 0;
okini3939 4:07e752ff8dce 74 }
okini3939 4:07e752ff8dce 75
okini3939 4:07e752ff8dce 76 if (_type == TYPE_2400MHz) {
okini3939 4:07e752ff8dce 77 len = 23;
okini3939 4:07e752ff8dce 78 memcpy(buf, _rxmsg.parameter, len);
okini3939 4:07e752ff8dce 79 buf[19] = (id >> 24) & 0xff;
okini3939 4:07e752ff8dce 80 buf[20] = (id >> 16) & 0xff;
okini3939 4:07e752ff8dce 81 buf[21] = (id >> 8) & 0xff;
okini3939 4:07e752ff8dce 82 buf[22] = id & 0xff;
okini3939 4:07e752ff8dce 83 } else {
okini3939 4:07e752ff8dce 84 len = 21;
okini3939 4:07e752ff8dce 85 memcpy(buf, _rxmsg.parameter, len);
okini3939 4:07e752ff8dce 86 buf[17] = (id >> 24) & 0xff;
okini3939 4:07e752ff8dce 87 buf[18] = (id >> 16) & 0xff;
okini3939 4:07e752ff8dce 88 buf[19] = (id >> 8) & 0xff;
okini3939 4:07e752ff8dce 89 buf[20] = id & 0xff;
okini3939 4:07e752ff8dce 90 }
okini3939 4:07e752ff8dce 91 if (send(NECMSG_WRITE_DEFAULT, NEC_DUMMYID, buf, len)) {
okini3939 4:07e752ff8dce 92 return -1;
okini3939 4:07e752ff8dce 93 }
okini3939 4:07e752ff8dce 94 return 0;
okini3939 4:07e752ff8dce 95 }
okini3939 4:07e752ff8dce 96
okini3939 4:07e752ff8dce 97 int NECnfc::setSleepMode (int sleep_time, int rev_time) {
okini3939 4:07e752ff8dce 98 int len;
okini3939 4:07e752ff8dce 99 char buf[24];
okini3939 4:07e752ff8dce 100
okini3939 4:07e752ff8dce 101 if (send(NECMSG_READ_CONFIG, NEC_DUMMYID, NULL, 0)) {
okini3939 4:07e752ff8dce 102 return 0;
okini3939 4:07e752ff8dce 103 }
okini3939 4:07e752ff8dce 104
okini3939 4:07e752ff8dce 105 if (_type == TYPE_2400MHz) {
okini3939 4:07e752ff8dce 106 len = 22;
okini3939 4:07e752ff8dce 107 memcpy(buf, _rxmsg.parameter, len);
okini3939 4:07e752ff8dce 108 buf[12] = (rev_time >> 8) & 0xff;
okini3939 4:07e752ff8dce 109 buf[13] = rev_time & 0xff;
okini3939 4:07e752ff8dce 110 buf[14] = sleep_time;
okini3939 4:07e752ff8dce 111 } else {
okini3939 4:07e752ff8dce 112 len = 21;
okini3939 4:07e752ff8dce 113 memcpy(buf, _rxmsg.parameter, len);
okini3939 4:07e752ff8dce 114 buf[6] = sleep_time;
okini3939 4:07e752ff8dce 115 buf[7] = (rev_time >> 8) & 0xff;
okini3939 4:07e752ff8dce 116 buf[8] = rev_time & 0xff;
okini3939 4:07e752ff8dce 117 }
okini3939 4:07e752ff8dce 118 if (send(NECMSG_WRITE_CONFIG, NEC_DUMMYID, buf, len)) {
okini3939 4:07e752ff8dce 119 return -1;
okini3939 4:07e752ff8dce 120 }
okini3939 4:07e752ff8dce 121 return 0;
okini3939 4:07e752ff8dce 122 }
okini3939 4:07e752ff8dce 123
okini3939 4:07e752ff8dce 124 int NECnfc::getRssi () {
okini3939 4:07e752ff8dce 125
okini3939 4:07e752ff8dce 126 if (send(NECMSG_READ_RSSI, NEC_DUMMYID, NULL, 0)) {
okini3939 4:07e752ff8dce 127 return 0;
okini3939 4:07e752ff8dce 128 }
okini3939 4:07e752ff8dce 129 return _rssi;
okini3939 4:07e752ff8dce 130 }
okini3939 4:07e752ff8dce 131
okini3939 4:07e752ff8dce 132 int NECnfc::search () {
okini3939 4:07e752ff8dce 133 char cmd[1] = {1};
okini3939 4:07e752ff8dce 134 Timer t;
okini3939 4:07e752ff8dce 135
okini3939 4:07e752ff8dce 136 DBG("search\r\n");
okini3939 4:07e752ff8dce 137 t.start();
okini3939 4:07e752ff8dce 138 if (send(NECMSG_SEARCH, NEC_DUMMYID, cmd, 1)) {
okini3939 4:07e752ff8dce 139 return -1;
okini3939 4:07e752ff8dce 140 }
okini3939 4:07e752ff8dce 141 for (;;) {
okini3939 4:07e752ff8dce 142 if (_ack && _rxmsg.msgid == NECMSG_ACK) {
okini3939 4:07e752ff8dce 143 DBG("found %08x", ntohl(_rxmsg.srcid));
okini3939 4:07e752ff8dce 144 _ack = 0;
okini3939 4:07e752ff8dce 145 }
okini3939 4:07e752ff8dce 146 if (_resend) break;
okini3939 4:07e752ff8dce 147 if (t.read() > NEC_TIMEOUT) {
okini3939 4:07e752ff8dce 148 DBG("timeout\r\n");
okini3939 4:07e752ff8dce 149 t.stop();
okini3939 4:07e752ff8dce 150 return -1;
okini3939 4:07e752ff8dce 151 }
okini3939 4:07e752ff8dce 152 }
okini3939 4:07e752ff8dce 153 t.stop();
okini3939 4:07e752ff8dce 154 DBG(" ack %d, noack %d, resend %d\r\n", _ack, _noack, _resend);
okini3939 4:07e752ff8dce 155 return 0;
okini3939 4:07e752ff8dce 156 }