added prescaler for 16 bit pwm in LPC1347 target

Fork of mbed-dev by mbed official

Committer:
JojoS
Date:
Sat Sep 10 15:32:04 2016 +0000
Revision:
147:ba84b7dc41a7
Parent:
121:7f86b4238bec
added prescaler for 16 bit timers (solution as in LPC11xx), default prescaler 31 for max 28 ms period time

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