mbed library sources. Supersedes mbed-src.

Fork of mbed by teralytic

Committer:
bogdanm
Date:
Thu Oct 01 15:25:22 2015 +0300
Revision:
0:9b334a45a8ff
Child:
144:ef7eb2e8f9f7
Initial commit on mbed-dev

Replaces mbed-src (now inactive)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bogdanm 0:9b334a45a8ff 1 /* mbed Microcontroller Library
bogdanm 0:9b334a45a8ff 2 *******************************************************************************
bogdanm 0:9b334a45a8ff 3 * Copyright (c) 2015 WIZnet Co.,Ltd. All rights reserved.
bogdanm 0:9b334a45a8ff 4 * All rights reserved.
bogdanm 0:9b334a45a8ff 5 *
bogdanm 0:9b334a45a8ff 6 * Redistribution and use in source and binary forms, with or without
bogdanm 0:9b334a45a8ff 7 * modification, are permitted provided that the following conditions are met:
bogdanm 0:9b334a45a8ff 8 *
bogdanm 0:9b334a45a8ff 9 * 1. Redistributions of source code must retain the above copyright notice,
bogdanm 0:9b334a45a8ff 10 * this list of conditions and the following disclaimer.
bogdanm 0:9b334a45a8ff 11 * 2. Redistributions in binary form must reproduce the above copyright notice,
bogdanm 0:9b334a45a8ff 12 * this list of conditions and the following disclaimer in the documentation
bogdanm 0:9b334a45a8ff 13 * and/or other materials provided with the distribution.
bogdanm 0:9b334a45a8ff 14 * 3. Neither the name of ARM Limited nor the names of its contributors
bogdanm 0:9b334a45a8ff 15 * may be used to endorse or promote products derived from this software
bogdanm 0:9b334a45a8ff 16 * without specific prior written permission.
bogdanm 0:9b334a45a8ff 17 *
bogdanm 0:9b334a45a8ff 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
bogdanm 0:9b334a45a8ff 19 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
bogdanm 0:9b334a45a8ff 20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
bogdanm 0:9b334a45a8ff 21 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
bogdanm 0:9b334a45a8ff 22 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
bogdanm 0:9b334a45a8ff 23 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
bogdanm 0:9b334a45a8ff 24 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
bogdanm 0:9b334a45a8ff 25 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
bogdanm 0:9b334a45a8ff 26 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
bogdanm 0:9b334a45a8ff 27 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
bogdanm 0:9b334a45a8ff 28 *******************************************************************************
bogdanm 0:9b334a45a8ff 29 */
bogdanm 0:9b334a45a8ff 30
bogdanm 0:9b334a45a8ff 31 #include "mbed_assert.h"
bogdanm 0:9b334a45a8ff 32 #include "i2c_api.h"
bogdanm 0:9b334a45a8ff 33
bogdanm 0:9b334a45a8ff 34
bogdanm 0:9b334a45a8ff 35 #if DEVICE_I2C
bogdanm 0:9b334a45a8ff 36
bogdanm 0:9b334a45a8ff 37 #include "cmsis.h"
bogdanm 0:9b334a45a8ff 38 #include "pinmap.h"
bogdanm 0:9b334a45a8ff 39 #include "PeripheralPins.h"
bogdanm 0:9b334a45a8ff 40
bogdanm 0:9b334a45a8ff 41 #include "wait_api.h"
bogdanm 0:9b334a45a8ff 42 #include "us_ticker_api.h"
bogdanm 0:9b334a45a8ff 43 #include "W7500x_i2c.h"
bogdanm 0:9b334a45a8ff 44
bogdanm 0:9b334a45a8ff 45 /* Timeout values for flags and events waiting loops. These timeouts are
bogdanm 0:9b334a45a8ff 46 not based on accurate values, they just guarantee that the application will
bogdanm 0:9b334a45a8ff 47 not remain stuck if the I2C communication is corrupted. */
bogdanm 0:9b334a45a8ff 48 #define FLAG_TIMEOUT ((int)0x1000)
bogdanm 0:9b334a45a8ff 49 #define LONG_TIMEOUT ((int)0xFFFF)
bogdanm 0:9b334a45a8ff 50
bogdanm 0:9b334a45a8ff 51
bogdanm 0:9b334a45a8ff 52 void i2c_init(i2c_t *obj, PinName sda, PinName scl)
bogdanm 0:9b334a45a8ff 53 {
bogdanm 0:9b334a45a8ff 54 I2C_ConfigStruct conf;
bogdanm 0:9b334a45a8ff 55
bogdanm 0:9b334a45a8ff 56 //Determine the I2C to use
bogdanm 0:9b334a45a8ff 57 I2CName i2c_sda = (I2CName)pinmap_peripheral(sda, PinMap_I2C_SDA);
bogdanm 0:9b334a45a8ff 58 I2CName i2c_scl = (I2CName)pinmap_peripheral(scl, PinMap_I2C_SCL);
bogdanm 0:9b334a45a8ff 59 obj->I2Cx = (I2CName)pinmap_merge(i2c_sda, i2c_scl);
bogdanm 0:9b334a45a8ff 60 MBED_ASSERT(obj->I2Cx != (I2CName)NC);
bogdanm 0:9b334a45a8ff 61
bogdanm 0:9b334a45a8ff 62 obj->sda = sda;
bogdanm 0:9b334a45a8ff 63 obj->scl = scl;
bogdanm 0:9b334a45a8ff 64 obj->ADDRESS = 0x0;
bogdanm 0:9b334a45a8ff 65 obj->is_setAddress = 0;
bogdanm 0:9b334a45a8ff 66
bogdanm 0:9b334a45a8ff 67 conf.sda = (I2C_PinName)obj->sda;
bogdanm 0:9b334a45a8ff 68 conf.scl = (I2C_PinName)obj->scl;
bogdanm 0:9b334a45a8ff 69
bogdanm 0:9b334a45a8ff 70 I2C_Init(&conf);
bogdanm 0:9b334a45a8ff 71 }
bogdanm 0:9b334a45a8ff 72
bogdanm 0:9b334a45a8ff 73 void i2c_frequency(i2c_t *obj, int hz)
bogdanm 0:9b334a45a8ff 74 {
bogdanm 0:9b334a45a8ff 75
bogdanm 0:9b334a45a8ff 76 }
bogdanm 0:9b334a45a8ff 77
bogdanm 0:9b334a45a8ff 78 inline int i2c_start(i2c_t *obj)
bogdanm 0:9b334a45a8ff 79 {
bogdanm 0:9b334a45a8ff 80 I2C_ConfigStruct conf;
bogdanm 0:9b334a45a8ff 81 conf.sda = (I2C_PinName)obj->sda;
bogdanm 0:9b334a45a8ff 82 conf.scl = (I2C_PinName)obj->scl;
bogdanm 0:9b334a45a8ff 83
bogdanm 0:9b334a45a8ff 84 I2C_Start(&conf);
bogdanm 0:9b334a45a8ff 85
bogdanm 0:9b334a45a8ff 86 return 0;
bogdanm 0:9b334a45a8ff 87 }
bogdanm 0:9b334a45a8ff 88
bogdanm 0:9b334a45a8ff 89 inline int i2c_stop(i2c_t *obj)
bogdanm 0:9b334a45a8ff 90 {
bogdanm 0:9b334a45a8ff 91 I2C_ConfigStruct conf;
bogdanm 0:9b334a45a8ff 92 conf.sda = (I2C_PinName)obj->sda;
bogdanm 0:9b334a45a8ff 93 conf.scl = (I2C_PinName)obj->scl;
bogdanm 0:9b334a45a8ff 94
bogdanm 0:9b334a45a8ff 95 I2C_Stop(&conf);
bogdanm 0:9b334a45a8ff 96
bogdanm 0:9b334a45a8ff 97 return 0;
bogdanm 0:9b334a45a8ff 98 }
bogdanm 0:9b334a45a8ff 99
bogdanm 0:9b334a45a8ff 100 int i2c_read(i2c_t *obj, int address, char *data, int length, int stop)
bogdanm 0:9b334a45a8ff 101 {
bogdanm 0:9b334a45a8ff 102 I2C_ConfigStruct conf;
bogdanm 0:9b334a45a8ff 103
bogdanm 0:9b334a45a8ff 104 conf.sda = (I2C_PinName)obj->sda;
bogdanm 0:9b334a45a8ff 105 conf.scl = (I2C_PinName)obj->scl;
bogdanm 0:9b334a45a8ff 106
bogdanm 0:9b334a45a8ff 107
bogdanm 0:9b334a45a8ff 108 if(stop)
bogdanm 0:9b334a45a8ff 109 {
bogdanm 0:9b334a45a8ff 110 if(I2C_Read(&conf, address, (uint8_t*)data, length) != 0)
bogdanm 0:9b334a45a8ff 111 return -1;
bogdanm 0:9b334a45a8ff 112 }
bogdanm 0:9b334a45a8ff 113 else
bogdanm 0:9b334a45a8ff 114 {
bogdanm 0:9b334a45a8ff 115 if(I2C_ReadRepeated(&conf, address, (uint8_t*)data, length) != 0)
bogdanm 0:9b334a45a8ff 116 return -1;
bogdanm 0:9b334a45a8ff 117 }
bogdanm 0:9b334a45a8ff 118
bogdanm 0:9b334a45a8ff 119 return length;
bogdanm 0:9b334a45a8ff 120
bogdanm 0:9b334a45a8ff 121 }
bogdanm 0:9b334a45a8ff 122
bogdanm 0:9b334a45a8ff 123 int i2c_write(i2c_t *obj, int address, const char *data, int length, int stop)
bogdanm 0:9b334a45a8ff 124 {
bogdanm 0:9b334a45a8ff 125 I2C_ConfigStruct conf;
bogdanm 0:9b334a45a8ff 126
bogdanm 0:9b334a45a8ff 127 conf.sda = (I2C_PinName)obj->sda;
bogdanm 0:9b334a45a8ff 128 conf.scl = (I2C_PinName)obj->scl;
bogdanm 0:9b334a45a8ff 129
bogdanm 0:9b334a45a8ff 130
bogdanm 0:9b334a45a8ff 131 if(stop)
bogdanm 0:9b334a45a8ff 132 {
bogdanm 0:9b334a45a8ff 133 if(I2C_Write(&conf, address, (uint8_t*)data, length) != 0)
bogdanm 0:9b334a45a8ff 134 return -1;
bogdanm 0:9b334a45a8ff 135 }
bogdanm 0:9b334a45a8ff 136 else
bogdanm 0:9b334a45a8ff 137 {
bogdanm 0:9b334a45a8ff 138 if(I2C_WriteRepeated(&conf, address, (uint8_t*)data, length) != 0)
bogdanm 0:9b334a45a8ff 139 return -1;
bogdanm 0:9b334a45a8ff 140 }
bogdanm 0:9b334a45a8ff 141
bogdanm 0:9b334a45a8ff 142 return length;
bogdanm 0:9b334a45a8ff 143 }
bogdanm 0:9b334a45a8ff 144
bogdanm 0:9b334a45a8ff 145 int i2c_byte_read(i2c_t *obj, int last)
bogdanm 0:9b334a45a8ff 146 {
bogdanm 0:9b334a45a8ff 147 uint8_t ret;
bogdanm 0:9b334a45a8ff 148 I2C_ConfigStruct conf;
bogdanm 0:9b334a45a8ff 149
bogdanm 0:9b334a45a8ff 150 conf.sda = (I2C_PinName)obj->sda;
bogdanm 0:9b334a45a8ff 151 conf.scl = (I2C_PinName)obj->scl;
bogdanm 0:9b334a45a8ff 152
bogdanm 0:9b334a45a8ff 153 ret = I2C_ReadByte(&conf);
bogdanm 0:9b334a45a8ff 154
bogdanm 0:9b334a45a8ff 155 if(last)
bogdanm 0:9b334a45a8ff 156 I2C_SendNACK(&conf);
bogdanm 0:9b334a45a8ff 157 else
bogdanm 0:9b334a45a8ff 158 I2C_SendACK(&conf);
bogdanm 0:9b334a45a8ff 159
bogdanm 0:9b334a45a8ff 160 return (int)ret;
bogdanm 0:9b334a45a8ff 161 }
bogdanm 0:9b334a45a8ff 162
bogdanm 0:9b334a45a8ff 163 int i2c_byte_write(i2c_t *obj, int data)
bogdanm 0:9b334a45a8ff 164 {
bogdanm 0:9b334a45a8ff 165 I2C_ConfigStruct conf;
bogdanm 0:9b334a45a8ff 166
bogdanm 0:9b334a45a8ff 167 conf.sda = (I2C_PinName)obj->sda;
bogdanm 0:9b334a45a8ff 168 conf.scl = (I2C_PinName)obj->scl;
bogdanm 0:9b334a45a8ff 169
bogdanm 0:9b334a45a8ff 170 if(I2C_WriteByte(&conf, (uint8_t)data)) // NACK
bogdanm 0:9b334a45a8ff 171 return 0;
bogdanm 0:9b334a45a8ff 172 else //ack
bogdanm 0:9b334a45a8ff 173 return 1;
bogdanm 0:9b334a45a8ff 174 }
bogdanm 0:9b334a45a8ff 175
bogdanm 0:9b334a45a8ff 176 void i2c_reset(i2c_t *obj)
bogdanm 0:9b334a45a8ff 177 {
bogdanm 0:9b334a45a8ff 178
bogdanm 0:9b334a45a8ff 179 }
bogdanm 0:9b334a45a8ff 180
bogdanm 0:9b334a45a8ff 181
bogdanm 0:9b334a45a8ff 182 #endif // DEVICE_I2C