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:
Wed Jul 08 14:45:08 2015 +0100
Revision:
585:a1ed5b41f74f
Synchronized with git revision 7a2b57896e0263b82f31ddc5a0ad2443615db184

Full URL: https://github.com/mbedmicro/mbed/commit/7a2b57896e0263b82f31ddc5a0ad2443615db184/

Add rtc_api.c

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 585:a1ed5b41f74f 1 /* mbed Microcontroller Library
mbed_official 585:a1ed5b41f74f 2 * Copyright (c) 2006-2013 ARM Limited
mbed_official 585:a1ed5b41f74f 3 *
mbed_official 585:a1ed5b41f74f 4 * Licensed under the Apache License, Version 2.0 (the "License");
mbed_official 585:a1ed5b41f74f 5 * you may not use this file except in compliance with the License.
mbed_official 585:a1ed5b41f74f 6 * You may obtain a copy of the License at
mbed_official 585:a1ed5b41f74f 7 *
mbed_official 585:a1ed5b41f74f 8 * http://www.apache.org/licenses/LICENSE-2.0
mbed_official 585:a1ed5b41f74f 9 *
mbed_official 585:a1ed5b41f74f 10 * Unless required by applicable law or agreed to in writing, software
mbed_official 585:a1ed5b41f74f 11 * distributed under the License is distributed on an "AS IS" BASIS,
mbed_official 585:a1ed5b41f74f 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
mbed_official 585:a1ed5b41f74f 13 * See the License for the specific language governing permissions and
mbed_official 585:a1ed5b41f74f 14 * limitations under the License.
mbed_official 585:a1ed5b41f74f 15 */
mbed_official 585:a1ed5b41f74f 16 #include "mbed_assert.h"
mbed_official 585:a1ed5b41f74f 17 #include "spi_api.h"
mbed_official 585:a1ed5b41f74f 18
mbed_official 585:a1ed5b41f74f 19 #include <math.h>
mbed_official 585:a1ed5b41f74f 20
mbed_official 585:a1ed5b41f74f 21 #include "cmsis.h"
mbed_official 585:a1ed5b41f74f 22 #include "pinmap.h"
mbed_official 585:a1ed5b41f74f 23
mbed_official 585:a1ed5b41f74f 24 static const PinMap PinMap_SPI_SCLK[] = {
mbed_official 585:a1ed5b41f74f 25 {PTA15, SPI_0, 2},
mbed_official 585:a1ed5b41f74f 26 {PTB9, SPI_1, 2},
mbed_official 585:a1ed5b41f74f 27 {PTB11, SPI_1, 2},
mbed_official 585:a1ed5b41f74f 28 {PTC5, SPI_0, 2},
mbed_official 585:a1ed5b41f74f 29 {PTD1, SPI_0, 2},
mbed_official 585:a1ed5b41f74f 30 {PTD5, SPI_1, 2},
mbed_official 585:a1ed5b41f74f 31 {PTE2, SPI_1, 2},
mbed_official 585:a1ed5b41f74f 32 {PTE17, SPI_0, 2},
mbed_official 585:a1ed5b41f74f 33 {NC , NC , 0}
mbed_official 585:a1ed5b41f74f 34 };
mbed_official 585:a1ed5b41f74f 35
mbed_official 585:a1ed5b41f74f 36 static const PinMap PinMap_SPI_MOSI[] = {
mbed_official 585:a1ed5b41f74f 37 {PTA16, SPI_0, 2},
mbed_official 585:a1ed5b41f74f 38 {PTA17, SPI_0, 5},
mbed_official 585:a1ed5b41f74f 39 {PTB16, SPI_1, 2},
mbed_official 585:a1ed5b41f74f 40 {PTB17, SPI_1, 5},
mbed_official 585:a1ed5b41f74f 41 {PTC6, SPI_0, 2},
mbed_official 585:a1ed5b41f74f 42 {PTC7, SPI_0, 5},
mbed_official 585:a1ed5b41f74f 43 {PTD2, SPI_0, 2},
mbed_official 585:a1ed5b41f74f 44 {PTD3, SPI_0, 5},
mbed_official 585:a1ed5b41f74f 45 {PTD6, SPI_1, 2},
mbed_official 585:a1ed5b41f74f 46 {PTD7, SPI_1, 5},
mbed_official 585:a1ed5b41f74f 47 {PTE1, SPI_1, 2},
mbed_official 585:a1ed5b41f74f 48 {PTE3, SPI_1, 5},
mbed_official 585:a1ed5b41f74f 49 {PTE18, SPI_0, 2},
mbed_official 585:a1ed5b41f74f 50 {PTE19, SPI_0, 5},
mbed_official 585:a1ed5b41f74f 51 {NC , NC , 0}
mbed_official 585:a1ed5b41f74f 52 };
mbed_official 585:a1ed5b41f74f 53
mbed_official 585:a1ed5b41f74f 54 static const PinMap PinMap_SPI_MISO[] = {
mbed_official 585:a1ed5b41f74f 55 {PTA16, SPI_0, 5},
mbed_official 585:a1ed5b41f74f 56 {PTA17, SPI_0, 2},
mbed_official 585:a1ed5b41f74f 57 {PTB16, SPI_1, 5},
mbed_official 585:a1ed5b41f74f 58 {PTB17, SPI_1, 2},
mbed_official 585:a1ed5b41f74f 59 {PTC6, SPI_0, 5},
mbed_official 585:a1ed5b41f74f 60 {PTC7, SPI_0, 2},
mbed_official 585:a1ed5b41f74f 61 {PTD2, SPI_0, 5},
mbed_official 585:a1ed5b41f74f 62 {PTD3, SPI_0, 2},
mbed_official 585:a1ed5b41f74f 63 {PTD6, SPI_1, 5},
mbed_official 585:a1ed5b41f74f 64 {PTD7, SPI_1, 2},
mbed_official 585:a1ed5b41f74f 65 {PTE1, SPI_1, 5},
mbed_official 585:a1ed5b41f74f 66 {PTE3, SPI_1, 2},
mbed_official 585:a1ed5b41f74f 67 {PTE18, SPI_0, 5},
mbed_official 585:a1ed5b41f74f 68 {PTE19, SPI_0, 2},
mbed_official 585:a1ed5b41f74f 69 {NC , NC , 0}
mbed_official 585:a1ed5b41f74f 70 };
mbed_official 585:a1ed5b41f74f 71
mbed_official 585:a1ed5b41f74f 72 static const PinMap PinMap_SPI_SSEL[] = {
mbed_official 585:a1ed5b41f74f 73 {PTA14, SPI_0, 2},
mbed_official 585:a1ed5b41f74f 74 {PTB10, SPI_1, 2},
mbed_official 585:a1ed5b41f74f 75 {PTC4, SPI_0, 2},
mbed_official 585:a1ed5b41f74f 76 {PTD0, SPI_0, 2},
mbed_official 585:a1ed5b41f74f 77 {PTD4, SPI_1, 2},
mbed_official 585:a1ed5b41f74f 78 {PTE4, SPI_1, 2},
mbed_official 585:a1ed5b41f74f 79 {PTE16, SPI_0, 2},
mbed_official 585:a1ed5b41f74f 80 {NC , NC , 0}
mbed_official 585:a1ed5b41f74f 81 };
mbed_official 585:a1ed5b41f74f 82
mbed_official 585:a1ed5b41f74f 83 void spi_init(spi_t *obj, PinName mosi, PinName miso, PinName sclk, PinName ssel) {
mbed_official 585:a1ed5b41f74f 84 // determine the SPI to use
mbed_official 585:a1ed5b41f74f 85 SPIName spi_mosi = (SPIName)pinmap_peripheral(mosi, PinMap_SPI_MOSI);
mbed_official 585:a1ed5b41f74f 86 SPIName spi_miso = (SPIName)pinmap_peripheral(miso, PinMap_SPI_MISO);
mbed_official 585:a1ed5b41f74f 87 SPIName spi_sclk = (SPIName)pinmap_peripheral(sclk, PinMap_SPI_SCLK);
mbed_official 585:a1ed5b41f74f 88 SPIName spi_ssel = (SPIName)pinmap_peripheral(ssel, PinMap_SPI_SSEL);
mbed_official 585:a1ed5b41f74f 89 SPIName spi_data = (SPIName)pinmap_merge(spi_mosi, spi_miso);
mbed_official 585:a1ed5b41f74f 90 SPIName spi_cntl = (SPIName)pinmap_merge(spi_sclk, spi_ssel);
mbed_official 585:a1ed5b41f74f 91
mbed_official 585:a1ed5b41f74f 92 obj->spi = (SPI_Type*)pinmap_merge(spi_data, spi_cntl);
mbed_official 585:a1ed5b41f74f 93 MBED_ASSERT((int)obj->spi != NC);
mbed_official 585:a1ed5b41f74f 94
mbed_official 585:a1ed5b41f74f 95 // enable power and clocking
mbed_official 585:a1ed5b41f74f 96 switch ((int)obj->spi) {
mbed_official 585:a1ed5b41f74f 97 case SPI_0: SIM->SCGC5 |= 1 << 13; SIM->SCGC4 |= 1 << 22; break;
mbed_official 585:a1ed5b41f74f 98 case SPI_1: SIM->SCGC5 |= 1 << 13; SIM->SCGC4 |= 1 << 23; break;
mbed_official 585:a1ed5b41f74f 99 }
mbed_official 585:a1ed5b41f74f 100
mbed_official 585:a1ed5b41f74f 101 // enable SPI
mbed_official 585:a1ed5b41f74f 102 obj->spi->C1 |= SPI_C1_SPE_MASK;
mbed_official 585:a1ed5b41f74f 103 obj->spi->C2 &= ~SPI_C2_SPIMODE_MASK; //8bit
mbed_official 585:a1ed5b41f74f 104
mbed_official 585:a1ed5b41f74f 105 // pin out the spi pins
mbed_official 585:a1ed5b41f74f 106 pinmap_pinout(mosi, PinMap_SPI_MOSI);
mbed_official 585:a1ed5b41f74f 107 pinmap_pinout(miso, PinMap_SPI_MISO);
mbed_official 585:a1ed5b41f74f 108 pinmap_pinout(sclk, PinMap_SPI_SCLK);
mbed_official 585:a1ed5b41f74f 109 if (ssel != NC) {
mbed_official 585:a1ed5b41f74f 110 pinmap_pinout(ssel, PinMap_SPI_SSEL);
mbed_official 585:a1ed5b41f74f 111 }
mbed_official 585:a1ed5b41f74f 112 }
mbed_official 585:a1ed5b41f74f 113
mbed_official 585:a1ed5b41f74f 114 void spi_free(spi_t *obj) {
mbed_official 585:a1ed5b41f74f 115 // [TODO]
mbed_official 585:a1ed5b41f74f 116 }
mbed_official 585:a1ed5b41f74f 117 void spi_format(spi_t *obj, int bits, int mode, int slave) {
mbed_official 585:a1ed5b41f74f 118 MBED_ASSERT((bits == 8) || (bits == 16));
mbed_official 585:a1ed5b41f74f 119 MBED_ASSERT((mode >= 0) && (mode <= 3));
mbed_official 585:a1ed5b41f74f 120
mbed_official 585:a1ed5b41f74f 121 uint8_t polarity = (mode & 0x2) ? 1 : 0;
mbed_official 585:a1ed5b41f74f 122 uint8_t phase = (mode & 0x1) ? 1 : 0;
mbed_official 585:a1ed5b41f74f 123 uint8_t c1_data = ((!slave) << 4) | (polarity << 3) | (phase << 2);
mbed_official 585:a1ed5b41f74f 124
mbed_official 585:a1ed5b41f74f 125 // clear MSTR, CPOL and CPHA bits
mbed_official 585:a1ed5b41f74f 126 obj->spi->C1 &= ~(0x7 << 2);
mbed_official 585:a1ed5b41f74f 127
mbed_official 585:a1ed5b41f74f 128 // write new value
mbed_official 585:a1ed5b41f74f 129 obj->spi->C1 |= c1_data;
mbed_official 585:a1ed5b41f74f 130 if (bits == 8) {
mbed_official 585:a1ed5b41f74f 131 obj->spi->C2 &= ~SPI_C2_SPIMODE_MASK;
mbed_official 585:a1ed5b41f74f 132 } else {
mbed_official 585:a1ed5b41f74f 133 obj->spi->C2 |= SPI_C2_SPIMODE_MASK;
mbed_official 585:a1ed5b41f74f 134 }
mbed_official 585:a1ed5b41f74f 135 }
mbed_official 585:a1ed5b41f74f 136
mbed_official 585:a1ed5b41f74f 137 void spi_frequency(spi_t *obj, int hz) {
mbed_official 585:a1ed5b41f74f 138 uint32_t error = 0;
mbed_official 585:a1ed5b41f74f 139 uint32_t p_error = 0xffffffff;
mbed_official 585:a1ed5b41f74f 140 uint32_t ref = 0;
mbed_official 585:a1ed5b41f74f 141 uint8_t spr = 0;
mbed_official 585:a1ed5b41f74f 142 uint8_t ref_spr = 0;
mbed_official 585:a1ed5b41f74f 143 uint8_t ref_prescaler = 0;
mbed_official 585:a1ed5b41f74f 144
mbed_official 585:a1ed5b41f74f 145 // bus clk
mbed_official 585:a1ed5b41f74f 146 uint32_t PCLK = SystemCoreClock / (((SIM->CLKDIV1 & SIM_CLKDIV1_OUTDIV4_MASK) >> SIM_CLKDIV1_OUTDIV4_SHIFT) + 1);
mbed_official 585:a1ed5b41f74f 147 uint8_t prescaler = 1;
mbed_official 585:a1ed5b41f74f 148 uint8_t divisor = 2;
mbed_official 585:a1ed5b41f74f 149
mbed_official 585:a1ed5b41f74f 150 for (prescaler = 1; prescaler <= 8; prescaler++) {
mbed_official 585:a1ed5b41f74f 151 divisor = 2;
mbed_official 585:a1ed5b41f74f 152 for (spr = 0; spr <= 8; spr++, divisor *= 2) {
mbed_official 585:a1ed5b41f74f 153 ref = PCLK / (prescaler*divisor);
mbed_official 585:a1ed5b41f74f 154 if (ref > (uint32_t)hz)
mbed_official 585:a1ed5b41f74f 155 continue;
mbed_official 585:a1ed5b41f74f 156 error = hz - ref;
mbed_official 585:a1ed5b41f74f 157 if (error < p_error) {
mbed_official 585:a1ed5b41f74f 158 ref_spr = spr;
mbed_official 585:a1ed5b41f74f 159 ref_prescaler = prescaler - 1;
mbed_official 585:a1ed5b41f74f 160 p_error = error;
mbed_official 585:a1ed5b41f74f 161 }
mbed_official 585:a1ed5b41f74f 162 }
mbed_official 585:a1ed5b41f74f 163 }
mbed_official 585:a1ed5b41f74f 164
mbed_official 585:a1ed5b41f74f 165 // set SPPR and SPR
mbed_official 585:a1ed5b41f74f 166 obj->spi->BR = ((ref_prescaler & 0x7) << 4) | (ref_spr & 0xf);
mbed_official 585:a1ed5b41f74f 167 }
mbed_official 585:a1ed5b41f74f 168
mbed_official 585:a1ed5b41f74f 169 static inline int spi_writeable(spi_t * obj) {
mbed_official 585:a1ed5b41f74f 170 return (obj->spi->S & SPI_S_SPTEF_MASK) ? 1 : 0;
mbed_official 585:a1ed5b41f74f 171 }
mbed_official 585:a1ed5b41f74f 172
mbed_official 585:a1ed5b41f74f 173 static inline int spi_readable(spi_t * obj) {
mbed_official 585:a1ed5b41f74f 174 return (obj->spi->S & SPI_S_SPRF_MASK) ? 1 : 0;
mbed_official 585:a1ed5b41f74f 175 }
mbed_official 585:a1ed5b41f74f 176
mbed_official 585:a1ed5b41f74f 177 int spi_master_write(spi_t *obj, int value) {
mbed_official 585:a1ed5b41f74f 178 int ret;
mbed_official 585:a1ed5b41f74f 179 if (obj->spi->C2 & SPI_C2_SPIMODE_MASK) {
mbed_official 585:a1ed5b41f74f 180 // 16bit
mbed_official 585:a1ed5b41f74f 181 while(!spi_writeable(obj));
mbed_official 585:a1ed5b41f74f 182 obj->spi->DL = (value & 0xff);
mbed_official 585:a1ed5b41f74f 183 obj->spi->DH = ((value >> 8) & 0xff);
mbed_official 585:a1ed5b41f74f 184
mbed_official 585:a1ed5b41f74f 185 // wait rx buffer full
mbed_official 585:a1ed5b41f74f 186 while (!spi_readable(obj));
mbed_official 585:a1ed5b41f74f 187 ret = obj->spi->DH;
mbed_official 585:a1ed5b41f74f 188 ret = (ret << 8) | obj->spi->DL;
mbed_official 585:a1ed5b41f74f 189 } else {
mbed_official 585:a1ed5b41f74f 190 //8bit
mbed_official 585:a1ed5b41f74f 191 while(!spi_writeable(obj));
mbed_official 585:a1ed5b41f74f 192 obj->spi->DL = (value & 0xff);
mbed_official 585:a1ed5b41f74f 193
mbed_official 585:a1ed5b41f74f 194 // wait rx buffer full
mbed_official 585:a1ed5b41f74f 195 while (!spi_readable(obj));
mbed_official 585:a1ed5b41f74f 196 ret = (obj->spi->DL & 0xff);
mbed_official 585:a1ed5b41f74f 197 }
mbed_official 585:a1ed5b41f74f 198
mbed_official 585:a1ed5b41f74f 199 return ret;
mbed_official 585:a1ed5b41f74f 200 }
mbed_official 585:a1ed5b41f74f 201
mbed_official 585:a1ed5b41f74f 202 int spi_slave_receive(spi_t *obj) {
mbed_official 585:a1ed5b41f74f 203 return spi_readable(obj);
mbed_official 585:a1ed5b41f74f 204 }
mbed_official 585:a1ed5b41f74f 205
mbed_official 585:a1ed5b41f74f 206 int spi_slave_read(spi_t *obj) {
mbed_official 585:a1ed5b41f74f 207 int ret;
mbed_official 585:a1ed5b41f74f 208 if (obj->spi->C2 & SPI_C2_SPIMODE_MASK) {
mbed_official 585:a1ed5b41f74f 209 ret = obj->spi->DH;
mbed_official 585:a1ed5b41f74f 210 ret = ((ret << 8) | obj->spi->DL);
mbed_official 585:a1ed5b41f74f 211 } else {
mbed_official 585:a1ed5b41f74f 212 ret = obj->spi->DL;
mbed_official 585:a1ed5b41f74f 213 }
mbed_official 585:a1ed5b41f74f 214 return ret;
mbed_official 585:a1ed5b41f74f 215 }
mbed_official 585:a1ed5b41f74f 216
mbed_official 585:a1ed5b41f74f 217 void spi_slave_write(spi_t *obj, int value) {
mbed_official 585:a1ed5b41f74f 218 while (!spi_writeable(obj));
mbed_official 585:a1ed5b41f74f 219 if (obj->spi->C2 & SPI_C2_SPIMODE_MASK) {
mbed_official 585:a1ed5b41f74f 220 obj->spi->DL = (value & 0xff);
mbed_official 585:a1ed5b41f74f 221 obj->spi->DH = ((value >> 8) & 0xff);
mbed_official 585:a1ed5b41f74f 222 } else {
mbed_official 585:a1ed5b41f74f 223 obj->spi->DL = value;
mbed_official 585:a1ed5b41f74f 224 }
mbed_official 585:a1ed5b41f74f 225
mbed_official 585:a1ed5b41f74f 226 }