NM500 / NeuroShield

Dependents:   NeuroShield_SimpleScript NeuroShield_andIMU NeuroShield_Gesture_Recognition

Committer:
nepes_ai
Date:
Thu Aug 17 23:31:15 2017 +0000
Revision:
0:529602524696
Child:
1:0c6bf23f2fc8
Release version 1.0.0

Who changed what in which revision?

UserRevisionLine numberNew contents of line
nepes_ai 0:529602524696 1 /*
nepes_ai 0:529602524696 2 * NeuroShield.cpp - Driver for NeuroShield
nepes_ai 0:529602524696 3 * Copyright (c) 2016, General Vision Inc, All rights reserved
nepes_ai 0:529602524696 4 * Copyright (c) 2017, nepes inc, All rights reserved.
nepes_ai 0:529602524696 5 *
nepes_ai 0:529602524696 6 * Redistribution and use in source and binary forms, with or without
nepes_ai 0:529602524696 7 * modification, are permitted provided that the following conditions are met:
nepes_ai 0:529602524696 8 *
nepes_ai 0:529602524696 9 * 1. Redistributions of source code must retain the above copyright notice,
nepes_ai 0:529602524696 10 * this list of conditions and the following disclaimer.
nepes_ai 0:529602524696 11 *
nepes_ai 0:529602524696 12 * 2. Redistributions in binary form must reproduce the above copyright notice,
nepes_ai 0:529602524696 13 * this list of conditions and the following disclaimer in the documentation
nepes_ai 0:529602524696 14 * and/or other materials provided with the distribution.
nepes_ai 0:529602524696 15 *
nepes_ai 0:529602524696 16 * 3. Neither the name of the copyright holder nor the names of its contributors
nepes_ai 0:529602524696 17 * may be used to endorse or promote products derived from this software without
nepes_ai 0:529602524696 18 * specific prior written permission.
nepes_ai 0:529602524696 19 *
nepes_ai 0:529602524696 20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
nepes_ai 0:529602524696 21 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
nepes_ai 0:529602524696 22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
nepes_ai 0:529602524696 23 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
nepes_ai 0:529602524696 24 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
nepes_ai 0:529602524696 25 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
nepes_ai 0:529602524696 26 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
nepes_ai 0:529602524696 27 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
nepes_ai 0:529602524696 28 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
nepes_ai 0:529602524696 29 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
nepes_ai 0:529602524696 30 * POSSIBILITY OF SUCH DAMAGE.
nepes_ai 0:529602524696 31 *
nepes_ai 0:529602524696 32 */
nepes_ai 0:529602524696 33
nepes_ai 0:529602524696 34 #include "mbed.h"
nepes_ai 0:529602524696 35 #include <NeuroShield.h>
nepes_ai 0:529602524696 36 #include <NeuroShieldSPI.h>
nepes_ai 0:529602524696 37
nepes_ai 0:529602524696 38 SPI device(SPI_MOSI, SPI_MISO, SPI_SCK); // PA_7, PA_6, PA_5
nepes_ai 0:529602524696 39 DigitalOut nm500_ss(D7); // NM500_SSn
nepes_ai 0:529602524696 40
nepes_ai 0:529602524696 41 // ------------------------------------------------------------ //
nepes_ai 0:529602524696 42 // Constructor to the class ShieldSPI
nepes_ai 0:529602524696 43 // ------------------------------------------------------------
nepes_ai 0:529602524696 44 NeuroShieldSPI::NeuroShieldSPI(){
nepes_ai 0:529602524696 45 }
nepes_ai 0:529602524696 46
nepes_ai 0:529602524696 47 // ------------------------------------------------------------
nepes_ai 0:529602524696 48 // Initialize the SPI communication and verify proper interface
nepes_ai 0:529602524696 49 // to the NM500 by reading the default Minif value of 2-bytes
nepes_ai 0:529602524696 50 // return an error=0 otherwise=1
nepes_ai 0:529602524696 51 // ------------------------------------------------------------
nepes_ai 0:529602524696 52 bool NeuroShieldSPI::connect()
nepes_ai 0:529602524696 53 {
nepes_ai 0:529602524696 54 uint16_t read_value;
nepes_ai 0:529602524696 55
nepes_ai 0:529602524696 56 // for shield board test
nepes_ai 0:529602524696 57 nm500_ss = HIGH;
nepes_ai 0:529602524696 58
nepes_ai 0:529602524696 59 //
nepes_ai 0:529602524696 60 device.format(8,0);
nepes_ai 0:529602524696 61 device.frequency(2000000); // 2MHz
nepes_ai 0:529602524696 62
nepes_ai 0:529602524696 63 // return 1 if NM500 present and SPI comm successful
nepes_ai 0:529602524696 64 for (int i = 0; i < 10; i++) {
nepes_ai 0:529602524696 65 reset(); // NM500 reset
nepes_ai 0:529602524696 66 wait_ms(100);
nepes_ai 0:529602524696 67 write(NM_FORGET, 0);
nepes_ai 0:529602524696 68 wait_ms(50);
nepes_ai 0:529602524696 69 read_value = read(NM_MINIF);
nepes_ai 0:529602524696 70 if (read_value == 2)
nepes_ai 0:529602524696 71 return(1);
nepes_ai 0:529602524696 72 wait_ms(50);
nepes_ai 0:529602524696 73 }
nepes_ai 0:529602524696 74
nepes_ai 0:529602524696 75 return(0);
nepes_ai 0:529602524696 76 }
nepes_ai 0:529602524696 77
nepes_ai 0:529602524696 78 // --------------------------------------------------------
nepes_ai 0:529602524696 79 // SPI Read the register of a given module (module + reg = addr)
nepes_ai 0:529602524696 80 //---------------------------------------------------------
nepes_ai 0:529602524696 81 uint16_t NeuroShieldSPI::read(uint8_t reg)
nepes_ai 0:529602524696 82 {
nepes_ai 0:529602524696 83 //device.lock();
nepes_ai 0:529602524696 84
nepes_ai 0:529602524696 85 nm500_ss = LOW;
nepes_ai 0:529602524696 86 device.write(1); // Dummy for ID
nepes_ai 0:529602524696 87 device.write((uint8_t)module_nm500);
nepes_ai 0:529602524696 88 device.write(0);
nepes_ai 0:529602524696 89 device.write(0);
nepes_ai 0:529602524696 90 device.write(reg);
nepes_ai 0:529602524696 91 device.write(0);
nepes_ai 0:529602524696 92 device.write(0);
nepes_ai 0:529602524696 93 device.write(1); // expect 1 word back
nepes_ai 0:529602524696 94 uint16_t data = device.write(0); // Send 0 to push upper data out
nepes_ai 0:529602524696 95 data = (data << 8) + device.write(0); // Send 0 to push lower data out
nepes_ai 0:529602524696 96 nm500_ss = HIGH;
nepes_ai 0:529602524696 97
nepes_ai 0:529602524696 98 //device.unlock();
nepes_ai 0:529602524696 99
nepes_ai 0:529602524696 100 return(data);
nepes_ai 0:529602524696 101 }
nepes_ai 0:529602524696 102
nepes_ai 0:529602524696 103 // ---------------------------------------------------------
nepes_ai 0:529602524696 104 // SPI Write the register of a given module (module + reg = addr)
nepes_ai 0:529602524696 105 // ---------------------------------------------------------
nepes_ai 0:529602524696 106 void NeuroShieldSPI::write(uint8_t reg, uint16_t data)
nepes_ai 0:529602524696 107 {
nepes_ai 0:529602524696 108 //device.lock();
nepes_ai 0:529602524696 109
nepes_ai 0:529602524696 110 nm500_ss = LOW;
nepes_ai 0:529602524696 111 device.write(1); // Dummy for ID
nepes_ai 0:529602524696 112 device.write((uint8_t)(module_nm500 + 0x80)); // module and write flag
nepes_ai 0:529602524696 113 device.write(0);
nepes_ai 0:529602524696 114 device.write(0);
nepes_ai 0:529602524696 115 device.write(reg);
nepes_ai 0:529602524696 116 device.write(0);
nepes_ai 0:529602524696 117 device.write(0);
nepes_ai 0:529602524696 118 device.write(1); // expect 1 word back
nepes_ai 0:529602524696 119 if ((reg == NM_COMP) || (reg == NM_LCOMP)) {
nepes_ai 0:529602524696 120 device.write(0x00); // upper data
nepes_ai 0:529602524696 121 device.write((uint8_t)(data & 0x00FF)); // lower data
nepes_ai 0:529602524696 122 }
nepes_ai 0:529602524696 123 else {
nepes_ai 0:529602524696 124 device.write((uint8_t)((data >> 8) & 0x00FF)); // upper data
nepes_ai 0:529602524696 125 device.write((uint8_t)(data & 0x00FF)); // lower data
nepes_ai 0:529602524696 126 }
nepes_ai 0:529602524696 127 nm500_ss = HIGH;
nepes_ai 0:529602524696 128
nepes_ai 0:529602524696 129 //device.unlock();
nepes_ai 0:529602524696 130 }
nepes_ai 0:529602524696 131
nepes_ai 0:529602524696 132 // ----------------------------------------------------------------
nepes_ai 0:529602524696 133 // SPI Write burst mode at COMP register
nepes_ai 0:529602524696 134 // ----------------------------------------------------------------
nepes_ai 0:529602524696 135 uint16_t NeuroShieldSPI::writeVector(uint8_t reg, uint8_t* data, uint16_t size)
nepes_ai 0:529602524696 136 {
nepes_ai 0:529602524696 137 if ((reg != NM_COMP) || (size > 255))
nepes_ai 0:529602524696 138 return(0);
nepes_ai 0:529602524696 139
nepes_ai 0:529602524696 140 //device.lock();
nepes_ai 0:529602524696 141
nepes_ai 0:529602524696 142 nm500_ss = LOW;
nepes_ai 0:529602524696 143 device.write(1); // Dummy for ID
nepes_ai 0:529602524696 144 device.write((uint8_t)(module_nm500 + 0x80)); // module and write flag
nepes_ai 0:529602524696 145 device.write(0);
nepes_ai 0:529602524696 146 device.write(0);
nepes_ai 0:529602524696 147 device.write(reg);
nepes_ai 0:529602524696 148 device.write(0);
nepes_ai 0:529602524696 149 device.write(0);
nepes_ai 0:529602524696 150 device.write((uint8_t)size); // 0 ~ 255 byte
nepes_ai 0:529602524696 151 for (int i = 0; i < size; i++) {
nepes_ai 0:529602524696 152 device.write(0x00); // COMP' upper data = 0x00
nepes_ai 0:529602524696 153 device.write((uint8_t)(*data)); // lower data
nepes_ai 0:529602524696 154 data++;
nepes_ai 0:529602524696 155 }
nepes_ai 0:529602524696 156 nm500_ss = HIGH;
nepes_ai 0:529602524696 157
nepes_ai 0:529602524696 158 //device.unlock();
nepes_ai 0:529602524696 159
nepes_ai 0:529602524696 160 return(size);
nepes_ai 0:529602524696 161 }
nepes_ai 0:529602524696 162
nepes_ai 0:529602524696 163 // ----------------------------------------------------------------
nepes_ai 0:529602524696 164 // read FPGA Version
nepes_ai 0:529602524696 165 // ----------------------------------------------------------------
nepes_ai 0:529602524696 166 uint16_t NeuroShieldSPI::version()
nepes_ai 0:529602524696 167 {
nepes_ai 0:529602524696 168 //device.lock();
nepes_ai 0:529602524696 169
nepes_ai 0:529602524696 170 nm500_ss = LOW;
nepes_ai 0:529602524696 171 device.write(1); // Dummy for ID
nepes_ai 0:529602524696 172 device.write((uint8_t)module_fpga); // address (4-byte)
nepes_ai 0:529602524696 173 device.write(0);
nepes_ai 0:529602524696 174 device.write(0);
nepes_ai 0:529602524696 175 device.write(1); // version check : 0x01
nepes_ai 0:529602524696 176 device.write(0); // word size (3-byte)
nepes_ai 0:529602524696 177 device.write(0);
nepes_ai 0:529602524696 178 device.write(1);
nepes_ai 0:529602524696 179 uint16_t data = device.write(0); // Send 0 to push upper data out
nepes_ai 0:529602524696 180 data = (data << 8) + device.write(0); // Send 0 to push lower data out
nepes_ai 0:529602524696 181 nm500_ss = HIGH;
nepes_ai 0:529602524696 182
nepes_ai 0:529602524696 183 //device.unlock();
nepes_ai 0:529602524696 184
nepes_ai 0:529602524696 185 return(data);
nepes_ai 0:529602524696 186 }
nepes_ai 0:529602524696 187
nepes_ai 0:529602524696 188 // ----------------------------------------------------------------
nepes_ai 0:529602524696 189 // excute NM500 SW reset
nepes_ai 0:529602524696 190 // ----------------------------------------------------------------
nepes_ai 0:529602524696 191 void NeuroShieldSPI::reset()
nepes_ai 0:529602524696 192 {
nepes_ai 0:529602524696 193 //device.lock();
nepes_ai 0:529602524696 194
nepes_ai 0:529602524696 195 nm500_ss = LOW;
nepes_ai 0:529602524696 196 device.write(1); // Dummy for ID
nepes_ai 0:529602524696 197 device.write((uint8_t)(module_fpga + 0x80)); // address (4-byte)
nepes_ai 0:529602524696 198 device.write(0);
nepes_ai 0:529602524696 199 device.write(0);
nepes_ai 0:529602524696 200 device.write(2); // nm500 sw reset : 0x02
nepes_ai 0:529602524696 201 device.write(0); // word size (3-byte)
nepes_ai 0:529602524696 202 device.write(0);
nepes_ai 0:529602524696 203 device.write(1); // expect 1 word back
nepes_ai 0:529602524696 204 device.write(0);
nepes_ai 0:529602524696 205 device.write(0);
nepes_ai 0:529602524696 206 nm500_ss = HIGH;
nepes_ai 0:529602524696 207
nepes_ai 0:529602524696 208 //device.unlock();
nepes_ai 0:529602524696 209 }
nepes_ai 0:529602524696 210
nepes_ai 0:529602524696 211 // ----------------------------------------------------------------
nepes_ai 0:529602524696 212 // LED scenario select
nepes_ai 0:529602524696 213 // ----------------------------------------------------------------
nepes_ai 0:529602524696 214 void NeuroShieldSPI::ledSelect(uint8_t data)
nepes_ai 0:529602524696 215 {
nepes_ai 0:529602524696 216 //device.lock();
nepes_ai 0:529602524696 217
nepes_ai 0:529602524696 218 nm500_ss = LOW;
nepes_ai 0:529602524696 219 device.write(1); // Dummy for ID
nepes_ai 0:529602524696 220 device.write((uint8_t)(module_led + 0x80)); // address (4-byte)
nepes_ai 0:529602524696 221 device.write(0);
nepes_ai 0:529602524696 222 device.write(0);
nepes_ai 0:529602524696 223 device.write(data); // led scenario select
nepes_ai 0:529602524696 224 device.write(0); // word size (3-byte)
nepes_ai 0:529602524696 225 device.write(0);
nepes_ai 0:529602524696 226 device.write(1); // expect 1 word back
nepes_ai 0:529602524696 227 device.write(0);
nepes_ai 0:529602524696 228 device.write(0);
nepes_ai 0:529602524696 229 nm500_ss = HIGH;
nepes_ai 0:529602524696 230
nepes_ai 0:529602524696 231 //deviece.unlock();
nepes_ai 0:529602524696 232 }