mbed library sources

Dependents:   Encrypted my_mbed lklk CyaSSL_DTLS_Cellular ... more

Superseded

This library was superseded by mbed-dev - https://os.mbed.com/users/mbed_official/code/mbed-dev/.

Development branch of the mbed library sources. This library is kept in synch with the latest changes from the mbed SDK and it is not guaranteed to work.

If you are looking for a stable and tested release, please import one of the official mbed library releases:

Import librarymbed

The official Mbed 2 C/C++ SDK provides the software platform and libraries to build your applications.

Committer:
mbed_official
Date:
Fri Sep 11 09:30:09 2015 +0100
Revision:
621:9c82b0f79f3d
Parent:
546:a843b1cd80b8
Synchronized with git revision 6c1d63e069ab9bd86de92e8296ca783681257538

Full URL: https://github.com/mbedmicro/mbed/commit/6c1d63e069ab9bd86de92e8296ca783681257538/

ignore target files not supported by the yotta module

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 514:7668256dbe61 1 /*******************************************************************************
mbed_official 514:7668256dbe61 2 * Copyright (C) 2015 Maxim Integrated Products, Inc., All Rights Reserved.
mbed_official 514:7668256dbe61 3 *
mbed_official 514:7668256dbe61 4 * Permission is hereby granted, free of charge, to any person obtaining a
mbed_official 514:7668256dbe61 5 * copy of this software and associated documentation files (the "Software"),
mbed_official 514:7668256dbe61 6 * to deal in the Software without restriction, including without limitation
mbed_official 514:7668256dbe61 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
mbed_official 514:7668256dbe61 8 * and/or sell copies of the Software, and to permit persons to whom the
mbed_official 514:7668256dbe61 9 * Software is furnished to do so, subject to the following conditions:
mbed_official 514:7668256dbe61 10 *
mbed_official 514:7668256dbe61 11 * The above copyright notice and this permission notice shall be included
mbed_official 514:7668256dbe61 12 * in all copies or substantial portions of the Software.
mbed_official 514:7668256dbe61 13 *
mbed_official 514:7668256dbe61 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
mbed_official 514:7668256dbe61 15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
mbed_official 514:7668256dbe61 16 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
mbed_official 514:7668256dbe61 17 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
mbed_official 514:7668256dbe61 18 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
mbed_official 514:7668256dbe61 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
mbed_official 514:7668256dbe61 20 * OTHER DEALINGS IN THE SOFTWARE.
mbed_official 514:7668256dbe61 21 *
mbed_official 514:7668256dbe61 22 * Except as contained in this notice, the name of Maxim Integrated
mbed_official 514:7668256dbe61 23 * Products, Inc. shall not be used except as stated in the Maxim Integrated
mbed_official 514:7668256dbe61 24 * Products, Inc. Branding Policy.
mbed_official 514:7668256dbe61 25 *
mbed_official 514:7668256dbe61 26 * The mere transfer of this software does not imply any licenses
mbed_official 514:7668256dbe61 27 * of trade secrets, proprietary technology, copyrights, patents,
mbed_official 514:7668256dbe61 28 * trademarks, maskwork rights, or any other form of intellectual
mbed_official 514:7668256dbe61 29 * property whatsoever. Maxim Integrated Products, Inc. retains all
mbed_official 514:7668256dbe61 30 * ownership rights.
mbed_official 514:7668256dbe61 31 *******************************************************************************
mbed_official 514:7668256dbe61 32 */
mbed_official 514:7668256dbe61 33
mbed_official 514:7668256dbe61 34 #include <string.h>
mbed_official 514:7668256dbe61 35 #include "mbed_assert.h"
mbed_official 514:7668256dbe61 36 #include "cmsis.h"
mbed_official 514:7668256dbe61 37 #include "spi_api.h"
mbed_official 514:7668256dbe61 38 #include "pinmap.h"
mbed_official 514:7668256dbe61 39 #include "ioman_regs.h"
mbed_official 514:7668256dbe61 40 #include "clkman_regs.h"
mbed_official 514:7668256dbe61 41 #include "PeripheralPins.h"
mbed_official 514:7668256dbe61 42
mbed_official 514:7668256dbe61 43 #define DEFAULT_CHAR 8
mbed_official 514:7668256dbe61 44 #define DEFAULT_MODE 0
mbed_official 514:7668256dbe61 45 #define DEFAULT_FREQ 1000000
mbed_official 514:7668256dbe61 46
mbed_official 514:7668256dbe61 47 // Formatting settings
mbed_official 514:7668256dbe61 48 static int spi_bits;
mbed_official 514:7668256dbe61 49
mbed_official 514:7668256dbe61 50 //******************************************************************************
mbed_official 514:7668256dbe61 51 void spi_init(spi_t *obj, PinName mosi, PinName miso, PinName sclk, PinName ssel)
mbed_official 514:7668256dbe61 52 {
mbed_official 514:7668256dbe61 53 // Make sure pins are pointing to the same SPI instance
mbed_official 514:7668256dbe61 54 SPIName spi_mosi = (SPIName)pinmap_peripheral(mosi, PinMap_SPI_MOSI);
mbed_official 514:7668256dbe61 55 SPIName spi_miso = (SPIName)pinmap_peripheral(miso, PinMap_SPI_MISO);
mbed_official 514:7668256dbe61 56 SPIName spi_sclk = (SPIName)pinmap_peripheral(sclk, PinMap_SPI_SCLK);
mbed_official 514:7668256dbe61 57 SPIName spi_ssel = (SPIName)pinmap_peripheral(ssel, PinMap_SPI_SSEL);
mbed_official 514:7668256dbe61 58
mbed_official 514:7668256dbe61 59 SPIName spi_data = (SPIName)pinmap_merge(spi_mosi, spi_miso);
mbed_official 514:7668256dbe61 60 SPIName spi_cntl;
mbed_official 514:7668256dbe61 61
mbed_official 514:7668256dbe61 62 // Give the application the option to manually control Slave Select
mbed_official 514:7668256dbe61 63 if((SPIName)spi_ssel != (SPIName)NC) {
mbed_official 514:7668256dbe61 64 spi_cntl = (SPIName)pinmap_merge(spi_sclk, spi_ssel);
mbed_official 514:7668256dbe61 65 } else {
mbed_official 514:7668256dbe61 66 spi_cntl = spi_sclk;
mbed_official 514:7668256dbe61 67 }
mbed_official 514:7668256dbe61 68
mbed_official 514:7668256dbe61 69 SPIName spi = (SPIName)pinmap_merge(spi_data, spi_cntl);
mbed_official 514:7668256dbe61 70
mbed_official 514:7668256dbe61 71 MBED_ASSERT((SPIName)spi != (SPIName)NC);
mbed_official 514:7668256dbe61 72
mbed_official 514:7668256dbe61 73 // Set the obj pointer to the proper SPI Instance
mbed_official 514:7668256dbe61 74 obj->spi = (mxc_spi_regs_t*)spi;
mbed_official 514:7668256dbe61 75
mbed_official 514:7668256dbe61 76 // Set the SPI index and FIFOs
mbed_official 514:7668256dbe61 77 obj->index = MXC_SPI_BASE_TO_INSTANCE(obj->spi);
mbed_official 514:7668256dbe61 78 obj->rxfifo = MXC_SPI_GET_RXFIFO(obj->index);
mbed_official 514:7668256dbe61 79 obj->txfifo = MXC_SPI_GET_TXFIFO(obj->index);
mbed_official 514:7668256dbe61 80
mbed_official 514:7668256dbe61 81 // Configure the pins
mbed_official 514:7668256dbe61 82 pinmap_pinout(mosi, PinMap_SPI_MOSI);
mbed_official 514:7668256dbe61 83 pinmap_pinout(miso, PinMap_SPI_MISO);
mbed_official 514:7668256dbe61 84 pinmap_pinout(sclk, PinMap_SPI_SCLK);
mbed_official 514:7668256dbe61 85 pinmap_pinout(ssel, PinMap_SPI_SSEL);
mbed_official 514:7668256dbe61 86
mbed_official 514:7668256dbe61 87 // Enable SPI and FIFOs
mbed_official 514:7668256dbe61 88 obj->spi->gen_ctrl = (MXC_F_SPI_GEN_CTRL_SPI_MSTR_EN |
mbed_official 514:7668256dbe61 89 MXC_F_SPI_GEN_CTRL_TX_FIFO_EN |
mbed_official 514:7668256dbe61 90 MXC_F_SPI_GEN_CTRL_RX_FIFO_EN );
mbed_official 514:7668256dbe61 91
mbed_official 514:7668256dbe61 92 // Give instance the default settings
mbed_official 514:7668256dbe61 93 spi_format(obj, DEFAULT_CHAR, DEFAULT_MODE, 0);
mbed_official 514:7668256dbe61 94 spi_frequency(obj, DEFAULT_FREQ);
mbed_official 514:7668256dbe61 95 }
mbed_official 514:7668256dbe61 96
mbed_official 514:7668256dbe61 97 //******************************************************************************
mbed_official 514:7668256dbe61 98 void spi_format(spi_t *obj, int bits, int mode, int slave)
mbed_official 514:7668256dbe61 99 {
mbed_official 514:7668256dbe61 100 // Check the validity of the inputs
mbed_official 514:7668256dbe61 101 MBED_ASSERT(((bits >= 1) && (bits <= 32)) && ((mode >= 0) && (mode <= 3)));
mbed_official 514:7668256dbe61 102
mbed_official 514:7668256dbe61 103 // Only supports master mode
mbed_official 514:7668256dbe61 104 MBED_ASSERT(!slave);
mbed_official 514:7668256dbe61 105
mbed_official 514:7668256dbe61 106 // Save formatting data
mbed_official 514:7668256dbe61 107 spi_bits = bits;
mbed_official 514:7668256dbe61 108
mbed_official 514:7668256dbe61 109 // Set the mode
mbed_official 514:7668256dbe61 110 obj->spi->mstr_cfg &= ~(MXC_F_SPI_MSTR_CFG_SPI_MODE);
mbed_official 514:7668256dbe61 111 obj->spi->mstr_cfg |= (mode << MXC_F_SPI_MSTR_CFG_SPI_MODE_POS);
mbed_official 514:7668256dbe61 112 }
mbed_official 514:7668256dbe61 113
mbed_official 514:7668256dbe61 114 //******************************************************************************
mbed_official 514:7668256dbe61 115 void spi_frequency(spi_t *obj, int hz)
mbed_official 514:7668256dbe61 116 {
mbed_official 514:7668256dbe61 117 // Maximum frequency is half the system frequency
mbed_official 546:a843b1cd80b8 118 MBED_ASSERT((unsigned int)hz <= (SystemCoreClock / 2));
mbed_official 514:7668256dbe61 119 unsigned clocks = ((SystemCoreClock/2)/(hz));
mbed_official 514:7668256dbe61 120
mbed_official 514:7668256dbe61 121 // Figure out the divider ratio
mbed_official 514:7668256dbe61 122 int clk_div = 1;
mbed_official 514:7668256dbe61 123 while(clk_div < 10) {
mbed_official 514:7668256dbe61 124 if(clocks < 0x10) {
mbed_official 514:7668256dbe61 125 break;
mbed_official 514:7668256dbe61 126 }
mbed_official 514:7668256dbe61 127 clk_div++;
mbed_official 514:7668256dbe61 128 clocks = clocks >> 1;
mbed_official 514:7668256dbe61 129 }
mbed_official 514:7668256dbe61 130
mbed_official 514:7668256dbe61 131 // Turn on the SPI clock
mbed_official 514:7668256dbe61 132 if(obj->index == 0) {
mbed_official 514:7668256dbe61 133 MXC_CLKMAN->clk_ctrl_3_spi0 = clk_div;
mbed_official 514:7668256dbe61 134 } else if(obj->index == 1) {
mbed_official 514:7668256dbe61 135 MXC_CLKMAN->clk_ctrl_4_spi1 = clk_div;
mbed_official 514:7668256dbe61 136 } else if(obj->index == 2) {
mbed_official 514:7668256dbe61 137 MXC_CLKMAN->clk_ctrl_5_spi2 = clk_div;
mbed_official 514:7668256dbe61 138 } else {
mbed_official 514:7668256dbe61 139 MBED_ASSERT(0);
mbed_official 514:7668256dbe61 140 }
mbed_official 514:7668256dbe61 141
mbed_official 514:7668256dbe61 142 // Set the number of clocks to hold sclk high and low
mbed_official 514:7668256dbe61 143 MXC_SET_FIELD(&obj->spi->mstr_cfg, (MXC_F_SPI_MSTR_CFG_SCK_HI_CLK | MXC_F_SPI_MSTR_CFG_SCK_LO_CLK),
mbed_official 514:7668256dbe61 144 ((clocks << MXC_F_SPI_MSTR_CFG_SCK_HI_CLK_POS) | (clocks << MXC_F_SPI_MSTR_CFG_SCK_LO_CLK_POS)));
mbed_official 514:7668256dbe61 145 }
mbed_official 514:7668256dbe61 146
mbed_official 514:7668256dbe61 147 //******************************************************************************
mbed_official 514:7668256dbe61 148 int spi_master_write(spi_t *obj, int value)
mbed_official 514:7668256dbe61 149 {
mbed_official 514:7668256dbe61 150 int bits = spi_bits;
mbed_official 514:7668256dbe61 151 if(spi_bits == 32) {
mbed_official 514:7668256dbe61 152 bits = 0;
mbed_official 514:7668256dbe61 153 }
mbed_official 514:7668256dbe61 154 // Create the header
mbed_official 514:7668256dbe61 155 uint16_t header = ((0x3 << MXC_F_SPI_FIFO_DIR_POS ) | // TX and RX
mbed_official 514:7668256dbe61 156 (0x0 << MXC_F_SPI_FIFO_UNIT_POS) | // Send bits
mbed_official 514:7668256dbe61 157 (bits << MXC_F_SPI_FIFO_SIZE_POS) | // Number of units
mbed_official 514:7668256dbe61 158 (0x1 << MXC_F_SPI_FIFO_DASS_POS)); // Deassert SS
mbed_official 514:7668256dbe61 159
mbed_official 514:7668256dbe61 160 // Send the message header
mbed_official 514:7668256dbe61 161 obj->txfifo->txfifo_16 = header;
mbed_official 514:7668256dbe61 162
mbed_official 514:7668256dbe61 163 // Send the data
mbed_official 514:7668256dbe61 164 if(spi_bits < 17) {
mbed_official 514:7668256dbe61 165 obj->txfifo->txfifo_16 = (uint16_t)value;
mbed_official 514:7668256dbe61 166 } else {
mbed_official 514:7668256dbe61 167 obj->txfifo->txfifo_32 = (uint32_t)value;
mbed_official 514:7668256dbe61 168 }
mbed_official 514:7668256dbe61 169
mbed_official 514:7668256dbe61 170 // Get the data
mbed_official 514:7668256dbe61 171 bits = spi_bits;
mbed_official 514:7668256dbe61 172 int result = 0;
mbed_official 514:7668256dbe61 173 int i = 0;
mbed_official 514:7668256dbe61 174 while(bits > 0) {
mbed_official 514:7668256dbe61 175 // Wait for data
mbed_official 514:7668256dbe61 176 while(((obj->spi->fifo_ctrl & MXC_F_SPI_FIFO_CTRL_RX_FIFO_USED)
mbed_official 514:7668256dbe61 177 >> MXC_F_SPI_FIFO_CTRL_RX_FIFO_USED_POS) < 1) {}
mbed_official 514:7668256dbe61 178
mbed_official 514:7668256dbe61 179 result |= (obj->rxfifo->rxfifo_8 << (i++*8));
mbed_official 514:7668256dbe61 180 bits-=8;
mbed_official 514:7668256dbe61 181 }
mbed_official 514:7668256dbe61 182
mbed_official 514:7668256dbe61 183 return result;
mbed_official 514:7668256dbe61 184 }
mbed_official 514:7668256dbe61 185
mbed_official 514:7668256dbe61 186 //******************************************************************************
mbed_official 514:7668256dbe61 187 int spi_busy(spi_t *obj)
mbed_official 514:7668256dbe61 188 {
mbed_official 514:7668256dbe61 189 return !(obj->spi->intfl & MXC_F_SPI_INTFL_TX_READY);
mbed_official 514:7668256dbe61 190 }