AKM Development Platform. This is the D7.014 version.

Dependencies:   AK09970 AK099XX AK7401 AK7451 AK8963X AK9750 AK9752 AkmSensor BLE_API I2CNano MCP342x SerialNano SpiNano TCA9554A mbed nRF51822

Fork of AKDP by Masahiko Fukasawa

Committer:
masahikofukasawa
Date:
Wed Sep 28 21:53:16 2016 +0000
Revision:
21:f8f44ad15d13
Parent:
20:15fb57ad4f70
Child:
23:9a404e36feaf
Rev010, debugged for USB COM problem.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
masahikofukasawa 0:c240899240e7 1 #include <stdio.h>
masahikofukasawa 0:c240899240e7 2 #include <stdlib.h>
masahikofukasawa 0:c240899240e7 3 #include "mbed.h"
masahikofukasawa 0:c240899240e7 4 #include "ble/BLE.h"
masahikofukasawa 0:c240899240e7 5 #include "ble/services/UARTService.h"
masahikofukasawa 0:c240899240e7 6 #include "SerialNano.h"
masahikofukasawa 12:522a22a23f8a 7 #include "akmsensor.h"
masahikofukasawa 0:c240899240e7 8 #include "akmsensormanager.h"
masahikofukasawa 0:c240899240e7 9 #include "debug.h"
coisme 2:11a5873f8ec0 10 #include "tca9554a.h"
masahikofukasawa 19:7a6913400380 11 #include "akmakd.h"
masahikofukasawa 0:c240899240e7 12
masahikofukasawa 0:c240899240e7 13 #define BLE_UUID_TXRX_SERVICE 0x0000 /**< The UUID of the Nordic UART Service. */
masahikofukasawa 0:c240899240e7 14 #define BLE_UUID_TX_CHARACTERISTIC 0x0002 /**< The UUID of the TX Characteristic. */
masahikofukasawa 0:c240899240e7 15 #define BLE_UUIDS_RX_CHARACTERISTIC 0x0003 /**< The UUID of the RX Characteristic. */
masahikofukasawa 0:c240899240e7 16
masahikofukasawa 10:a710e8c3311c 17 #define BLE_BUF_LEN UARTService::BLE_UART_SERVICE_MAX_DATA_LEN+1
masahikofukasawa 10:a710e8c3311c 18 #define TXRX_LEN 50
masahikofukasawa 0:c240899240e7 19
masahikofukasawa 0:c240899240e7 20 #define CR '\r'
masahikofukasawa 0:c240899240e7 21 #define LF '\n'
masahikofukasawa 0:c240899240e7 22
masahikofukasawa 21:f8f44ad15d13 23 #define DEVICE_NAME "AKDP D7.010 "
masahikofukasawa 11:53e52f5f1051 24
masahikofukasawa 0:c240899240e7 25 BLE ble;
masahikofukasawa 0:c240899240e7 26 UARTService* uartService;
coisme 2:11a5873f8ec0 27 #ifndef REV_D
coisme 2:11a5873f8ec0 28 SerialNano serial(P0_28, P0_29); // Rev.C pin configuration
coisme 2:11a5873f8ec0 29 #else
masahikofukasawa 7:f1f544deaaa3 30 SerialNano serial(P0_4, P0_5); // Rev.D pin configuration
masahikofukasawa 7:f1f544deaaa3 31 #endif
masahikofukasawa 4:749a21fd9c2d 32
masahikofukasawa 0:c240899240e7 33 AkmSensorManager* manager;
masahikofukasawa 12:522a22a23f8a 34 uint8_t id;
masahikofukasawa 12:522a22a23f8a 35 uint8_t subId;
masahikofukasawa 0:c240899240e7 36
masahikofukasawa 18:d75838bceaaf 37 enum {
masahikofukasawa 18:d75838bceaaf 38 UNIT_0_625_MS = 625,
masahikofukasawa 18:d75838bceaaf 39 UNIT_1_25_MS = 1250,
masahikofukasawa 18:d75838bceaaf 40 UNIT_10_MS = 10000
masahikofukasawa 18:d75838bceaaf 41 };
masahikofukasawa 18:d75838bceaaf 42
masahikofukasawa 19:7a6913400380 43 // default setting of Nexus 5X, Motorola Droid Turbo:
masahikofukasawa 19:7a6913400380 44 //#define MIN_CONN_INTERVAL MSEC_TO_UNITS(45, UNIT_1_25_MS) /**< Minimum connection interval (45 ms) */
masahikofukasawa 19:7a6913400380 45 //#define MAX_CONN_INTERVAL MSEC_TO_UNITS(45, UNIT_1_25_MS) /**< Maximum connection interval (45 ms). */
masahikofukasawa 19:7a6913400380 46 //#define SLAVE_LATENCY 0 /**< Slave latency. */
masahikofukasawa 19:7a6913400380 47 //#define CONN_SUP_TIMEOUT MSEC_TO_UNITS(20000, UNIT_10_MS) /**< Connection supervisory timeout (20 seconds). */
masahikofukasawa 19:7a6913400380 48
masahikofukasawa 19:7a6913400380 49 /*
masahikofukasawa 19:7a6913400380 50 iOS requirement:
masahikofukasawa 19:7a6913400380 51 Interval Max * (Slave Latency + 1) ≤ 2 seconds
masahikofukasawa 19:7a6913400380 52 Interval Min ≥ 20 ms
masahikofukasawa 19:7a6913400380 53 Interval Min + 20 ms ≤ Interval Max Slave Latency ≤ 4
masahikofukasawa 19:7a6913400380 54 connSupervisionTimeout ≤ 6 seconds
masahikofukasawa 19:7a6913400380 55 Interval Max * (Slave Latency + 1) * 3 < connSupervisionTimeout
masahikofukasawa 19:7a6913400380 56 */
masahikofukasawa 19:7a6913400380 57
masahikofukasawa 18:d75838bceaaf 58 #define MSEC_TO_UNITS(TIME, RESOLUTION) (((TIME) * 1000) / (RESOLUTION))
masahikofukasawa 18:d75838bceaaf 59 #define MIN_CONN_INTERVAL MSEC_TO_UNITS(7.5, UNIT_1_25_MS) /**< Minimum connection interval (7.5 ms) */
masahikofukasawa 18:d75838bceaaf 60 #define MAX_CONN_INTERVAL MSEC_TO_UNITS(30, UNIT_1_25_MS) /**< Maximum connection interval (30 ms). */
masahikofukasawa 18:d75838bceaaf 61 #define SLAVE_LATENCY 0 /**< Slave latency. */
masahikofukasawa 19:7a6913400380 62 #define CONN_SUP_TIMEOUT MSEC_TO_UNITS(4000, UNIT_10_MS) /**< Connection supervisory timeout (4 seconds). */
masahikofukasawa 18:d75838bceaaf 63
masahikofukasawa 21:f8f44ad15d13 64 // Command received from BLE
masahikofukasawa 0:c240899240e7 65 void WrittenHandler(const GattWriteCallbackParams *Handler)
masahikofukasawa 0:c240899240e7 66 {
masahikofukasawa 10:a710e8c3311c 67 static char command[TXRX_LEN]="";
masahikofukasawa 10:a710e8c3311c 68 static uint16_t len=0;
masahikofukasawa 10:a710e8c3311c 69
masahikofukasawa 10:a710e8c3311c 70 uint8_t buf[BLE_BUF_LEN];
masahikofukasawa 0:c240899240e7 71 uint16_t bytesRead;
masahikofukasawa 10:a710e8c3311c 72
masahikofukasawa 0:c240899240e7 73 if (Handler->handle == uartService->getTXCharacteristicHandle())
masahikofukasawa 0:c240899240e7 74 {
masahikofukasawa 0:c240899240e7 75 ble.gattServer().read(uartService->getTXCharacteristicHandle(), buf, &bytesRead);
masahikofukasawa 10:a710e8c3311c 76
masahikofukasawa 10:a710e8c3311c 77 for(uint16_t i=0; i<bytesRead; i++){
masahikofukasawa 10:a710e8c3311c 78 if(buf[i] == CR)
masahikofukasawa 10:a710e8c3311c 79 {
masahikofukasawa 10:a710e8c3311c 80 ; // ignore CR
masahikofukasawa 10:a710e8c3311c 81 }
masahikofukasawa 10:a710e8c3311c 82 else if(buf[i] == LF || len > TXRX_LEN)
masahikofukasawa 0:c240899240e7 83 {
masahikofukasawa 10:a710e8c3311c 84 manager->commandReceived(command);
masahikofukasawa 10:a710e8c3311c 85 for(int j=0; j<TXRX_LEN; j++){
masahikofukasawa 10:a710e8c3311c 86 command[j] = 0;
masahikofukasawa 10:a710e8c3311c 87 }
masahikofukasawa 10:a710e8c3311c 88 len = 0;
masahikofukasawa 10:a710e8c3311c 89 }
masahikofukasawa 10:a710e8c3311c 90 else
masahikofukasawa 10:a710e8c3311c 91 {
masahikofukasawa 10:a710e8c3311c 92 command[len++] = (char)buf[i];
masahikofukasawa 0:c240899240e7 93 }
masahikofukasawa 0:c240899240e7 94 }
masahikofukasawa 0:c240899240e7 95 }
masahikofukasawa 0:c240899240e7 96 }
masahikofukasawa 0:c240899240e7 97
masahikofukasawa 21:f8f44ad15d13 98
masahikofukasawa 21:f8f44ad15d13 99 // Command received from USB
masahikofukasawa 18:d75838bceaaf 100 static void usbUartCallback(void)
masahikofukasawa 0:c240899240e7 101 {
masahikofukasawa 10:a710e8c3311c 102 static char command[TXRX_LEN] = "";
masahikofukasawa 10:a710e8c3311c 103 static uint16_t len=0;
masahikofukasawa 10:a710e8c3311c 104
masahikofukasawa 0:c240899240e7 105 if(serial.readable())
masahikofukasawa 0:c240899240e7 106 {
masahikofukasawa 0:c240899240e7 107 uint8_t c = serial.getc();
masahikofukasawa 21:f8f44ad15d13 108
masahikofukasawa 0:c240899240e7 109 // ignore CR
masahikofukasawa 21:f8f44ad15d13 110 if(c != CR)
masahikofukasawa 0:c240899240e7 111 {
masahikofukasawa 21:f8f44ad15d13 112 command[len++] = c;
masahikofukasawa 21:f8f44ad15d13 113 if(len>=TXRX_LEN || c == LF)
masahikofukasawa 21:f8f44ad15d13 114 {
masahikofukasawa 21:f8f44ad15d13 115 manager->commandReceived(command);
masahikofukasawa 21:f8f44ad15d13 116 for(int j=0; j<TXRX_LEN; j++){
masahikofukasawa 21:f8f44ad15d13 117 command[j] = 0;
masahikofukasawa 21:f8f44ad15d13 118 }
masahikofukasawa 21:f8f44ad15d13 119 len = 0;
masahikofukasawa 10:a710e8c3311c 120 }
masahikofukasawa 21:f8f44ad15d13 121 }
masahikofukasawa 0:c240899240e7 122 }
masahikofukasawa 0:c240899240e7 123 }
masahikofukasawa 0:c240899240e7 124
masahikofukasawa 18:d75838bceaaf 125 static void connectionCallback(const Gap::ConnectionCallbackParams_t *params)
masahikofukasawa 0:c240899240e7 126 {
masahikofukasawa 19:7a6913400380 127 MSG("#From central: minConnectionInterval = %d\r\n", params->connectionParams->minConnectionInterval);
masahikofukasawa 19:7a6913400380 128 MSG("#From central: maxConnectionInterval = %d\r\n", params->connectionParams->maxConnectionInterval);
masahikofukasawa 19:7a6913400380 129 MSG("#From central: slaveLatency = %d\r\n", params->connectionParams->slaveLatency);
masahikofukasawa 19:7a6913400380 130 MSG("#From central: connectionSupervisionTimeout = %d\r\n", params->connectionParams->connectionSupervisionTimeout);
masahikofukasawa 19:7a6913400380 131
masahikofukasawa 18:d75838bceaaf 132 Gap::Handle_t gap_handle = params->handle;
masahikofukasawa 18:d75838bceaaf 133 Gap::ConnectionParams_t gap_conn_params;
masahikofukasawa 19:7a6913400380 134 gap_conn_params.minConnectionInterval = params->connectionParams->minConnectionInterval;
masahikofukasawa 19:7a6913400380 135 gap_conn_params.maxConnectionInterval = params->connectionParams->maxConnectionInterval;
masahikofukasawa 19:7a6913400380 136 gap_conn_params.slaveLatency = params->connectionParams->slaveLatency;
masahikofukasawa 18:d75838bceaaf 137 gap_conn_params.connectionSupervisionTimeout = CONN_SUP_TIMEOUT;
masahikofukasawa 18:d75838bceaaf 138 ble.updateConnectionParams(gap_handle, &gap_conn_params);
masahikofukasawa 18:d75838bceaaf 139
masahikofukasawa 19:7a6913400380 140 MSG("#From peripheral: minConnectionInterval = %d\r\n", gap_conn_params.minConnectionInterval);
masahikofukasawa 19:7a6913400380 141 MSG("#From peripheral: maxConnectionInterval = %d\r\n", gap_conn_params.maxConnectionInterval);
masahikofukasawa 19:7a6913400380 142 MSG("#From peripheral: slaveLatency = %d\r\n", gap_conn_params.slaveLatency);
masahikofukasawa 19:7a6913400380 143 MSG("#From peripheral: connectionSupervisionTimeout = %d\r\n", gap_conn_params.connectionSupervisionTimeout);
masahikofukasawa 19:7a6913400380 144
masahikofukasawa 0:c240899240e7 145 manager->setEventConnected();
masahikofukasawa 14:76205d28fea2 146 MSG("#Connected\r\n");
masahikofukasawa 0:c240899240e7 147 }
masahikofukasawa 0:c240899240e7 148
masahikofukasawa 18:d75838bceaaf 149 static void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params)
masahikofukasawa 0:c240899240e7 150 {
masahikofukasawa 0:c240899240e7 151 manager->setEventDisconnected();
masahikofukasawa 14:76205d28fea2 152 MSG("#Disconnected\r\n");
masahikofukasawa 0:c240899240e7 153 ble.gap().startAdvertising();
masahikofukasawa 0:c240899240e7 154 }
masahikofukasawa 0:c240899240e7 155
masahikofukasawa 19:7a6913400380 156 void bleSetup(char* device_name){
masahikofukasawa 0:c240899240e7 157 ble.init();
masahikofukasawa 18:d75838bceaaf 158
masahikofukasawa 0:c240899240e7 159 // setup advertising
masahikofukasawa 0:c240899240e7 160 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED);
masahikofukasawa 0:c240899240e7 161 ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
masahikofukasawa 0:c240899240e7 162 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::SHORTENED_LOCAL_NAME,
masahikofukasawa 19:7a6913400380 163 (const uint8_t *)device_name, strlen(device_name));
masahikofukasawa 19:7a6913400380 164 // (const uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME) - 1);
masahikofukasawa 0:c240899240e7 165 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS,
masahikofukasawa 0:c240899240e7 166 (const uint8_t *)UARTServiceUUID_reversed, sizeof(UARTServiceUUID_reversed));
masahikofukasawa 19:7a6913400380 167
masahikofukasawa 18:d75838bceaaf 168
masahikofukasawa 18:d75838bceaaf 169 // Set desired connection parameters
masahikofukasawa 18:d75838bceaaf 170 Gap::ConnectionParams_t gap_conn_params;
masahikofukasawa 18:d75838bceaaf 171 gap_conn_params.minConnectionInterval = MIN_CONN_INTERVAL;
masahikofukasawa 18:d75838bceaaf 172 gap_conn_params.maxConnectionInterval = MAX_CONN_INTERVAL;
masahikofukasawa 18:d75838bceaaf 173 gap_conn_params.slaveLatency = SLAVE_LATENCY;
masahikofukasawa 18:d75838bceaaf 174 gap_conn_params.connectionSupervisionTimeout = CONN_SUP_TIMEOUT;
masahikofukasawa 18:d75838bceaaf 175 ble.setPreferredConnectionParams(&gap_conn_params);
masahikofukasawa 18:d75838bceaaf 176
masahikofukasawa 18:d75838bceaaf 177 ble.gap().onDisconnection(disconnectionCallback);
masahikofukasawa 0:c240899240e7 178 ble.gap().onConnection(connectionCallback);
masahikofukasawa 0:c240899240e7 179 ble.gattServer().onDataWritten(WrittenHandler);
masahikofukasawa 0:c240899240e7 180
masahikofukasawa 12:522a22a23f8a 181 // 100ms; in multiples of 0.625ms.
masahikofukasawa 18:d75838bceaaf 182 ble.gap().setAdvertisingInterval(160);
masahikofukasawa 0:c240899240e7 183 ble.gap().startAdvertising();
masahikofukasawa 12:522a22a23f8a 184 }
masahikofukasawa 0:c240899240e7 185
masahikofukasawa 12:522a22a23f8a 186
masahikofukasawa 12:522a22a23f8a 187 #ifdef REV_D
masahikofukasawa 12:522a22a23f8a 188 int16_t getAdcData(MCP342X *mcp3428, MCP342X::AdcChannel ch, MCP342X::SampleSetting s) {
masahikofukasawa 12:522a22a23f8a 189 const int WAIT_ADC_MS = 1;
masahikofukasawa 12:522a22a23f8a 190
masahikofukasawa 12:522a22a23f8a 191 // Configure channel and trigger.
masahikofukasawa 12:522a22a23f8a 192 mcp3428->setChannel(ch);
masahikofukasawa 12:522a22a23f8a 193 mcp3428->setSampleSetting(s);
masahikofukasawa 12:522a22a23f8a 194 mcp3428->trigger();
masahikofukasawa 12:522a22a23f8a 195
masahikofukasawa 12:522a22a23f8a 196 // polling data (!blocking)
masahikofukasawa 12:522a22a23f8a 197 MCP342X::Data data;
masahikofukasawa 12:522a22a23f8a 198 do {
masahikofukasawa 12:522a22a23f8a 199 wait_ms(WAIT_ADC_MS);
masahikofukasawa 12:522a22a23f8a 200 mcp3428->getData(&data);
masahikofukasawa 12:522a22a23f8a 201 } while(data.st == MCP342X::DATA_NOT_UPDATED);
masahikofukasawa 12:522a22a23f8a 202
masahikofukasawa 12:522a22a23f8a 203 return data.value;
masahikofukasawa 12:522a22a23f8a 204 }
masahikofukasawa 12:522a22a23f8a 205 #endif
masahikofukasawa 12:522a22a23f8a 206
masahikofukasawa 12:522a22a23f8a 207 uint8_t getId(PinName pin, uint8_t bits)
masahikofukasawa 12:522a22a23f8a 208 {
masahikofukasawa 12:522a22a23f8a 209 #ifndef REV_D
masahikofukasawa 12:522a22a23f8a 210 /* Rev.C */
masahikofukasawa 12:522a22a23f8a 211 AnalogIn id(pin);
masahikofukasawa 14:76205d28fea2 212 // MSG("#Voltage=%5.2f[V]\r\n",id*3.0);
masahikofukasawa 12:522a22a23f8a 213 double s = id + 1.0/(double)(pow(2.0,bits+1));
masahikofukasawa 12:522a22a23f8a 214 uint8_t value = (uint8_t)(s*pow(2.0,bits));
masahikofukasawa 12:522a22a23f8a 215 #else
masahikofukasawa 12:522a22a23f8a 216 /* Rev.D */
masahikofukasawa 14:76205d28fea2 217 // MSG("#GetID\r\n");
masahikofukasawa 12:522a22a23f8a 218
masahikofukasawa 12:522a22a23f8a 219 I2C i2c(I2C_SDA, I2C_SCL);
masahikofukasawa 12:522a22a23f8a 220 // ADC
masahikofukasawa 12:522a22a23f8a 221 MCP342X mcp342x(&i2c, MCP342X::SLAVE_ADDRESS_6EH);
masahikofukasawa 12:522a22a23f8a 222 mcp342x.setConversionMode(MCP342X::ONE_SHOT);
masahikofukasawa 12:522a22a23f8a 223 MCP342X::AdcChannel ch;
masahikofukasawa 12:522a22a23f8a 224 if (pin == ANALOG_SENSOR_ID) {
masahikofukasawa 12:522a22a23f8a 225 ch = MCP342X::ADC_CH1;
masahikofukasawa 12:522a22a23f8a 226 } else { // pin == ANALOG_SENSOR_ID_SUB
masahikofukasawa 12:522a22a23f8a 227 ch = MCP342X::ADC_CH2;
masahikofukasawa 12:522a22a23f8a 228 }
masahikofukasawa 12:522a22a23f8a 229 int16_t val = getAdcData(&mcp342x, ch, MCP342X::SAMPLE_240HZ_12BIT);
masahikofukasawa 14:76205d28fea2 230 // MSG("#12bit ADC Val = %d.\r\n", val);
masahikofukasawa 12:522a22a23f8a 231
masahikofukasawa 12:522a22a23f8a 232 const int16_t VAL_MAX = 3000-2048; // Corresponds to 3V
masahikofukasawa 12:522a22a23f8a 233 const int16_t VAL_MIN = -2048; // Corresponds to 0V
masahikofukasawa 12:522a22a23f8a 234
masahikofukasawa 12:522a22a23f8a 235 uint8_t value = (uint8_t)((val - VAL_MIN)/(float)(VAL_MAX - VAL_MIN) * (1 << bits) + 0.5);
masahikofukasawa 14:76205d28fea2 236 // MSG("#ID = %d.\r\n", value);
masahikofukasawa 12:522a22a23f8a 237
masahikofukasawa 12:522a22a23f8a 238 #endif
masahikofukasawa 12:522a22a23f8a 239 return value;
masahikofukasawa 12:522a22a23f8a 240 }
masahikofukasawa 12:522a22a23f8a 241
masahikofukasawa 12:522a22a23f8a 242
masahikofukasawa 12:522a22a23f8a 243 void releaseTWI(){
masahikofukasawa 12:522a22a23f8a 244 NRF_TWI0->ENABLE = TWI_ENABLE_ENABLE_Disabled << TWI_ENABLE_ENABLE_Pos;
masahikofukasawa 12:522a22a23f8a 245 NRF_TWI0->POWER = 0;
masahikofukasawa 12:522a22a23f8a 246 NRF_TWI1->ENABLE = TWI_ENABLE_ENABLE_Disabled << TWI_ENABLE_ENABLE_Pos;
masahikofukasawa 12:522a22a23f8a 247 NRF_TWI1->POWER = 0;
masahikofukasawa 12:522a22a23f8a 248 }
masahikofukasawa 12:522a22a23f8a 249
masahikofukasawa 14:76205d28fea2 250 bool initAkdpBoard(){
masahikofukasawa 17:a22b52136eb8 251 MSG("#Init AKDP board.\r\n");
masahikofukasawa 17:a22b52136eb8 252 const int TIME_FOR_OE_MS = 100;
masahikofukasawa 17:a22b52136eb8 253
masahikofukasawa 14:76205d28fea2 254 // CSN High to activate I2C_GATE
masahikofukasawa 12:522a22a23f8a 255 DigitalOut _cs = DigitalOut(SPI_CS);
masahikofukasawa 12:522a22a23f8a 256 _cs.write(1);
masahikofukasawa 18:d75838bceaaf 257
masahikofukasawa 18:d75838bceaaf 258 // I2C communication ports to HIGH(just in case).
masahikofukasawa 17:a22b52136eb8 259 DigitalOut _scl = DigitalOut(I2C_SCL);
masahikofukasawa 17:a22b52136eb8 260 _scl.write(1);
masahikofukasawa 17:a22b52136eb8 261 DigitalOut _sda = DigitalOut(I2C_SDA);
masahikofukasawa 17:a22b52136eb8 262 _sda.write(1);
masahikofukasawa 17:a22b52136eb8 263 MSG("#SCL,SDA port high.\r\n");
masahikofukasawa 17:a22b52136eb8 264 wait_ms(TIME_FOR_OE_MS);
masahikofukasawa 17:a22b52136eb8 265
masahikofukasawa 12:522a22a23f8a 266 const TCA9554A::Port PORT_OE_LVS1 = TCA9554A::PORT_7;
masahikofukasawa 12:522a22a23f8a 267 const TCA9554A::Port PORT_OE_LVS2 = TCA9554A::PORT_6;
masahikofukasawa 12:522a22a23f8a 268 const TCA9554A::Port PORT_SPIN = TCA9554A::PORT_5;
masahikofukasawa 12:522a22a23f8a 269 const TCA9554A::Port PORT_RSV_RSTN = TCA9554A::PORT_0;
masahikofukasawa 12:522a22a23f8a 270
masahikofukasawa 12:522a22a23f8a 271 I2C i2c(I2C_SDA, I2C_SCL);
masahikofukasawa 17:a22b52136eb8 272
masahikofukasawa 17:a22b52136eb8 273 // call I2C general reset only once
masahikofukasawa 17:a22b52136eb8 274 char cmd[] = {0x06}; // general reset code
masahikofukasawa 17:a22b52136eb8 275 i2c.write(0x00, cmd, 1);
masahikofukasawa 17:a22b52136eb8 276 MSG("#General Reset.\r\n");
masahikofukasawa 17:a22b52136eb8 277 wait_ms(TIME_FOR_OE_MS);
masahikofukasawa 17:a22b52136eb8 278
masahikofukasawa 12:522a22a23f8a 279 TCA9554A tca9554a(&i2c, TCA9554A::SLAVE_ADDRESS_38H);
masahikofukasawa 12:522a22a23f8a 280
masahikofukasawa 12:522a22a23f8a 281 // Initializes TCA9554A (I2C GPIO Expander)
masahikofukasawa 12:522a22a23f8a 282 tca9554a.configurePort(PORT_OE_LVS1, TCA9554A::DIR_OUTPUT);
masahikofukasawa 12:522a22a23f8a 283 tca9554a.configurePort(PORT_OE_LVS2, TCA9554A::DIR_OUTPUT);
masahikofukasawa 12:522a22a23f8a 284 tca9554a.configurePort(PORT_SPIN, TCA9554A::DIR_OUTPUT);
masahikofukasawa 12:522a22a23f8a 285 tca9554a.configurePort(PORT_RSV_RSTN, TCA9554A::DIR_OUTPUT);
masahikofukasawa 12:522a22a23f8a 286
masahikofukasawa 18:d75838bceaaf 287 // enable LVS1 and LVS2 level shifter
masahikofukasawa 12:522a22a23f8a 288 tca9554a.setPortLevel(PORT_OE_LVS1, TCA9554A::HIGH);
masahikofukasawa 12:522a22a23f8a 289 tca9554a.setPortLevel(PORT_OE_LVS2, TCA9554A::HIGH);
masahikofukasawa 12:522a22a23f8a 290 tca9554a.setPortLevel(PORT_RSV_RSTN, TCA9554A::HIGH);
masahikofukasawa 12:522a22a23f8a 291 tca9554a.setPortLevel(PORT_SPIN, TCA9554A::HIGH);
masahikofukasawa 14:76205d28fea2 292 wait_ms(TIME_FOR_OE_MS);
masahikofukasawa 12:522a22a23f8a 293
masahikofukasawa 18:d75838bceaaf 294 // reset LVS2
masahikofukasawa 18:d75838bceaaf 295 tca9554a.setPortLevel(PORT_OE_LVS2, TCA9554A::LOW);
masahikofukasawa 18:d75838bceaaf 296 wait_ms(TIME_FOR_OE_MS);
masahikofukasawa 18:d75838bceaaf 297 tca9554a.setPortLevel(PORT_OE_LVS2, TCA9554A::HIGH);
masahikofukasawa 12:522a22a23f8a 298 wait_ms(TIME_FOR_OE_MS);
masahikofukasawa 16:5343a852fea4 299
masahikofukasawa 18:d75838bceaaf 300 // reset LVS1
masahikofukasawa 18:d75838bceaaf 301 tca9554a.setPortLevel(PORT_OE_LVS1, TCA9554A::LOW);
masahikofukasawa 18:d75838bceaaf 302 wait_ms(TIME_FOR_OE_MS);
masahikofukasawa 16:5343a852fea4 303 tca9554a.setPortLevel(PORT_OE_LVS1, TCA9554A::HIGH);
masahikofukasawa 16:5343a852fea4 304 wait_ms(TIME_FOR_OE_MS);
masahikofukasawa 16:5343a852fea4 305
masahikofukasawa 18:d75838bceaaf 306 // disable LVS1 level shifter to read ID
masahikofukasawa 16:5343a852fea4 307 tca9554a.setPortLevel(PORT_OE_LVS1, TCA9554A::LOW);
masahikofukasawa 16:5343a852fea4 308 wait_ms(TIME_FOR_OE_MS);
masahikofukasawa 12:522a22a23f8a 309
masahikofukasawa 12:522a22a23f8a 310 // read ID and subId from ADC
masahikofukasawa 12:522a22a23f8a 311 id = getId(ANALOG_SENSOR_ID,4);
masahikofukasawa 12:522a22a23f8a 312 uint8_t subid_bitlen = 4;
masahikofukasawa 12:522a22a23f8a 313 if(id == AkmSensor::AKM_PRIMARY_ID_AKD_SPI || id == AkmSensor::AKM_PRIMARY_ID_AKD_I2C){
masahikofukasawa 14:76205d28fea2 314 // MSG("#5 bit sub ID.\r\n");
masahikofukasawa 12:522a22a23f8a 315 subid_bitlen = 5;
masahikofukasawa 12:522a22a23f8a 316 }
masahikofukasawa 12:522a22a23f8a 317 subId = getId(ANALOG_SENSOR_ID_SUB,subid_bitlen);
masahikofukasawa 12:522a22a23f8a 318
masahikofukasawa 14:76205d28fea2 319 if( (id == 11 && subId == 11) || (id == 55 && subId == 55) ){
masahikofukasawa 14:76205d28fea2 320 return true;
masahikofukasawa 14:76205d28fea2 321 }
masahikofukasawa 14:76205d28fea2 322
masahikofukasawa 12:522a22a23f8a 323 // enable 1.8V level shifter
masahikofukasawa 12:522a22a23f8a 324 tca9554a.setPortLevel(PORT_OE_LVS1, TCA9554A::HIGH);
masahikofukasawa 17:a22b52136eb8 325 MSG("#LVS1 High.\r\n");
masahikofukasawa 12:522a22a23f8a 326 wait_ms(TIME_FOR_OE_MS);
masahikofukasawa 12:522a22a23f8a 327
masahikofukasawa 12:522a22a23f8a 328 // RSTN control
masahikofukasawa 12:522a22a23f8a 329 if(id == AkmSensor::AKM_PRIMARY_ID_AKD_SPI || id == AkmSensor::AKM_PRIMARY_ID_AKD_I2C){
masahikofukasawa 12:522a22a23f8a 330 tca9554a.setPortLevel(PORT_RSV_RSTN, TCA9554A::LOW);
masahikofukasawa 12:522a22a23f8a 331 wait_ms(TIME_FOR_OE_MS);
masahikofukasawa 12:522a22a23f8a 332 tca9554a.setPortLevel(PORT_RSV_RSTN, TCA9554A::HIGH);
masahikofukasawa 14:76205d28fea2 333 // MSG("#Detect AKD, RSTN control.\r\n");
masahikofukasawa 12:522a22a23f8a 334 }
masahikofukasawa 12:522a22a23f8a 335
masahikofukasawa 12:522a22a23f8a 336 // SPI disable/enable
masahikofukasawa 12:522a22a23f8a 337 if( id == AkmSensor::AKM_PRIMARY_ID_AKD_SPI || id == AkmSensor::AKM_PRIMARY_ID_ANGLE_SENSOR ){
masahikofukasawa 12:522a22a23f8a 338 tca9554a.setPortLevel(PORT_SPIN, TCA9554A::LOW);
masahikofukasawa 12:522a22a23f8a 339 // Disable 5.0V level shifter in order to ADC doesn't respond.
masahikofukasawa 12:522a22a23f8a 340 tca9554a.setPortLevel(PORT_OE_LVS2, TCA9554A::LOW);
masahikofukasawa 14:76205d28fea2 341 // MSG("#Detect SPI, set SPIN low.\r\n");
masahikofukasawa 12:522a22a23f8a 342 }
masahikofukasawa 12:522a22a23f8a 343 else{
masahikofukasawa 12:522a22a23f8a 344 tca9554a.setPortLevel(PORT_SPIN, TCA9554A::HIGH);
masahikofukasawa 12:522a22a23f8a 345 tca9554a.setPortLevel(PORT_OE_LVS2, TCA9554A::HIGH);
masahikofukasawa 12:522a22a23f8a 346 }
masahikofukasawa 12:522a22a23f8a 347
masahikofukasawa 12:522a22a23f8a 348 wait_ms(TIME_FOR_OE_MS);
masahikofukasawa 12:522a22a23f8a 349
masahikofukasawa 12:522a22a23f8a 350 releaseTWI();
masahikofukasawa 14:76205d28fea2 351
masahikofukasawa 14:76205d28fea2 352 return false;
masahikofukasawa 12:522a22a23f8a 353 }
masahikofukasawa 12:522a22a23f8a 354
masahikofukasawa 12:522a22a23f8a 355
masahikofukasawa 19:7a6913400380 356 char* my_strcat(char* str1, char* str2)
masahikofukasawa 19:7a6913400380 357 {
masahikofukasawa 19:7a6913400380 358 int num1;
masahikofukasawa 19:7a6913400380 359 char* str;
masahikofukasawa 19:7a6913400380 360
masahikofukasawa 19:7a6913400380 361 num1=strlen(str1) + strlen(str2);
masahikofukasawa 19:7a6913400380 362 str = (char *)malloc(num1 + 1);
masahikofukasawa 19:7a6913400380 363 sprintf(str,"%s%s",str1,str2);
masahikofukasawa 19:7a6913400380 364 return str;
masahikofukasawa 19:7a6913400380 365 }
masahikofukasawa 12:522a22a23f8a 366
masahikofukasawa 12:522a22a23f8a 367 int main(void)
masahikofukasawa 14:76205d28fea2 368 {
masahikofukasawa 12:522a22a23f8a 369 // USB serial
masahikofukasawa 12:522a22a23f8a 370 serial.baud(115200);
masahikofukasawa 12:522a22a23f8a 371
masahikofukasawa 12:522a22a23f8a 372 // serial port RX event
masahikofukasawa 12:522a22a23f8a 373 serial.attach(&usbUartCallback);
masahikofukasawa 12:522a22a23f8a 374
masahikofukasawa 12:522a22a23f8a 375 #ifdef DEBUG
masahikofukasawa 12:522a22a23f8a 376 Debug::setSerial(&serial);
masahikofukasawa 14:76205d28fea2 377 MSG("#Debug Mode.\r\n");
masahikofukasawa 12:522a22a23f8a 378 #endif
masahikofukasawa 12:522a22a23f8a 379
masahikofukasawa 12:522a22a23f8a 380 // initialize AKDP board
masahikofukasawa 14:76205d28fea2 381 if( initAkdpBoard() ){
masahikofukasawa 14:76205d28fea2 382 MSG("#Error: AKDP boot failed.\r\n");
masahikofukasawa 14:76205d28fea2 383 }
masahikofukasawa 19:7a6913400380 384
masahikofukasawa 19:7a6913400380 385 // create sensor manager
masahikofukasawa 19:7a6913400380 386 manager = new AkmSensorManager(&serial);
masahikofukasawa 19:7a6913400380 387
masahikofukasawa 19:7a6913400380 388 if( manager->init(id, subId) == AkmSensorManager::ERROR){
masahikofukasawa 19:7a6913400380 389 MSG("#Error: sensor is NULL\r\n");
masahikofukasawa 19:7a6913400380 390 }
masahikofukasawa 19:7a6913400380 391
masahikofukasawa 19:7a6913400380 392 // create BLE device name
masahikofukasawa 19:7a6913400380 393 char* name = my_strcat(DEVICE_NAME, manager->getSensorName());
masahikofukasawa 19:7a6913400380 394
masahikofukasawa 19:7a6913400380 395 // BLE initialize
masahikofukasawa 19:7a6913400380 396 bleSetup(name);
masahikofukasawa 12:522a22a23f8a 397
masahikofukasawa 0:c240899240e7 398 // BLE UART service
masahikofukasawa 0:c240899240e7 399 uartService = new UARTService(ble);
masahikofukasawa 12:522a22a23f8a 400
masahikofukasawa 19:7a6913400380 401 // set BLE UART service
masahikofukasawa 19:7a6913400380 402 manager->setBleUartService(uartService);
masahikofukasawa 11:53e52f5f1051 403
masahikofukasawa 14:76205d28fea2 404 MSG("#Connecting...\r\n");
masahikofukasawa 19:7a6913400380 405
masahikofukasawa 0:c240899240e7 406 // main loop
masahikofukasawa 0:c240899240e7 407 while(1)
masahikofukasawa 0:c240899240e7 408 {
masahikofukasawa 0:c240899240e7 409 if(manager->isEvent()){
masahikofukasawa 0:c240899240e7 410 manager->processEvent();
masahikofukasawa 0:c240899240e7 411 }else{
masahikofukasawa 0:c240899240e7 412 ble.waitForEvent();
masahikofukasawa 0:c240899240e7 413 }
masahikofukasawa 0:c240899240e7 414 }
masahikofukasawa 0:c240899240e7 415 }