added prescaler for 16 bit pwm in LPC1347 target

Fork of mbed-dev by mbed official

Committer:
mbed_official
Date:
Tue May 03 00:15:16 2016 +0100
Revision:
121:7f86b4238bec
Synchronized with git revision 9cef243de23875778f461bbe9a8c1bc47e65212b

Full URL: https://github.com/mbedmicro/mbed/commit/9cef243de23875778f461bbe9a8c1bc47e65212b/

Switch to KSDK 2.0

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 121:7f86b4238bec 1 /* mbed Microcontroller Library
mbed_official 121:7f86b4238bec 2 * Copyright (c) 2013 ARM Limited
mbed_official 121:7f86b4238bec 3 *
mbed_official 121:7f86b4238bec 4 * Licensed under the Apache License, Version 2.0 (the "License");
mbed_official 121:7f86b4238bec 5 * you may not use this file except in compliance with the License.
mbed_official 121:7f86b4238bec 6 * You may obtain a copy of the License at
mbed_official 121:7f86b4238bec 7 *
mbed_official 121:7f86b4238bec 8 * http://www.apache.org/licenses/LICENSE-2.0
mbed_official 121:7f86b4238bec 9 *
mbed_official 121:7f86b4238bec 10 * Unless required by applicable law or agreed to in writing, software
mbed_official 121:7f86b4238bec 11 * distributed under the License is distributed on an "AS IS" BASIS,
mbed_official 121:7f86b4238bec 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
mbed_official 121:7f86b4238bec 13 * See the License for the specific language governing permissions and
mbed_official 121:7f86b4238bec 14 * limitations under the License.
mbed_official 121:7f86b4238bec 15 */
mbed_official 121:7f86b4238bec 16 #include <math.h>
mbed_official 121:7f86b4238bec 17 #include "mbed_assert.h"
mbed_official 121:7f86b4238bec 18
mbed_official 121:7f86b4238bec 19 #include "spi_api.h"
mbed_official 121:7f86b4238bec 20
mbed_official 121:7f86b4238bec 21 #if DEVICE_SPI
mbed_official 121:7f86b4238bec 22
mbed_official 121:7f86b4238bec 23 #include "cmsis.h"
mbed_official 121:7f86b4238bec 24 #include "pinmap.h"
mbed_official 121:7f86b4238bec 25 #include "mbed_error.h"
mbed_official 121:7f86b4238bec 26 #include "fsl_spi.h"
mbed_official 121:7f86b4238bec 27 #include "peripheral_clock_defines.h"
mbed_official 121:7f86b4238bec 28 #include "PeripheralPins.h"
mbed_official 121:7f86b4238bec 29
mbed_official 121:7f86b4238bec 30 /* Array of SPI peripheral base address. */
mbed_official 121:7f86b4238bec 31 static SPI_Type *const spi_address[] = SPI_BASE_PTRS;
mbed_official 121:7f86b4238bec 32 /* Array of SPI bus clock frequencies */
mbed_official 121:7f86b4238bec 33 static clock_name_t const spi_clocks[] = SPI_CLOCK_FREQS;
mbed_official 121:7f86b4238bec 34
mbed_official 121:7f86b4238bec 35 void spi_init(spi_t *obj, PinName mosi, PinName miso, PinName sclk, PinName ssel) {
mbed_official 121:7f86b4238bec 36 // determine the SPI to use
mbed_official 121:7f86b4238bec 37 uint32_t spi_mosi = pinmap_peripheral(mosi, PinMap_SPI_MOSI);
mbed_official 121:7f86b4238bec 38 uint32_t spi_miso = pinmap_peripheral(miso, PinMap_SPI_MISO);
mbed_official 121:7f86b4238bec 39 uint32_t spi_sclk = pinmap_peripheral(sclk, PinMap_SPI_SCLK);
mbed_official 121:7f86b4238bec 40 uint32_t spi_ssel = pinmap_peripheral(ssel, PinMap_SPI_SSEL);
mbed_official 121:7f86b4238bec 41 uint32_t spi_data = pinmap_merge(spi_mosi, spi_miso);
mbed_official 121:7f86b4238bec 42 uint32_t spi_cntl = pinmap_merge(spi_sclk, spi_ssel);
mbed_official 121:7f86b4238bec 43
mbed_official 121:7f86b4238bec 44 obj->instance = pinmap_merge(spi_data, spi_cntl);
mbed_official 121:7f86b4238bec 45 MBED_ASSERT((int)obj->instance != NC);
mbed_official 121:7f86b4238bec 46
mbed_official 121:7f86b4238bec 47 // pin out the spi pins
mbed_official 121:7f86b4238bec 48 pinmap_pinout(mosi, PinMap_SPI_MOSI);
mbed_official 121:7f86b4238bec 49 pinmap_pinout(miso, PinMap_SPI_MISO);
mbed_official 121:7f86b4238bec 50 pinmap_pinout(sclk, PinMap_SPI_SCLK);
mbed_official 121:7f86b4238bec 51 if (ssel != NC) {
mbed_official 121:7f86b4238bec 52 pinmap_pinout(ssel, PinMap_SPI_SSEL);
mbed_official 121:7f86b4238bec 53 }
mbed_official 121:7f86b4238bec 54 }
mbed_official 121:7f86b4238bec 55
mbed_official 121:7f86b4238bec 56 void spi_free(spi_t *obj) {
mbed_official 121:7f86b4238bec 57 SPI_Deinit(spi_address[obj->instance]);
mbed_official 121:7f86b4238bec 58 }
mbed_official 121:7f86b4238bec 59
mbed_official 121:7f86b4238bec 60 void spi_format(spi_t *obj, int bits, int mode, int slave) {
mbed_official 121:7f86b4238bec 61
mbed_official 121:7f86b4238bec 62 spi_master_config_t master_config;
mbed_official 121:7f86b4238bec 63 spi_slave_config_t slave_config;
mbed_official 121:7f86b4238bec 64
mbed_official 121:7f86b4238bec 65 if ((bits != 8) || (bits != 16)) {
mbed_official 121:7f86b4238bec 66 error("Only 8bits and 16bits SPI supported");
mbed_official 121:7f86b4238bec 67 return;
mbed_official 121:7f86b4238bec 68 }
mbed_official 121:7f86b4238bec 69
mbed_official 121:7f86b4238bec 70 if (slave) {
mbed_official 121:7f86b4238bec 71 /* Slave config */
mbed_official 121:7f86b4238bec 72 SPI_SlaveGetDefaultConfig(&slave_config);
mbed_official 121:7f86b4238bec 73 slave_config.dataMode = (bits == 16) ? kSPI_16BitMode : kSPI_8BitMode;
mbed_official 121:7f86b4238bec 74 slave_config.polarity = (mode & 0x2) ? kSPI_ClockPolarityActiveLow : kSPI_ClockPolarityActiveHigh;
mbed_official 121:7f86b4238bec 75 slave_config.phase = (mode & 0x1) ? kSPI_ClockPhaseSecondEdge : kSPI_ClockPhaseFirstEdge;
mbed_official 121:7f86b4238bec 76
mbed_official 121:7f86b4238bec 77 SPI_SlaveInit(spi_address[obj->instance], &slave_config);
mbed_official 121:7f86b4238bec 78 } else {
mbed_official 121:7f86b4238bec 79 /* Master config */
mbed_official 121:7f86b4238bec 80 SPI_MasterGetDefaultConfig(&master_config);
mbed_official 121:7f86b4238bec 81 master_config.dataMode = (bits == 16) ? kSPI_16BitMode : kSPI_8BitMode;
mbed_official 121:7f86b4238bec 82 master_config.polarity = (mode & 0x2) ? kSPI_ClockPolarityActiveLow : kSPI_ClockPolarityActiveHigh;
mbed_official 121:7f86b4238bec 83 master_config.phase = (mode & 0x1) ? kSPI_ClockPhaseSecondEdge : kSPI_ClockPhaseFirstEdge;
mbed_official 121:7f86b4238bec 84 master_config.direction = kSPI_MsbFirst;
mbed_official 121:7f86b4238bec 85
mbed_official 121:7f86b4238bec 86 SPI_MasterInit(spi_address[obj->instance], &master_config, CLOCK_GetFreq(spi_clocks[obj->instance]));
mbed_official 121:7f86b4238bec 87 }
mbed_official 121:7f86b4238bec 88 }
mbed_official 121:7f86b4238bec 89
mbed_official 121:7f86b4238bec 90 void spi_frequency(spi_t *obj, int hz) {
mbed_official 121:7f86b4238bec 91 SPI_MasterSetBaudRate(spi_address[obj->instance], (uint32_t)hz, CLOCK_GetFreq(spi_clocks[obj->instance]));
mbed_official 121:7f86b4238bec 92 }
mbed_official 121:7f86b4238bec 93
mbed_official 121:7f86b4238bec 94 static inline int spi_readable(spi_t * obj) {
mbed_official 121:7f86b4238bec 95 return (SPI_GetStatusFlags(spi_address[obj->instance]) & kSPI_RxBufferFullFlag);
mbed_official 121:7f86b4238bec 96 }
mbed_official 121:7f86b4238bec 97
mbed_official 121:7f86b4238bec 98 int spi_master_write(spi_t *obj, int value) {
mbed_official 121:7f86b4238bec 99 spi_transfer_t xfer = {0};
mbed_official 121:7f86b4238bec 100 uint32_t rx_data;
mbed_official 121:7f86b4238bec 101 SPI_Type *base = spi_address[obj->instance];
mbed_official 121:7f86b4238bec 102
mbed_official 121:7f86b4238bec 103 /* SPI master start transfer */
mbed_official 121:7f86b4238bec 104 xfer.txData = (uint8_t *)&value;
mbed_official 121:7f86b4238bec 105 xfer.rxData = (uint8_t *)&rx_data;
mbed_official 121:7f86b4238bec 106 xfer.dataSize = ((base->C2 & SPI_C2_SPIMODE_MASK) >> SPI_C2_SPIMODE_SHIFT) + 1U;
mbed_official 121:7f86b4238bec 107 SPI_MasterTransferBlocking(base, &xfer);
mbed_official 121:7f86b4238bec 108
mbed_official 121:7f86b4238bec 109 return rx_data & 0xffff;
mbed_official 121:7f86b4238bec 110 }
mbed_official 121:7f86b4238bec 111
mbed_official 121:7f86b4238bec 112 int spi_slave_receive(spi_t *obj) {
mbed_official 121:7f86b4238bec 113 return spi_readable(obj);
mbed_official 121:7f86b4238bec 114 }
mbed_official 121:7f86b4238bec 115
mbed_official 121:7f86b4238bec 116 int spi_slave_read(spi_t *obj) {
mbed_official 121:7f86b4238bec 117 uint32_t rx_data;
mbed_official 121:7f86b4238bec 118
mbed_official 121:7f86b4238bec 119 while (!spi_readable(obj));
mbed_official 121:7f86b4238bec 120 rx_data = SPI_ReadData(spi_address[obj->instance]);
mbed_official 121:7f86b4238bec 121
mbed_official 121:7f86b4238bec 122 return rx_data & 0xffff;
mbed_official 121:7f86b4238bec 123 }
mbed_official 121:7f86b4238bec 124
mbed_official 121:7f86b4238bec 125 void spi_slave_write(spi_t *obj, int value) {
mbed_official 121:7f86b4238bec 126 SPI_Type *base = spi_address[obj->instance];
mbed_official 121:7f86b4238bec 127 size_t size = ((base->C2 & SPI_C2_SPIMODE_MASK) >> SPI_C2_SPIMODE_SHIFT) + 1U;
mbed_official 121:7f86b4238bec 128 SPI_WriteBlocking(spi_address[obj->instance], (uint8_t *)&value, size);
mbed_official 121:7f86b4238bec 129 }
mbed_official 121:7f86b4238bec 130
mbed_official 121:7f86b4238bec 131 #endif