Code for Technion Formula car sensors reader

Dependencies:   mbed Buffer FATFileSystem

Fork of SX1272PingPong by Semtech

This is code is part of a Technion course project in advanced IoT, implementing a device to read and transmit sensors data from a Formula racing car built by students at Technion - Israel Institute of Technology.

How to install

  • Create an account on Mbed: https://os.mbed.com/account/signup/
  • Import project into Compiler
  • In the Program Workspace select "Formula_Nucleo_Reader"
  • Select a Platform like so:
  1. Click button at top-left
  2. Add Board
  3. Search "NUCLEO F103RB" and then "Add to your Mbed Compiler"
  • Finally click "Compile", if the build was successful, the binary would download automatically
  • To install it on device simply plug it in to a PC, open device drive and drag then drop binary file in it
Committer:
wardm
Date:
Thu May 17 20:37:41 2018 +0000
Revision:
15:2e0d977dbb31
V1.0.0

Who changed what in which revision?

UserRevisionLine numberNew contents of line
wardm 15:2e0d977dbb31 1 /* SD/MMC File System Library
wardm 15:2e0d977dbb31 2 * Copyright (c) 2016 Neil Thiessen
wardm 15:2e0d977dbb31 3 *
wardm 15:2e0d977dbb31 4 * Licensed under the Apache License, Version 2.0 (the "License");
wardm 15:2e0d977dbb31 5 * you may not use this file except in compliance with the License.
wardm 15:2e0d977dbb31 6 * You may obtain a copy of the License at
wardm 15:2e0d977dbb31 7 *
wardm 15:2e0d977dbb31 8 * http://www.apache.org/licenses/LICENSE-2.0
wardm 15:2e0d977dbb31 9 *
wardm 15:2e0d977dbb31 10 * Unless required by applicable law or agreed to in writing, software
wardm 15:2e0d977dbb31 11 * distributed under the License is distributed on an "AS IS" BASIS,
wardm 15:2e0d977dbb31 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
wardm 15:2e0d977dbb31 13 * See the License for the specific language governing permissions and
wardm 15:2e0d977dbb31 14 * limitations under the License.
wardm 15:2e0d977dbb31 15 */
wardm 15:2e0d977dbb31 16
wardm 15:2e0d977dbb31 17 #ifndef SD_FILE_SYSTEM_H
wardm 15:2e0d977dbb31 18 #define SD_FILE_SYSTEM_H
wardm 15:2e0d977dbb31 19
wardm 15:2e0d977dbb31 20 #include "mbed.h"
wardm 15:2e0d977dbb31 21 #include "FATFileSystem.h"
wardm 15:2e0d977dbb31 22
wardm 15:2e0d977dbb31 23 /** SDFileSystem class.
wardm 15:2e0d977dbb31 24 * Used for creating a virtual file system for accessing SD/MMC cards via SPI.
wardm 15:2e0d977dbb31 25 *
wardm 15:2e0d977dbb31 26 * Example:
wardm 15:2e0d977dbb31 27 * @code
wardm 15:2e0d977dbb31 28 * #include "mbed.h"
wardm 15:2e0d977dbb31 29 * #include "SDFileSystem.h"
wardm 15:2e0d977dbb31 30 *
wardm 15:2e0d977dbb31 31 * //Create an SDFileSystem object
wardm 15:2e0d977dbb31 32 * SDFileSystem sd(p5, p6, p7, p20, "sd");
wardm 15:2e0d977dbb31 33 *
wardm 15:2e0d977dbb31 34 * int main()
wardm 15:2e0d977dbb31 35 * {
wardm 15:2e0d977dbb31 36 * //Mount the filesystem
wardm 15:2e0d977dbb31 37 * sd.mount();
wardm 15:2e0d977dbb31 38 *
wardm 15:2e0d977dbb31 39 * //Perform a write test
wardm 15:2e0d977dbb31 40 * printf("\nWriting to SD card...");
wardm 15:2e0d977dbb31 41 * FILE *fp = fopen("/sd/sdtest.txt", "w");
wardm 15:2e0d977dbb31 42 * if (fp != NULL) {
wardm 15:2e0d977dbb31 43 * fprintf(fp, "We're writing to an SD card!");
wardm 15:2e0d977dbb31 44 * fclose(fp);
wardm 15:2e0d977dbb31 45 * printf("success!\n");
wardm 15:2e0d977dbb31 46 * } else {
wardm 15:2e0d977dbb31 47 * printf("failed!\n");
wardm 15:2e0d977dbb31 48 * }
wardm 15:2e0d977dbb31 49 *
wardm 15:2e0d977dbb31 50 * //Perform a read test
wardm 15:2e0d977dbb31 51 * printf("Reading from SD card...");
wardm 15:2e0d977dbb31 52 * fp = fopen("/sd/sdtest.txt", "r");
wardm 15:2e0d977dbb31 53 * if (fp != NULL) {
wardm 15:2e0d977dbb31 54 * char c = fgetc(fp);
wardm 15:2e0d977dbb31 55 * if (c == 'W')
wardm 15:2e0d977dbb31 56 * printf("success!\n");
wardm 15:2e0d977dbb31 57 * else
wardm 15:2e0d977dbb31 58 * printf("incorrect char (%c)!\n", c);
wardm 15:2e0d977dbb31 59 * fclose(fp);
wardm 15:2e0d977dbb31 60 * } else {
wardm 15:2e0d977dbb31 61 * printf("failed!\n");
wardm 15:2e0d977dbb31 62 * }
wardm 15:2e0d977dbb31 63 *
wardm 15:2e0d977dbb31 64 * //Unmount the filesystem
wardm 15:2e0d977dbb31 65 * sd.unmount();
wardm 15:2e0d977dbb31 66 * }
wardm 15:2e0d977dbb31 67 * @endcode
wardm 15:2e0d977dbb31 68 */
wardm 15:2e0d977dbb31 69 class SDFileSystem : public FATFileSystem
wardm 15:2e0d977dbb31 70 {
wardm 15:2e0d977dbb31 71 public:
wardm 15:2e0d977dbb31 72 /** Represents the different card detect switch types
wardm 15:2e0d977dbb31 73 */
wardm 15:2e0d977dbb31 74 enum SwitchType {
wardm 15:2e0d977dbb31 75 SWITCH_NONE, /**< No card detect switch (assumes socket is always occupied) */
wardm 15:2e0d977dbb31 76 SWITCH_POS_NO, /**< Switch shorts to VDD when the socket is occupied (positive logic, normally open) */
wardm 15:2e0d977dbb31 77 SWITCH_POS_NC, /**< Switch shorts to VDD when the socket is empty (positive logic, normally closed) */
wardm 15:2e0d977dbb31 78 SWITCH_NEG_NO, /**< Switch shorts to GND when the socket is occupied (negative logic, normally open) */
wardm 15:2e0d977dbb31 79 SWITCH_NEG_NC /**< Switch shorts to GND when the socket is empty (negative logic, normally closed) */
wardm 15:2e0d977dbb31 80 };
wardm 15:2e0d977dbb31 81
wardm 15:2e0d977dbb31 82 /** Represents the different SD/MMC card types
wardm 15:2e0d977dbb31 83 */
wardm 15:2e0d977dbb31 84 enum CardType {
wardm 15:2e0d977dbb31 85 CARD_NONE, /**< No card is present */
wardm 15:2e0d977dbb31 86 CARD_MMC, /**< MMC card */
wardm 15:2e0d977dbb31 87 CARD_SD, /**< Standard capacity SD card */
wardm 15:2e0d977dbb31 88 CARD_SDHC, /**< High capacity SD card */
wardm 15:2e0d977dbb31 89 CARD_UNKNOWN /**< Unknown or unsupported card */
wardm 15:2e0d977dbb31 90 };
wardm 15:2e0d977dbb31 91
wardm 15:2e0d977dbb31 92 /** Create a virtual file system for accessing SD/MMC cards via SPI
wardm 15:2e0d977dbb31 93 *
wardm 15:2e0d977dbb31 94 * @param mosi The SPI data out pin.
wardm 15:2e0d977dbb31 95 * @param miso The SPI data in pin.
wardm 15:2e0d977dbb31 96 * @param sclk The SPI clock pin.
wardm 15:2e0d977dbb31 97 * @param cs The SPI chip select pin.
wardm 15:2e0d977dbb31 98 * @param name The name used to access the virtual filesystem.
wardm 15:2e0d977dbb31 99 * @param cd The card detect pin.
wardm 15:2e0d977dbb31 100 * @param cdtype The type of card detect switch.
wardm 15:2e0d977dbb31 101 * @param hz The SPI bus frequency (defaults to 1MHz).
wardm 15:2e0d977dbb31 102 */
wardm 15:2e0d977dbb31 103 SDFileSystem(PinName mosi, PinName miso, PinName sclk, PinName cs, const char* name, PinName cd = NC, SwitchType cdtype = SWITCH_NONE, int hz = 1000000);
wardm 15:2e0d977dbb31 104
wardm 15:2e0d977dbb31 105 /** Determine whether or not a card is present
wardm 15:2e0d977dbb31 106 *
wardm 15:2e0d977dbb31 107 * @returns
wardm 15:2e0d977dbb31 108 * 'true' if a card is present,
wardm 15:2e0d977dbb31 109 * 'false' if no card is present.
wardm 15:2e0d977dbb31 110 */
wardm 15:2e0d977dbb31 111 bool card_present();
wardm 15:2e0d977dbb31 112
wardm 15:2e0d977dbb31 113 /** Get the detected SD/MMC card type
wardm 15:2e0d977dbb31 114 *
wardm 15:2e0d977dbb31 115 * @returns The detected card type as a CardType enum.
wardm 15:2e0d977dbb31 116 *
wardm 15:2e0d977dbb31 117 * @note Valid after the filesystem has been mounted.
wardm 15:2e0d977dbb31 118 */
wardm 15:2e0d977dbb31 119 SDFileSystem::CardType card_type();
wardm 15:2e0d977dbb31 120
wardm 15:2e0d977dbb31 121 /** Get whether or not CRC is enabled for commands and data
wardm 15:2e0d977dbb31 122 *
wardm 15:2e0d977dbb31 123 * @returns
wardm 15:2e0d977dbb31 124 * 'true' if CRC is enabled for commands and data,
wardm 15:2e0d977dbb31 125 * 'false' if CRC is disabled for commands and data.
wardm 15:2e0d977dbb31 126 */
wardm 15:2e0d977dbb31 127 bool crc();
wardm 15:2e0d977dbb31 128
wardm 15:2e0d977dbb31 129 /** Set whether or not CRC is enabled for commands and data
wardm 15:2e0d977dbb31 130 *
wardm 15:2e0d977dbb31 131 * @param enabled Whether or not to enable CRC for commands and data.
wardm 15:2e0d977dbb31 132 */
wardm 15:2e0d977dbb31 133 void crc(bool enabled);
wardm 15:2e0d977dbb31 134
wardm 15:2e0d977dbb31 135 /** Get whether or not 16-bit frames are enabled for data read/write operations
wardm 15:2e0d977dbb31 136 *
wardm 15:2e0d977dbb31 137 * @returns
wardm 15:2e0d977dbb31 138 * 'true' if 16-bit frames will be used during data read/write operations,
wardm 15:2e0d977dbb31 139 * 'false' if 8-bit frames will be used during data read/write operations.
wardm 15:2e0d977dbb31 140 */
wardm 15:2e0d977dbb31 141 bool large_frames();
wardm 15:2e0d977dbb31 142
wardm 15:2e0d977dbb31 143 /** Set whether or not 16-bit frames are enabled for data read/write operations
wardm 15:2e0d977dbb31 144 *
wardm 15:2e0d977dbb31 145 * @param enabled Whether or not 16-bit frames are enabled for data read/write operations.
wardm 15:2e0d977dbb31 146 */
wardm 15:2e0d977dbb31 147 void large_frames(bool enabled);
wardm 15:2e0d977dbb31 148
wardm 15:2e0d977dbb31 149 /** Get whether or not write validation is enabled for data write operations
wardm 15:2e0d977dbb31 150 *
wardm 15:2e0d977dbb31 151 * @returns
wardm 15:2e0d977dbb31 152 * 'true' if data writes will be verified using CMD13,
wardm 15:2e0d977dbb31 153 * 'false' if data writes will not be verified.
wardm 15:2e0d977dbb31 154 */
wardm 15:2e0d977dbb31 155 bool write_validation();
wardm 15:2e0d977dbb31 156
wardm 15:2e0d977dbb31 157 /** Set whether or not write validation is enabled for data write operations
wardm 15:2e0d977dbb31 158 *
wardm 15:2e0d977dbb31 159 * @param enabled Whether or not write validation is enabled for data write operations.
wardm 15:2e0d977dbb31 160 */
wardm 15:2e0d977dbb31 161 void write_validation(bool enabled);
wardm 15:2e0d977dbb31 162
wardm 15:2e0d977dbb31 163 virtual int unmount();
wardm 15:2e0d977dbb31 164 virtual int disk_initialize();
wardm 15:2e0d977dbb31 165 virtual int disk_status();
wardm 15:2e0d977dbb31 166 virtual int disk_read(uint8_t* buffer, uint32_t sector, uint32_t count);
wardm 15:2e0d977dbb31 167 virtual int disk_write(const uint8_t* buffer, uint32_t sector, uint32_t count);
wardm 15:2e0d977dbb31 168 virtual int disk_sync();
wardm 15:2e0d977dbb31 169 virtual uint32_t disk_sectors();
wardm 15:2e0d977dbb31 170
wardm 15:2e0d977dbb31 171 private:
wardm 15:2e0d977dbb31 172 //Commands
wardm 15:2e0d977dbb31 173 enum Command {
wardm 15:2e0d977dbb31 174 CMD0 = (0x40 | 0), /**< GO_IDLE_STATE */
wardm 15:2e0d977dbb31 175 CMD1 = (0x40 | 1), /**< SEND_OP_COND */
wardm 15:2e0d977dbb31 176 CMD6 = (0x40 | 6), /**< SWITCH_FUNC */
wardm 15:2e0d977dbb31 177 CMD8 = (0x40 | 8), /**< SEND_IF_COND */
wardm 15:2e0d977dbb31 178 CMD9 = (0x40 | 9), /**< SEND_CSD */
wardm 15:2e0d977dbb31 179 CMD12 = (0x40 | 12), /**< STOP_TRANSMISSION */
wardm 15:2e0d977dbb31 180 CMD13 = (0x40 | 13), /**< SEND_STATUS */
wardm 15:2e0d977dbb31 181 CMD16 = (0x40 | 16), /**< SET_BLOCKLEN */
wardm 15:2e0d977dbb31 182 CMD17 = (0x40 | 17), /**< READ_SINGLE_BLOCK */
wardm 15:2e0d977dbb31 183 CMD18 = (0x40 | 18), /**< READ_MULTIPLE_BLOCK */
wardm 15:2e0d977dbb31 184 ACMD22 = (0x40 | 22), /**< SEND_NUM_WR_BLOCKS */
wardm 15:2e0d977dbb31 185 ACMD23 = (0x40 | 23), /**< SET_WR_BLK_ERASE_COUNT */
wardm 15:2e0d977dbb31 186 CMD24 = (0x40 | 24), /**< WRITE_BLOCK */
wardm 15:2e0d977dbb31 187 CMD25 = (0x40 | 25), /**< WRITE_MULTIPLE_BLOCK */
wardm 15:2e0d977dbb31 188 ACMD41 = (0x40 | 41), /**< SD_SEND_OP_COND */
wardm 15:2e0d977dbb31 189 ACMD42 = (0x40 | 42), /**< SET_CLR_CARD_DETECT */
wardm 15:2e0d977dbb31 190 CMD55 = (0x40 | 55), /**< APP_CMD */
wardm 15:2e0d977dbb31 191 CMD58 = (0x40 | 58), /**< READ_OCR */
wardm 15:2e0d977dbb31 192 CMD59 = (0x40 | 59) /**< CRC_ON_OFF */
wardm 15:2e0d977dbb31 193 };
wardm 15:2e0d977dbb31 194
wardm 15:2e0d977dbb31 195 //Member variables
wardm 15:2e0d977dbb31 196 Timer m_Timer;
wardm 15:2e0d977dbb31 197 SPI m_Spi;
wardm 15:2e0d977dbb31 198 DigitalOut m_Cs;
wardm 15:2e0d977dbb31 199 InterruptIn m_Cd;
wardm 15:2e0d977dbb31 200 int m_CdAssert;
wardm 15:2e0d977dbb31 201 const int m_FREQ;
wardm 15:2e0d977dbb31 202 SDFileSystem::CardType m_CardType;
wardm 15:2e0d977dbb31 203 bool m_Crc;
wardm 15:2e0d977dbb31 204 bool m_LargeFrames;
wardm 15:2e0d977dbb31 205 bool m_WriteValidation;
wardm 15:2e0d977dbb31 206 int m_Status;
wardm 15:2e0d977dbb31 207
wardm 15:2e0d977dbb31 208 //Internal methods
wardm 15:2e0d977dbb31 209 void onCardRemoval();
wardm 15:2e0d977dbb31 210 void checkSocket();
wardm 15:2e0d977dbb31 211 bool waitReady(int timeout);
wardm 15:2e0d977dbb31 212 bool select();
wardm 15:2e0d977dbb31 213 void deselect();
wardm 15:2e0d977dbb31 214 char commandTransaction(char cmd, unsigned int arg, unsigned int* resp = NULL);
wardm 15:2e0d977dbb31 215 char writeCommand(char cmd, unsigned int arg, unsigned int* resp = NULL);
wardm 15:2e0d977dbb31 216 bool readData(char* buffer, int length);
wardm 15:2e0d977dbb31 217 char writeData(const char* buffer, char token);
wardm 15:2e0d977dbb31 218 bool readBlock(char* buffer, unsigned int lba);
wardm 15:2e0d977dbb31 219 bool readBlocks(char* buffer, unsigned int lba, unsigned int count);
wardm 15:2e0d977dbb31 220 bool writeBlock(const char* buffer, unsigned int lba);
wardm 15:2e0d977dbb31 221 bool writeBlocks(const char* buffer, unsigned int lba, unsigned int count);
wardm 15:2e0d977dbb31 222 bool enableHighSpeedMode();
wardm 15:2e0d977dbb31 223 };
wardm 15:2e0d977dbb31 224
wardm 15:2e0d977dbb31 225 #endif