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:
Fri Aug 12 00:04:58 2016 +0000
Revision:
19:7a6913400380
Parent:
18:d75838bceaaf
Child:
20:15fb57ad4f70
Ver008. Modified for faster BLE connection, and sensor name in the BLE device name.

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