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:
552:a1b9575155a3
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 324:406fd2029f23 1 /* mbed Microcontroller Library
mbed_official 324:406fd2029f23 2 * Copyright (c) 2013 ARM Limited
mbed_official 324:406fd2029f23 3 *
mbed_official 324:406fd2029f23 4 * Licensed under the Apache License, Version 2.0 (the "License");
mbed_official 324:406fd2029f23 5 * you may not use this file except in compliance with the License.
mbed_official 324:406fd2029f23 6 * You may obtain a copy of the License at
mbed_official 324:406fd2029f23 7 *
mbed_official 324:406fd2029f23 8 * http://www.apache.org/licenses/LICENSE-2.0
mbed_official 324:406fd2029f23 9 *
mbed_official 324:406fd2029f23 10 * Unless required by applicable law or agreed to in writing, software
mbed_official 324:406fd2029f23 11 * distributed under the License is distributed on an "AS IS" BASIS,
mbed_official 324:406fd2029f23 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
mbed_official 324:406fd2029f23 13 * See the License for the specific language governing permissions and
mbed_official 324:406fd2029f23 14 * limitations under the License.
mbed_official 324:406fd2029f23 15 */
mbed_official 324:406fd2029f23 16 #include <math.h>
mbed_official 324:406fd2029f23 17 #include "mbed_assert.h"
mbed_official 324:406fd2029f23 18
mbed_official 324:406fd2029f23 19 #include "spi_api.h"
mbed_official 324:406fd2029f23 20
mbed_official 324:406fd2029f23 21 #if DEVICE_SPI
mbed_official 324:406fd2029f23 22
mbed_official 324:406fd2029f23 23 #include "cmsis.h"
mbed_official 324:406fd2029f23 24 #include "pinmap.h"
mbed_official 324:406fd2029f23 25 #include "mbed_error.h"
mbed_official 324:406fd2029f23 26 #include "fsl_clock_manager.h"
mbed_official 324:406fd2029f23 27 #include "fsl_dspi_hal.h"
mbed_official 324:406fd2029f23 28 #include "PeripheralPins.h"
mbed_official 324:406fd2029f23 29
mbed_official 324:406fd2029f23 30 void spi_init(spi_t *obj, PinName mosi, PinName miso, PinName sclk, PinName ssel) {
mbed_official 324:406fd2029f23 31 // determine the SPI to use
mbed_official 324:406fd2029f23 32 uint32_t spi_mosi = pinmap_peripheral(mosi, PinMap_SPI_MOSI);
mbed_official 324:406fd2029f23 33 uint32_t spi_miso = pinmap_peripheral(miso, PinMap_SPI_MISO);
mbed_official 324:406fd2029f23 34 uint32_t spi_sclk = pinmap_peripheral(sclk, PinMap_SPI_SCLK);
mbed_official 324:406fd2029f23 35 uint32_t spi_ssel = pinmap_peripheral(ssel, PinMap_SPI_SSEL);
mbed_official 324:406fd2029f23 36 uint32_t spi_data = pinmap_merge(spi_mosi, spi_miso);
mbed_official 324:406fd2029f23 37 uint32_t spi_cntl = pinmap_merge(spi_sclk, spi_ssel);
mbed_official 324:406fd2029f23 38
mbed_official 324:406fd2029f23 39 obj->instance = pinmap_merge(spi_data, spi_cntl);
mbed_official 324:406fd2029f23 40 MBED_ASSERT((int)obj->instance != NC);
mbed_official 324:406fd2029f23 41
mbed_official 324:406fd2029f23 42 CLOCK_SYS_EnableSpiClock(obj->instance);
mbed_official 324:406fd2029f23 43 uint32_t spi_address[] = SPI_BASE_ADDRS;
mbed_official 324:406fd2029f23 44 DSPI_HAL_Init(spi_address[obj->instance]);
mbed_official 324:406fd2029f23 45 DSPI_HAL_Disable(spi_address[obj->instance]);
mbed_official 324:406fd2029f23 46 DSPI_HAL_SetDelay(spi_address[obj->instance], kDspiCtar0, 0, 0, kDspiPcsToSck);
mbed_official 324:406fd2029f23 47
mbed_official 324:406fd2029f23 48 DSPI_HAL_Enable(spi_address[obj->instance]);
mbed_official 324:406fd2029f23 49 DSPI_HAL_StartTransfer(spi_address[obj->instance]);
mbed_official 324:406fd2029f23 50
mbed_official 324:406fd2029f23 51 // pin out the spi pins
mbed_official 324:406fd2029f23 52 pinmap_pinout(mosi, PinMap_SPI_MOSI);
mbed_official 324:406fd2029f23 53 pinmap_pinout(miso, PinMap_SPI_MISO);
mbed_official 324:406fd2029f23 54 pinmap_pinout(sclk, PinMap_SPI_SCLK);
mbed_official 324:406fd2029f23 55 if (ssel != NC) {
mbed_official 324:406fd2029f23 56 pinmap_pinout(ssel, PinMap_SPI_SSEL);
mbed_official 324:406fd2029f23 57 }
mbed_official 324:406fd2029f23 58 }
mbed_official 324:406fd2029f23 59
mbed_official 324:406fd2029f23 60 void spi_free(spi_t *obj) {
mbed_official 324:406fd2029f23 61 // [TODO]
mbed_official 324:406fd2029f23 62 }
mbed_official 324:406fd2029f23 63 void spi_format(spi_t *obj, int bits, int mode, int slave) {
mbed_official 324:406fd2029f23 64 dspi_data_format_config_t config = {0};
mbed_official 324:406fd2029f23 65 config.bitsPerFrame = (uint32_t)bits;
mbed_official 324:406fd2029f23 66 config.clkPolarity = (mode & 0x2) ? kDspiClockPolarity_ActiveLow : kDspiClockPolarity_ActiveHigh;
mbed_official 324:406fd2029f23 67 config.clkPhase = (mode & 0x1) ? kDspiClockPhase_SecondEdge : kDspiClockPhase_FirstEdge;
mbed_official 324:406fd2029f23 68 config.direction = kDspiMsbFirst;
mbed_official 324:406fd2029f23 69 uint32_t spi_address[] = SPI_BASE_ADDRS;
mbed_official 324:406fd2029f23 70 dspi_status_t result = DSPI_HAL_SetDataFormat(spi_address[obj->instance], kDspiCtar0, &config);
mbed_official 324:406fd2029f23 71 if (result != kStatus_DSPI_Success) {
mbed_official 324:406fd2029f23 72 error("Failed to configure SPI data format");
mbed_official 324:406fd2029f23 73 }
mbed_official 324:406fd2029f23 74
mbed_official 324:406fd2029f23 75 if (slave) {
mbed_official 324:406fd2029f23 76 DSPI_HAL_SetMasterSlaveMode(spi_address[obj->instance], kDspiSlave);
mbed_official 324:406fd2029f23 77 } else {
mbed_official 324:406fd2029f23 78 DSPI_HAL_SetMasterSlaveMode(spi_address[obj->instance], kDspiMaster);
mbed_official 324:406fd2029f23 79 }
mbed_official 324:406fd2029f23 80 }
mbed_official 324:406fd2029f23 81
mbed_official 324:406fd2029f23 82 void spi_frequency(spi_t *obj, int hz) {
mbed_official 324:406fd2029f23 83 uint32_t busClock;
mbed_official 324:406fd2029f23 84 CLOCK_SYS_GetFreq(kBusClock, &busClock);
mbed_official 324:406fd2029f23 85 uint32_t spi_address[] = SPI_BASE_ADDRS;
mbed_official 324:406fd2029f23 86 DSPI_HAL_SetBaudRate(spi_address[obj->instance], kDspiCtar0, (uint32_t)hz, busClock);
mbed_official 533:589848968e4d 87 DSPI_HAL_CalculateDelay(spi_address[obj->instance], kDspiCtar0, kDspiLastSckToPcs, busClock, 500000000 / hz); //Half clock period delay after SPI transfer
mbed_official 324:406fd2029f23 88 }
mbed_official 324:406fd2029f23 89
mbed_official 324:406fd2029f23 90 static inline int spi_writeable(spi_t * obj) {
mbed_official 324:406fd2029f23 91 uint32_t spi_address[] = SPI_BASE_ADDRS;
mbed_official 324:406fd2029f23 92 return DSPI_HAL_GetStatusFlag(spi_address[obj->instance], kDspiTxFifoFillRequest);
mbed_official 324:406fd2029f23 93 }
mbed_official 324:406fd2029f23 94
mbed_official 324:406fd2029f23 95 static inline int spi_readable(spi_t * obj) {
mbed_official 324:406fd2029f23 96 uint32_t spi_address[] = SPI_BASE_ADDRS;
mbed_official 324:406fd2029f23 97 return DSPI_HAL_GetStatusFlag(spi_address[obj->instance], kDspiRxFifoDrainRequest);
mbed_official 324:406fd2029f23 98 }
mbed_official 324:406fd2029f23 99
mbed_official 324:406fd2029f23 100 int spi_master_write(spi_t *obj, int value) {
mbed_official 324:406fd2029f23 101 uint32_t spi_address[] = SPI_BASE_ADDRS;
mbed_official 324:406fd2029f23 102
mbed_official 324:406fd2029f23 103 // wait tx buffer empty
mbed_official 324:406fd2029f23 104 while(!spi_writeable(obj));
mbed_official 324:406fd2029f23 105 dspi_command_config_t command = {0};
mbed_official 324:406fd2029f23 106 command.isEndOfQueue = true;
mbed_official 324:406fd2029f23 107 command.isChipSelectContinuous = 0;
mbed_official 324:406fd2029f23 108 DSPI_HAL_WriteDataMastermode(spi_address[obj->instance], &command, (uint16_t)value);
mbed_official 324:406fd2029f23 109 DSPI_HAL_ClearStatusFlag(spi_address[obj->instance], kDspiTxFifoFillRequest);
mbed_official 324:406fd2029f23 110
mbed_official 324:406fd2029f23 111 // wait rx buffer full
mbed_official 324:406fd2029f23 112 while (!spi_readable(obj));
mbed_official 324:406fd2029f23 113 DSPI_HAL_ClearStatusFlag(spi_address[obj->instance], kDspiRxFifoDrainRequest);
mbed_official 324:406fd2029f23 114 return DSPI_HAL_ReadData(spi_address[obj->instance]) & 0xff;
mbed_official 324:406fd2029f23 115 }
mbed_official 324:406fd2029f23 116
mbed_official 324:406fd2029f23 117 int spi_slave_receive(spi_t *obj) {
mbed_official 324:406fd2029f23 118 return spi_readable(obj);
mbed_official 324:406fd2029f23 119 }
mbed_official 324:406fd2029f23 120
mbed_official 324:406fd2029f23 121 int spi_slave_read(spi_t *obj) {
mbed_official 324:406fd2029f23 122 DSPI_HAL_ClearStatusFlag(obj->instance, kDspiRxFifoDrainRequest);
mbed_official 324:406fd2029f23 123 uint32_t spi_address[] = SPI_BASE_ADDRS;
mbed_official 324:406fd2029f23 124 return DSPI_HAL_ReadData(spi_address[obj->instance]);
mbed_official 324:406fd2029f23 125 }
mbed_official 324:406fd2029f23 126
mbed_official 324:406fd2029f23 127 void spi_slave_write(spi_t *obj, int value) {
mbed_official 324:406fd2029f23 128 while (!spi_writeable(obj));
mbed_official 324:406fd2029f23 129 uint32_t spi_address[] = SPI_BASE_ADDRS;
mbed_official 324:406fd2029f23 130 DSPI_HAL_WriteDataSlavemode(spi_address[obj->instance], (uint32_t)value);
mbed_official 324:406fd2029f23 131 }
mbed_official 324:406fd2029f23 132
mbed_official 324:406fd2029f23 133 #endif