stm32nucleof401re_04_sdcard

Dependencies:   mbed-os

Committer:
perlatecnica
Date:
Fri Feb 07 07:25:23 2020 +0000
Revision:
0:ad67c66b2e84
v1.0

Who changed what in which revision?

UserRevisionLine numberNew contents of line
perlatecnica 0:ad67c66b2e84 1 /* mbed Microcontroller Library
perlatecnica 0:ad67c66b2e84 2 * Copyright (c) 2006-2012 ARM Limited
perlatecnica 0:ad67c66b2e84 3 *
perlatecnica 0:ad67c66b2e84 4 * Permission is hereby granted, free of charge, to any person obtaining a copy
perlatecnica 0:ad67c66b2e84 5 * of this software and associated documentation files (the "Software"), to deal
perlatecnica 0:ad67c66b2e84 6 * in the Software without restriction, including without limitation the rights
perlatecnica 0:ad67c66b2e84 7 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
perlatecnica 0:ad67c66b2e84 8 * copies of the Software, and to permit persons to whom the Software is
perlatecnica 0:ad67c66b2e84 9 * furnished to do so, subject to the following conditions:
perlatecnica 0:ad67c66b2e84 10 *
perlatecnica 0:ad67c66b2e84 11 * The above copyright notice and this permission notice shall be included in
perlatecnica 0:ad67c66b2e84 12 * all copies or substantial portions of the Software.
perlatecnica 0:ad67c66b2e84 13 *
perlatecnica 0:ad67c66b2e84 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
perlatecnica 0:ad67c66b2e84 15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
perlatecnica 0:ad67c66b2e84 16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
perlatecnica 0:ad67c66b2e84 17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
perlatecnica 0:ad67c66b2e84 18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
perlatecnica 0:ad67c66b2e84 19 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
perlatecnica 0:ad67c66b2e84 20 * SOFTWARE.
perlatecnica 0:ad67c66b2e84 21 */
perlatecnica 0:ad67c66b2e84 22 #ifndef MBED_SD_BLOCK_DEVICE_H
perlatecnica 0:ad67c66b2e84 23 #define MBED_SD_BLOCK_DEVICE_H
perlatecnica 0:ad67c66b2e84 24
perlatecnica 0:ad67c66b2e84 25 /* If the target has no SPI support then SDCard is not supported */
perlatecnica 0:ad67c66b2e84 26 #ifdef DEVICE_SPI
perlatecnica 0:ad67c66b2e84 27
perlatecnica 0:ad67c66b2e84 28 #include "BlockDevice.h"
perlatecnica 0:ad67c66b2e84 29 #include "mbed.h"
perlatecnica 0:ad67c66b2e84 30
perlatecnica 0:ad67c66b2e84 31
perlatecnica 0:ad67c66b2e84 32 /** Access an SD Card using SPI
perlatecnica 0:ad67c66b2e84 33 *
perlatecnica 0:ad67c66b2e84 34 * @code
perlatecnica 0:ad67c66b2e84 35 * #include "mbed.h"
perlatecnica 0:ad67c66b2e84 36 * #include "SDBlockDevice.h"
perlatecnica 0:ad67c66b2e84 37 *
perlatecnica 0:ad67c66b2e84 38 * SDBlockDevice sd(p5, p6, p7, p12); // mosi, miso, sclk, cs
perlatecnica 0:ad67c66b2e84 39 * uint8_t block[512] = "Hello World!\n";
perlatecnica 0:ad67c66b2e84 40 *
perlatecnica 0:ad67c66b2e84 41 * int main() {
perlatecnica 0:ad67c66b2e84 42 * sd.init();
perlatecnica 0:ad67c66b2e84 43 * sd.write(block, 0, 512);
perlatecnica 0:ad67c66b2e84 44 * sd.read(block, 0, 512);
perlatecnica 0:ad67c66b2e84 45 * printf("%s", block);
perlatecnica 0:ad67c66b2e84 46 * sd.deinit();
perlatecnica 0:ad67c66b2e84 47 * }
perlatecnica 0:ad67c66b2e84 48 */
perlatecnica 0:ad67c66b2e84 49 class SDBlockDevice : public BlockDevice {
perlatecnica 0:ad67c66b2e84 50 public:
perlatecnica 0:ad67c66b2e84 51 /** Lifetime of an SD card
perlatecnica 0:ad67c66b2e84 52 */
perlatecnica 0:ad67c66b2e84 53 SDBlockDevice(PinName mosi, PinName miso, PinName sclk, PinName cs);
perlatecnica 0:ad67c66b2e84 54 virtual ~SDBlockDevice();
perlatecnica 0:ad67c66b2e84 55
perlatecnica 0:ad67c66b2e84 56 /** Initialize a block device
perlatecnica 0:ad67c66b2e84 57 *
perlatecnica 0:ad67c66b2e84 58 * @return 0 on success or a negative error code on failure
perlatecnica 0:ad67c66b2e84 59 */
perlatecnica 0:ad67c66b2e84 60 virtual int init();
perlatecnica 0:ad67c66b2e84 61
perlatecnica 0:ad67c66b2e84 62 /** Deinitialize a block device
perlatecnica 0:ad67c66b2e84 63 *
perlatecnica 0:ad67c66b2e84 64 * @return 0 on success or a negative error code on failure
perlatecnica 0:ad67c66b2e84 65 */
perlatecnica 0:ad67c66b2e84 66 virtual int deinit();
perlatecnica 0:ad67c66b2e84 67
perlatecnica 0:ad67c66b2e84 68 /** Read blocks from a block device
perlatecnica 0:ad67c66b2e84 69 *
perlatecnica 0:ad67c66b2e84 70 * @param buffer Buffer to write blocks to
perlatecnica 0:ad67c66b2e84 71 * @param addr Address of block to begin reading from
perlatecnica 0:ad67c66b2e84 72 * @param size Size to read in bytes, must be a multiple of read block size
perlatecnica 0:ad67c66b2e84 73 * @return 0 on success, negative error code on failure
perlatecnica 0:ad67c66b2e84 74 */
perlatecnica 0:ad67c66b2e84 75 virtual int read(void *buffer, bd_addr_t addr, bd_size_t size);
perlatecnica 0:ad67c66b2e84 76
perlatecnica 0:ad67c66b2e84 77 /** Program blocks to a block device
perlatecnica 0:ad67c66b2e84 78 *
perlatecnica 0:ad67c66b2e84 79 * The blocks must have been erased prior to being programmed
perlatecnica 0:ad67c66b2e84 80 *
perlatecnica 0:ad67c66b2e84 81 * @param buffer Buffer of data to write to blocks
perlatecnica 0:ad67c66b2e84 82 * @param addr Address of block to begin writing to
perlatecnica 0:ad67c66b2e84 83 * @param size Size to write in bytes, must be a multiple of program block size
perlatecnica 0:ad67c66b2e84 84 * @return 0 on success, negative error code on failure
perlatecnica 0:ad67c66b2e84 85 */
perlatecnica 0:ad67c66b2e84 86 virtual int program(const void *buffer, bd_addr_t addr, bd_size_t size);
perlatecnica 0:ad67c66b2e84 87
perlatecnica 0:ad67c66b2e84 88 /** Erase blocks on a block device
perlatecnica 0:ad67c66b2e84 89 *
perlatecnica 0:ad67c66b2e84 90 * The state of an erased block is undefined until it has been programmed
perlatecnica 0:ad67c66b2e84 91 *
perlatecnica 0:ad67c66b2e84 92 * @param addr Address of block to begin erasing
perlatecnica 0:ad67c66b2e84 93 * @param size Size to erase in bytes, must be a multiple of erase block size
perlatecnica 0:ad67c66b2e84 94 * @return 0 on success, negative error code on failure
perlatecnica 0:ad67c66b2e84 95 */
perlatecnica 0:ad67c66b2e84 96 virtual int erase(bd_addr_t addr, bd_size_t size);
perlatecnica 0:ad67c66b2e84 97
perlatecnica 0:ad67c66b2e84 98 /** Get the size of a readable block
perlatecnica 0:ad67c66b2e84 99 *
perlatecnica 0:ad67c66b2e84 100 * @return Size of a readable block in bytes
perlatecnica 0:ad67c66b2e84 101 */
perlatecnica 0:ad67c66b2e84 102 virtual bd_size_t get_read_size() const;
perlatecnica 0:ad67c66b2e84 103
perlatecnica 0:ad67c66b2e84 104 /** Get the size of a programable block
perlatecnica 0:ad67c66b2e84 105 *
perlatecnica 0:ad67c66b2e84 106 * @return Size of a programable block in bytes
perlatecnica 0:ad67c66b2e84 107 * @note Must be a multiple of the read size
perlatecnica 0:ad67c66b2e84 108 */
perlatecnica 0:ad67c66b2e84 109 virtual bd_size_t get_program_size() const;
perlatecnica 0:ad67c66b2e84 110
perlatecnica 0:ad67c66b2e84 111 /** Get the size of a eraseable block
perlatecnica 0:ad67c66b2e84 112 *
perlatecnica 0:ad67c66b2e84 113 * @return Size of a eraseable block in bytes
perlatecnica 0:ad67c66b2e84 114 * @note Must be a multiple of the program size
perlatecnica 0:ad67c66b2e84 115 */
perlatecnica 0:ad67c66b2e84 116 virtual bd_size_t get_erase_size() const;
perlatecnica 0:ad67c66b2e84 117
perlatecnica 0:ad67c66b2e84 118 /** Get the total size of the underlying device
perlatecnica 0:ad67c66b2e84 119 *
perlatecnica 0:ad67c66b2e84 120 * @return Size of the underlying device in bytes
perlatecnica 0:ad67c66b2e84 121 */
perlatecnica 0:ad67c66b2e84 122 virtual bd_size_t size() const;
perlatecnica 0:ad67c66b2e84 123
perlatecnica 0:ad67c66b2e84 124 /** Enable or disable debugging
perlatecnica 0:ad67c66b2e84 125 *
perlatecnica 0:ad67c66b2e84 126 * @param State of debugging
perlatecnica 0:ad67c66b2e84 127 */
perlatecnica 0:ad67c66b2e84 128 virtual void debug(bool dbg);
perlatecnica 0:ad67c66b2e84 129
perlatecnica 0:ad67c66b2e84 130 private:
perlatecnica 0:ad67c66b2e84 131 int _cmd(int cmd, int arg);
perlatecnica 0:ad67c66b2e84 132 int _cmdx(int cmd, int arg);
perlatecnica 0:ad67c66b2e84 133 int _cmd8();
perlatecnica 0:ad67c66b2e84 134 int _cmd58();
perlatecnica 0:ad67c66b2e84 135
perlatecnica 0:ad67c66b2e84 136 /* Move the SDCard into the SPI Mode idle state
perlatecnica 0:ad67c66b2e84 137 *
perlatecnica 0:ad67c66b2e84 138 * The card is transitioned from SDCard mode to SPI mode by sending the
perlatecnica 0:ad67c66b2e84 139 * CMD0 (GO_IDLE_STATE) command with CS asserted. See the notes in the
perlatecnica 0:ad67c66b2e84 140 * "SPI Startup" section of the comments at the head of the
perlatecnica 0:ad67c66b2e84 141 * implementation file for further details and specification references.
perlatecnica 0:ad67c66b2e84 142 *
perlatecnica 0:ad67c66b2e84 143 * @return -1 if an error occurred e.g. a valid response was not
perlatecnica 0:ad67c66b2e84 144 * received. Otherwise R1_IDLE_STATE (0x1), the successful
perlatecnica 0:ad67c66b2e84 145 * response from CMD0.
perlatecnica 0:ad67c66b2e84 146 */
perlatecnica 0:ad67c66b2e84 147 int _go_idle_state();
perlatecnica 0:ad67c66b2e84 148 int _initialise_card();
perlatecnica 0:ad67c66b2e84 149 int _initialise_card_v1();
perlatecnica 0:ad67c66b2e84 150 int _initialise_card_v2();
perlatecnica 0:ad67c66b2e84 151
perlatecnica 0:ad67c66b2e84 152 int _read(uint8_t * buffer, uint32_t length);
perlatecnica 0:ad67c66b2e84 153 int _write(const uint8_t *buffer, uint32_t length);
perlatecnica 0:ad67c66b2e84 154 uint32_t _sd_sectors();
perlatecnica 0:ad67c66b2e84 155 uint32_t _sectors;
perlatecnica 0:ad67c66b2e84 156
perlatecnica 0:ad67c66b2e84 157 uint32_t _init_sck;
perlatecnica 0:ad67c66b2e84 158 uint32_t _transfer_sck;
perlatecnica 0:ad67c66b2e84 159
perlatecnica 0:ad67c66b2e84 160 SPI _spi;
perlatecnica 0:ad67c66b2e84 161 DigitalOut _cs;
perlatecnica 0:ad67c66b2e84 162 unsigned _block_size;
perlatecnica 0:ad67c66b2e84 163 bool _is_initialized;
perlatecnica 0:ad67c66b2e84 164 bool _dbg;
perlatecnica 0:ad67c66b2e84 165 mutable Mutex _lock;
perlatecnica 0:ad67c66b2e84 166 };
perlatecnica 0:ad67c66b2e84 167
perlatecnica 0:ad67c66b2e84 168
perlatecnica 0:ad67c66b2e84 169 #endif /* DEVICE_SPI */
perlatecnica 0:ad67c66b2e84 170
perlatecnica 0:ad67c66b2e84 171 #endif /* MBED_SD_BLOCK_DEVICE_H */
perlatecnica 0:ad67c66b2e84 172