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:
144:ef7eb2e8f9f7
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
<> 144:ef7eb2e8f9f7 1 /**
<> 144:ef7eb2e8f9f7 2 *******************************************************************************
<> 144:ef7eb2e8f9f7 3 * @file i2c.c
<> 144:ef7eb2e8f9f7 4 * @brief Implementation of an i2c api
<> 144:ef7eb2e8f9f7 5 * @internal
<> 144:ef7eb2e8f9f7 6 * @author ON Semiconductor
<> 144:ef7eb2e8f9f7 7 * $Rev: 3525 $
<> 144:ef7eb2e8f9f7 8 * $Date: 2015-07-20 15:24:25 +0530 (Mon, 20 Jul 2015) $
<> 144:ef7eb2e8f9f7 9 ******************************************************************************
<> 144:ef7eb2e8f9f7 10 * @copyright (c) 2012 ON Semiconductor. All rights reserved.
<> 144:ef7eb2e8f9f7 11 * ON Semiconductor is supplying this software for use with ON Semiconductor
<> 144:ef7eb2e8f9f7 12 * processor based microcontrollers only.
<> 144:ef7eb2e8f9f7 13 *
<> 144:ef7eb2e8f9f7 14 * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
<> 144:ef7eb2e8f9f7 15 * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
<> 144:ef7eb2e8f9f7 16 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
<> 144:ef7eb2e8f9f7 17 * ON SEMICONDUCTOR SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL,
<> 144:ef7eb2e8f9f7 18 * INCIDENTAL, OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
<> 144:ef7eb2e8f9f7 19 * @endinternal
<> 144:ef7eb2e8f9f7 20 *
<> 144:ef7eb2e8f9f7 21 * @ingroup i2c
<> 144:ef7eb2e8f9f7 22 *
<> 144:ef7eb2e8f9f7 23 */
<> 144:ef7eb2e8f9f7 24 #if DEVICE_I2C
<> 144:ef7eb2e8f9f7 25
<> 144:ef7eb2e8f9f7 26 #include "i2c.h"
<> 144:ef7eb2e8f9f7 27 #include "i2c_api.h"
<> 144:ef7eb2e8f9f7 28
<> 144:ef7eb2e8f9f7 29 #define I2C_READ_WRITE_BIT_MASK 0xFE
<> 144:ef7eb2e8f9f7 30
<> 144:ef7eb2e8f9f7 31 /* See i2c_api.h for details */
<> 144:ef7eb2e8f9f7 32 void i2c_init(i2c_t *obj, PinName sda, PinName scl)
<> 144:ef7eb2e8f9f7 33 {
<> 144:ef7eb2e8f9f7 34 fI2cInit(obj, sda, scl);
<> 144:ef7eb2e8f9f7 35 }
<> 144:ef7eb2e8f9f7 36
<> 144:ef7eb2e8f9f7 37 /* See i2c_api.h for details */
<> 144:ef7eb2e8f9f7 38 void i2c_frequency(i2c_t *obj, int hz)
<> 144:ef7eb2e8f9f7 39 {
<> 144:ef7eb2e8f9f7 40 fI2cFrequency(obj, hz);
<> 144:ef7eb2e8f9f7 41 }
<> 144:ef7eb2e8f9f7 42
<> 144:ef7eb2e8f9f7 43 /* See i2c_api.h for details */
<> 144:ef7eb2e8f9f7 44 int i2c_start(i2c_t *obj)
<> 144:ef7eb2e8f9f7 45 {
<> 144:ef7eb2e8f9f7 46 return(fI2cStart(obj));
<> 144:ef7eb2e8f9f7 47 }
<> 144:ef7eb2e8f9f7 48
<> 144:ef7eb2e8f9f7 49 /* See i2c_api.h for details */
<> 144:ef7eb2e8f9f7 50 int i2c_stop(i2c_t *obj)
<> 144:ef7eb2e8f9f7 51 {
<> 144:ef7eb2e8f9f7 52 return(fI2cStop(obj));
<> 144:ef7eb2e8f9f7 53 }
<> 144:ef7eb2e8f9f7 54
<> 144:ef7eb2e8f9f7 55 /* See i2c_api.h for details */
<> 144:ef7eb2e8f9f7 56 int i2c_read(i2c_t *obj, int address, char *data, int length, int stop)
<> 144:ef7eb2e8f9f7 57 {
<> 144:ef7eb2e8f9f7 58 /* TODO address parameter not usable */
<> 144:ef7eb2e8f9f7 59 int Count, status;
<> 144:ef7eb2e8f9f7 60 const char WriteData = (address | (~I2C_READ_WRITE_BIT_MASK)) & 0xFF;
<> 144:ef7eb2e8f9f7 61
<> 144:ef7eb2e8f9f7 62 /* Send start bit */
<> 144:ef7eb2e8f9f7 63 status = fI2cStart(obj);
<> 144:ef7eb2e8f9f7 64 if(status) {
<> 144:ef7eb2e8f9f7 65 /* Error sending start bit */
<> 144:ef7eb2e8f9f7 66 return status;
<> 144:ef7eb2e8f9f7 67 }
<> 144:ef7eb2e8f9f7 68
<> 144:ef7eb2e8f9f7 69 /* Send address | read */
<> 144:ef7eb2e8f9f7 70 Count = fI2cWriteB(obj, &WriteData, 1);
<> 144:ef7eb2e8f9f7 71 if(Count != 1) {
<> 144:ef7eb2e8f9f7 72 /* Error sending address */
<> 144:ef7eb2e8f9f7 73 return Count;
<> 144:ef7eb2e8f9f7 74 }
<> 144:ef7eb2e8f9f7 75
<> 144:ef7eb2e8f9f7 76 /* Send command/s */
<> 144:ef7eb2e8f9f7 77 Count = fI2cReadB(obj, data, length);
<> 144:ef7eb2e8f9f7 78 if(Count != length) {
<> 144:ef7eb2e8f9f7 79 /* Error sending coomand/s */
<> 144:ef7eb2e8f9f7 80 return Count;
<> 144:ef7eb2e8f9f7 81 }
<> 144:ef7eb2e8f9f7 82 if(stop) { /* Send stop bit if requested */
<> 144:ef7eb2e8f9f7 83 status = fI2cStop(obj);
<> 144:ef7eb2e8f9f7 84 if(status) {
<> 144:ef7eb2e8f9f7 85 /* Error sending stop bit */
<> 144:ef7eb2e8f9f7 86 return status;
<> 144:ef7eb2e8f9f7 87 }
<> 144:ef7eb2e8f9f7 88 }
<> 144:ef7eb2e8f9f7 89 return Count;
<> 144:ef7eb2e8f9f7 90 }
<> 144:ef7eb2e8f9f7 91
<> 144:ef7eb2e8f9f7 92 /* See i2c_api.h for details */
<> 144:ef7eb2e8f9f7 93 int i2c_write(i2c_t *obj, int address, const char *data, int length, int stop)
<> 144:ef7eb2e8f9f7 94 {
<> 144:ef7eb2e8f9f7 95 int Count, status;
<> 144:ef7eb2e8f9f7 96 const char WriteData = (address & I2C_READ_WRITE_BIT_MASK) & 0xFF;
<> 144:ef7eb2e8f9f7 97
<> 144:ef7eb2e8f9f7 98 /* Send start bit */
<> 144:ef7eb2e8f9f7 99 status = fI2cStart(obj);
<> 144:ef7eb2e8f9f7 100 if(status) {
<> 144:ef7eb2e8f9f7 101 /* Error sending start bit */
<> 144:ef7eb2e8f9f7 102 return status;
<> 144:ef7eb2e8f9f7 103 }
<> 144:ef7eb2e8f9f7 104
<> 144:ef7eb2e8f9f7 105 /* Send address | write */
<> 144:ef7eb2e8f9f7 106 Count = fI2cWriteB(obj, &WriteData, 1);
<> 144:ef7eb2e8f9f7 107 if(Count != 1) {
<> 144:ef7eb2e8f9f7 108 /* Error sending address */
<> 144:ef7eb2e8f9f7 109 return Count;
<> 144:ef7eb2e8f9f7 110 }
<> 144:ef7eb2e8f9f7 111
<> 144:ef7eb2e8f9f7 112 /* Sens command, [data] */
<> 144:ef7eb2e8f9f7 113 Count = fI2cWriteB(obj, data, length);
<> 144:ef7eb2e8f9f7 114 if(Count != length) {
<> 144:ef7eb2e8f9f7 115 /* Error sending address */
<> 144:ef7eb2e8f9f7 116 return Count;
<> 144:ef7eb2e8f9f7 117 }
<> 144:ef7eb2e8f9f7 118
<> 144:ef7eb2e8f9f7 119 if(stop) { /* If stop requested */
<> 144:ef7eb2e8f9f7 120 /* Send stop bit */
<> 144:ef7eb2e8f9f7 121 status = fI2cStop(obj);
<> 144:ef7eb2e8f9f7 122 if(status) {
<> 144:ef7eb2e8f9f7 123 /* Error sending stop bit */
<> 144:ef7eb2e8f9f7 124 return status;
<> 144:ef7eb2e8f9f7 125 }
<> 144:ef7eb2e8f9f7 126 }
<> 144:ef7eb2e8f9f7 127 return Count;
<> 144:ef7eb2e8f9f7 128 }
<> 144:ef7eb2e8f9f7 129
<> 144:ef7eb2e8f9f7 130 /* See i2c_api.h for details */
<> 144:ef7eb2e8f9f7 131 void i2c_reset(i2c_t *obj)
<> 144:ef7eb2e8f9f7 132 {
<> 144:ef7eb2e8f9f7 133 (void)fI2cStop(obj);
<> 144:ef7eb2e8f9f7 134 }
<> 144:ef7eb2e8f9f7 135
<> 144:ef7eb2e8f9f7 136 /* See i2c_api.h for details */
<> 144:ef7eb2e8f9f7 137 int i2c_byte_read(i2c_t *obj, int last) /* TODO return size can be uint8_t */
<> 144:ef7eb2e8f9f7 138 {
<> 144:ef7eb2e8f9f7 139 int Count;
<> 144:ef7eb2e8f9f7 140 char data;
<> 144:ef7eb2e8f9f7 141 Count = fI2cReadB(obj, &data, 1);
<> 144:ef7eb2e8f9f7 142 if(Count != 1) {
<> 144:ef7eb2e8f9f7 143 /* Error */
<> 144:ef7eb2e8f9f7 144 return Count;
<> 144:ef7eb2e8f9f7 145 }
<> 144:ef7eb2e8f9f7 146 if(last) {
<> 144:ef7eb2e8f9f7 147 /* ACK */
<> 144:ef7eb2e8f9f7 148 obj->membase->CMD_REG = I2C_CMD_WDAT0;
<> 144:ef7eb2e8f9f7 149 } else {
<> 144:ef7eb2e8f9f7 150 /* No ACK */
<> 144:ef7eb2e8f9f7 151 obj->membase->CMD_REG = I2C_CMD_WDAT1;
<> 144:ef7eb2e8f9f7 152 }
<> 144:ef7eb2e8f9f7 153 return data;
<> 144:ef7eb2e8f9f7 154 }
<> 144:ef7eb2e8f9f7 155
<> 144:ef7eb2e8f9f7 156 /* See i2c_api.h for details */
<> 144:ef7eb2e8f9f7 157 int i2c_byte_write(i2c_t *obj, int data)
<> 144:ef7eb2e8f9f7 158 {
<> 144:ef7eb2e8f9f7 159 int Count;
<> 144:ef7eb2e8f9f7 160 Count = fI2cWriteB(obj, (const char *)&data, 1);
<> 144:ef7eb2e8f9f7 161 if(Count != 1) {
<> 144:ef7eb2e8f9f7 162 return Count;
<> 144:ef7eb2e8f9f7 163 }
<> 144:ef7eb2e8f9f7 164
<> 144:ef7eb2e8f9f7 165 obj->membase->CMD_REG = I2C_CMD_VRFY_ACK; /* Verify ACK */
<> 144:ef7eb2e8f9f7 166
<> 144:ef7eb2e8f9f7 167 while(obj->membase->STATUS.WORD & I2C_STATUS_CMD_FIFO_OFL_BIT); /* Wait till command overflow ends */
<> 144:ef7eb2e8f9f7 168
<> 144:ef7eb2e8f9f7 169 if(obj->membase->STATUS.WORD & I2C_STATUS_BUS_ERR_BIT) {
<> 144:ef7eb2e8f9f7 170 /* Bus error means NAK received */
<> 144:ef7eb2e8f9f7 171 return 0;
<> 144:ef7eb2e8f9f7 172 } else {
<> 144:ef7eb2e8f9f7 173 /* ACK received */
<> 144:ef7eb2e8f9f7 174 return 1;
<> 144:ef7eb2e8f9f7 175 }
<> 144:ef7eb2e8f9f7 176 }
<> 144:ef7eb2e8f9f7 177
<> 144:ef7eb2e8f9f7 178 #endif /* DEVICE_I2C */