Team DIANA / mbed-src

Dependents:   MX106-finaltest

Fork of mbed-src by mbed official

Committer:
mbed_official
Date:
Thu Apr 16 11:45:13 2015 +0100
Revision:
514:7668256dbe61
Child:
546:a843b1cd80b8
Synchronized with git revision 29ab478a78892415a3c721cdc20b1755b7b01ba1

Full URL: https://github.com/mbedmicro/mbed/commit/29ab478a78892415a3c721cdc20b1755b7b01ba1/

LPC824, SSCI824 - Add GCC_ARM exporter support

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 514:7668256dbe61 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 }