mbed library sources. Supersedes mbed-src.

Dependents:   Nucleo_Hello_Encoder BLE_iBeaconScan AM1805_DEMO DISCO-F429ZI_ExportTemplate1 ... more

Committer:
AnnaBridge
Date:
Wed Feb 20 22:31:08 2019 +0000
Revision:
189:f392fc9709a3
Parent:
188:bcfe06ba3d64
mbed library release version 165

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AnnaBridge 188:bcfe06ba3d64 1 /* mbed Microcontroller Library
AnnaBridge 188:bcfe06ba3d64 2 * (C)Copyright TOSHIBA ELECTRONIC DEVICES & STORAGE CORPORATION 2018 All rights reserved
AnnaBridge 188:bcfe06ba3d64 3 *
AnnaBridge 188:bcfe06ba3d64 4 * Licensed under the Apache License, Version 2.0 (the "License");
AnnaBridge 188:bcfe06ba3d64 5 * you may not use this file except in compliance with the License.
AnnaBridge 188:bcfe06ba3d64 6 * You may obtain a copy of the License at
AnnaBridge 188:bcfe06ba3d64 7 *
AnnaBridge 188:bcfe06ba3d64 8 * http://www.apache.org/licenses/LICENSE-2.0
AnnaBridge 188:bcfe06ba3d64 9 *
AnnaBridge 188:bcfe06ba3d64 10 * Unless required by applicable law or agreed to in writing, software
AnnaBridge 188:bcfe06ba3d64 11 * distributed under the License is distributed on an "AS IS" BASIS,
AnnaBridge 188:bcfe06ba3d64 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
AnnaBridge 188:bcfe06ba3d64 13 * See the License for the specific language governing permissions and
AnnaBridge 188:bcfe06ba3d64 14 * limitations under the License.
AnnaBridge 188:bcfe06ba3d64 15 */
AnnaBridge 188:bcfe06ba3d64 16 #include <stdlib.h>
AnnaBridge 188:bcfe06ba3d64 17 #include <string.h>
AnnaBridge 188:bcfe06ba3d64 18 #include "i2c_api.h"
AnnaBridge 188:bcfe06ba3d64 19 #include "mbed_error.h"
AnnaBridge 188:bcfe06ba3d64 20 #include "PeripheralNames.h"
AnnaBridge 188:bcfe06ba3d64 21 #include "pinmap.h"
AnnaBridge 188:bcfe06ba3d64 22 #include "txz_i2c_api.h"
AnnaBridge 188:bcfe06ba3d64 23
AnnaBridge 188:bcfe06ba3d64 24 #define MAX_I2C_FREQ 1000000
AnnaBridge 188:bcfe06ba3d64 25
AnnaBridge 188:bcfe06ba3d64 26 static const PinMap PinMap_I2C_SDA[] = {
AnnaBridge 188:bcfe06ba3d64 27 {PG2, I2C_0, PIN_DATA(7, 2)},
AnnaBridge 188:bcfe06ba3d64 28 {PF2, I2C_1, PIN_DATA(7, 2)},
AnnaBridge 188:bcfe06ba3d64 29 {PG4, I2C_2, PIN_DATA(7, 2)},
AnnaBridge 188:bcfe06ba3d64 30 {PJ6, I2C_3, PIN_DATA(7, 2)},
AnnaBridge 188:bcfe06ba3d64 31 {PJ3, I2C_4, PIN_DATA(7, 2)},
AnnaBridge 188:bcfe06ba3d64 32 {NC, NC, 0}
AnnaBridge 188:bcfe06ba3d64 33 };
AnnaBridge 188:bcfe06ba3d64 34
AnnaBridge 188:bcfe06ba3d64 35 static const PinMap PinMap_I2C_SCL[] = {
AnnaBridge 188:bcfe06ba3d64 36 {PG3, I2C_0, PIN_DATA(7, 2)},
AnnaBridge 188:bcfe06ba3d64 37 {PF3, I2C_1, PIN_DATA(7, 2)},
AnnaBridge 188:bcfe06ba3d64 38 {PG5, I2C_2, PIN_DATA(7, 2)},
AnnaBridge 188:bcfe06ba3d64 39 {PJ7, I2C_3, PIN_DATA(7, 2)},
AnnaBridge 188:bcfe06ba3d64 40 {PJ2, I2C_4, PIN_DATA(7, 2)},
AnnaBridge 188:bcfe06ba3d64 41 {NC, NC, 0}
AnnaBridge 188:bcfe06ba3d64 42 };
AnnaBridge 188:bcfe06ba3d64 43
AnnaBridge 188:bcfe06ba3d64 44 // Initialize the I2C peripheral. It sets the default parameters for I2C
AnnaBridge 188:bcfe06ba3d64 45 void i2c_init(i2c_t *obj, PinName sda, PinName scl)
AnnaBridge 188:bcfe06ba3d64 46 {
AnnaBridge 188:bcfe06ba3d64 47 MBED_ASSERT(obj != NULL);
AnnaBridge 188:bcfe06ba3d64 48
AnnaBridge 188:bcfe06ba3d64 49 I2CName i2c_sda = (I2CName)pinmap_peripheral(sda, PinMap_I2C_SDA);
AnnaBridge 188:bcfe06ba3d64 50 I2CName i2c_scl = (I2CName)pinmap_peripheral(scl, PinMap_I2C_SCL);
AnnaBridge 188:bcfe06ba3d64 51 I2CName i2c_name = (I2CName)pinmap_merge(i2c_sda, i2c_scl);
AnnaBridge 188:bcfe06ba3d64 52
AnnaBridge 188:bcfe06ba3d64 53 MBED_ASSERT((int)i2c_name != NC);
AnnaBridge 188:bcfe06ba3d64 54
AnnaBridge 188:bcfe06ba3d64 55 switch (i2c_name) {
AnnaBridge 188:bcfe06ba3d64 56 case I2C_0:
AnnaBridge 188:bcfe06ba3d64 57 TSB_CG_FSYSMENA_IPMENA29 = TXZ_ENABLE; // Enable clock for I2C_0
AnnaBridge 188:bcfe06ba3d64 58 TSB_CG_FSYSMENB_IPMENB08 = TXZ_ENABLE; // Enable clock for GPIO G
AnnaBridge 188:bcfe06ba3d64 59 obj->my_i2c.i2c.p_instance = TSB_I2C0;
AnnaBridge 188:bcfe06ba3d64 60 obj->my_i2c.info.irqn = INTI2C0_IRQn;
AnnaBridge 188:bcfe06ba3d64 61 break;
AnnaBridge 188:bcfe06ba3d64 62 case I2C_1:
AnnaBridge 188:bcfe06ba3d64 63 TSB_CG_FSYSMENA_IPMENA30 = TXZ_ENABLE; // Enable clock for I2C_1
AnnaBridge 188:bcfe06ba3d64 64 TSB_CG_FSYSMENB_IPMENB07 = TXZ_ENABLE; // Enable clock for GPIO F
AnnaBridge 188:bcfe06ba3d64 65 obj->my_i2c.i2c.p_instance = TSB_I2C1;
AnnaBridge 188:bcfe06ba3d64 66 obj->my_i2c.info.irqn = INTI2C1_IRQn;
AnnaBridge 188:bcfe06ba3d64 67 break;
AnnaBridge 188:bcfe06ba3d64 68 case I2C_2:
AnnaBridge 188:bcfe06ba3d64 69 TSB_CG_FSYSMENA_IPMENA31 = TXZ_ENABLE; // Enable clock for I2C_2
AnnaBridge 188:bcfe06ba3d64 70 TSB_CG_FSYSMENB_IPMENB08 = TXZ_ENABLE; // Enable clock for GPIO G
AnnaBridge 188:bcfe06ba3d64 71 obj->my_i2c.i2c.p_instance = TSB_I2C2;
AnnaBridge 188:bcfe06ba3d64 72 obj->my_i2c.info.irqn = INTI2C2_IRQn;
AnnaBridge 188:bcfe06ba3d64 73 break;
AnnaBridge 188:bcfe06ba3d64 74 case I2C_3:
AnnaBridge 188:bcfe06ba3d64 75 TSB_CG_FSYSMENB_IPMENB00 = TXZ_ENABLE; // Enable clock for I2C_3
AnnaBridge 188:bcfe06ba3d64 76 TSB_CG_FSYSMENB_IPMENB10 = TXZ_ENABLE; // Enable clock for GPIO J
AnnaBridge 188:bcfe06ba3d64 77 obj->my_i2c.i2c.p_instance = TSB_I2C3;
AnnaBridge 188:bcfe06ba3d64 78 obj->my_i2c.info.irqn = INTI2C3_IRQn;
AnnaBridge 188:bcfe06ba3d64 79 break;
AnnaBridge 188:bcfe06ba3d64 80 case I2C_4:
AnnaBridge 188:bcfe06ba3d64 81 TSB_CG_FSYSMENB_IPMENB01 = TXZ_ENABLE; // Enable clock for I2C_4
AnnaBridge 188:bcfe06ba3d64 82 TSB_CG_FSYSMENB_IPMENB10 = TXZ_ENABLE; // Enable clock for GPIO J
AnnaBridge 188:bcfe06ba3d64 83 obj->my_i2c.i2c.p_instance = TSB_I2C4;
AnnaBridge 188:bcfe06ba3d64 84 obj->my_i2c.info.irqn = INTI2C4_IRQn;
AnnaBridge 188:bcfe06ba3d64 85 break;
AnnaBridge 188:bcfe06ba3d64 86 default:
AnnaBridge 188:bcfe06ba3d64 87 error("I2C is not available");
AnnaBridge 188:bcfe06ba3d64 88 break;
AnnaBridge 188:bcfe06ba3d64 89 }
AnnaBridge 188:bcfe06ba3d64 90
AnnaBridge 188:bcfe06ba3d64 91 pinmap_pinout(sda, PinMap_I2C_SDA);
AnnaBridge 188:bcfe06ba3d64 92 pin_mode(sda, OpenDrain);
AnnaBridge 188:bcfe06ba3d64 93 pin_mode(sda, PullUp);
AnnaBridge 188:bcfe06ba3d64 94
AnnaBridge 188:bcfe06ba3d64 95 pinmap_pinout(scl, PinMap_I2C_SCL);
AnnaBridge 188:bcfe06ba3d64 96 pin_mode(scl, OpenDrain);
AnnaBridge 188:bcfe06ba3d64 97 pin_mode(scl, PullUp);
AnnaBridge 188:bcfe06ba3d64 98
AnnaBridge 188:bcfe06ba3d64 99 i2c_reset(obj);
AnnaBridge 188:bcfe06ba3d64 100 i2c_frequency(obj, 100000);
AnnaBridge 188:bcfe06ba3d64 101 I2C_init(&obj->my_i2c.i2c);
AnnaBridge 188:bcfe06ba3d64 102 }
AnnaBridge 188:bcfe06ba3d64 103
AnnaBridge 188:bcfe06ba3d64 104 // Configure the I2C frequency
AnnaBridge 188:bcfe06ba3d64 105 void i2c_frequency(i2c_t *obj, int hz)
AnnaBridge 188:bcfe06ba3d64 106 {
AnnaBridge 188:bcfe06ba3d64 107 if (hz <= MAX_I2C_FREQ) {
AnnaBridge 188:bcfe06ba3d64 108 i2c_frequency_t(&obj->my_i2c, hz);
AnnaBridge 188:bcfe06ba3d64 109 } else {
AnnaBridge 188:bcfe06ba3d64 110 error("Failed : Max I2C frequency is 1000000");
AnnaBridge 188:bcfe06ba3d64 111 }
AnnaBridge 188:bcfe06ba3d64 112 }
AnnaBridge 188:bcfe06ba3d64 113
AnnaBridge 188:bcfe06ba3d64 114 int i2c_start(i2c_t *obj)
AnnaBridge 188:bcfe06ba3d64 115 {
AnnaBridge 188:bcfe06ba3d64 116 i2c_start_t(&obj->my_i2c);
AnnaBridge 188:bcfe06ba3d64 117 return TXZ_SUCCESS;
AnnaBridge 188:bcfe06ba3d64 118 }
AnnaBridge 188:bcfe06ba3d64 119
AnnaBridge 188:bcfe06ba3d64 120 int i2c_stop(i2c_t *obj)
AnnaBridge 188:bcfe06ba3d64 121 {
AnnaBridge 188:bcfe06ba3d64 122 i2c_stop_t(&obj->my_i2c);
AnnaBridge 188:bcfe06ba3d64 123 return TXZ_SUCCESS;
AnnaBridge 188:bcfe06ba3d64 124 }
AnnaBridge 188:bcfe06ba3d64 125
AnnaBridge 188:bcfe06ba3d64 126 void i2c_reset(i2c_t *obj)
AnnaBridge 188:bcfe06ba3d64 127 {
AnnaBridge 188:bcfe06ba3d64 128 // Software reset
AnnaBridge 188:bcfe06ba3d64 129 i2c_reset_t(&obj->my_i2c);
AnnaBridge 188:bcfe06ba3d64 130 }
AnnaBridge 188:bcfe06ba3d64 131
AnnaBridge 188:bcfe06ba3d64 132 int i2c_read(i2c_t *obj, int address, char *data, int length, int stop)
AnnaBridge 188:bcfe06ba3d64 133 {
AnnaBridge 188:bcfe06ba3d64 134 int32_t count = 0;
AnnaBridge 188:bcfe06ba3d64 135
AnnaBridge 188:bcfe06ba3d64 136 count = i2c_read_t(&obj->my_i2c, address, (uint8_t *)data, length, stop);
AnnaBridge 188:bcfe06ba3d64 137
AnnaBridge 188:bcfe06ba3d64 138 return count;
AnnaBridge 188:bcfe06ba3d64 139 }
AnnaBridge 188:bcfe06ba3d64 140
AnnaBridge 188:bcfe06ba3d64 141 int i2c_write(i2c_t *obj, int address, const char *data, int length, int stop)
AnnaBridge 188:bcfe06ba3d64 142 {
AnnaBridge 188:bcfe06ba3d64 143 int32_t count = 0;
AnnaBridge 188:bcfe06ba3d64 144
AnnaBridge 188:bcfe06ba3d64 145 count = i2c_write_t(&obj->my_i2c, address, (uint8_t *)data, length, stop);
AnnaBridge 188:bcfe06ba3d64 146
AnnaBridge 188:bcfe06ba3d64 147 return count;
AnnaBridge 188:bcfe06ba3d64 148 }
AnnaBridge 188:bcfe06ba3d64 149
AnnaBridge 188:bcfe06ba3d64 150 int i2c_byte_read(i2c_t *obj, int last)
AnnaBridge 188:bcfe06ba3d64 151 {
AnnaBridge 188:bcfe06ba3d64 152 int32_t data = 0;
AnnaBridge 188:bcfe06ba3d64 153
AnnaBridge 188:bcfe06ba3d64 154 data = i2c_byte_read_t(&obj->my_i2c, last);
AnnaBridge 188:bcfe06ba3d64 155
AnnaBridge 188:bcfe06ba3d64 156 return data;
AnnaBridge 188:bcfe06ba3d64 157 }
AnnaBridge 188:bcfe06ba3d64 158
AnnaBridge 188:bcfe06ba3d64 159 int i2c_byte_write(i2c_t *obj, int data)
AnnaBridge 188:bcfe06ba3d64 160 {
AnnaBridge 188:bcfe06ba3d64 161 int32_t result = 0;
AnnaBridge 188:bcfe06ba3d64 162
AnnaBridge 188:bcfe06ba3d64 163 result = i2c_byte_write_t(&obj->my_i2c, data);
AnnaBridge 188:bcfe06ba3d64 164
AnnaBridge 188:bcfe06ba3d64 165 return result;
AnnaBridge 188:bcfe06ba3d64 166 }
AnnaBridge 188:bcfe06ba3d64 167
AnnaBridge 188:bcfe06ba3d64 168 void i2c_slave_mode(i2c_t *obj, int enable_slave)
AnnaBridge 188:bcfe06ba3d64 169 {
AnnaBridge 188:bcfe06ba3d64 170 i2c_slave_mode_t(&obj->my_i2c, enable_slave);
AnnaBridge 188:bcfe06ba3d64 171 }
AnnaBridge 188:bcfe06ba3d64 172
AnnaBridge 188:bcfe06ba3d64 173 void i2c_slave_address(i2c_t *obj, int idx, uint32_t address, uint32_t mask)
AnnaBridge 188:bcfe06ba3d64 174 {
AnnaBridge 188:bcfe06ba3d64 175 i2c_slave_address_t(&obj->my_i2c, address);
AnnaBridge 188:bcfe06ba3d64 176 }
AnnaBridge 188:bcfe06ba3d64 177
AnnaBridge 188:bcfe06ba3d64 178 int i2c_slave_receive(i2c_t *obj)
AnnaBridge 188:bcfe06ba3d64 179 {
AnnaBridge 188:bcfe06ba3d64 180 int32_t result = 0;
AnnaBridge 188:bcfe06ba3d64 181
AnnaBridge 188:bcfe06ba3d64 182 result = i2c_slave_receive_t(&obj->my_i2c);
AnnaBridge 188:bcfe06ba3d64 183
AnnaBridge 188:bcfe06ba3d64 184 return result;
AnnaBridge 188:bcfe06ba3d64 185 }
AnnaBridge 188:bcfe06ba3d64 186
AnnaBridge 188:bcfe06ba3d64 187 int i2c_slave_read(i2c_t *obj, char *data, int length)
AnnaBridge 188:bcfe06ba3d64 188 {
AnnaBridge 188:bcfe06ba3d64 189 int32_t count = 0;
AnnaBridge 188:bcfe06ba3d64 190
AnnaBridge 188:bcfe06ba3d64 191 count = i2c_slave_read_t(&obj->my_i2c, (uint8_t *)data, length);
AnnaBridge 188:bcfe06ba3d64 192
AnnaBridge 188:bcfe06ba3d64 193 return count;
AnnaBridge 188:bcfe06ba3d64 194 }
AnnaBridge 188:bcfe06ba3d64 195
AnnaBridge 188:bcfe06ba3d64 196 int i2c_slave_write(i2c_t *obj, const char *data, int length)
AnnaBridge 188:bcfe06ba3d64 197 {
AnnaBridge 188:bcfe06ba3d64 198 int32_t count = 0;
AnnaBridge 188:bcfe06ba3d64 199
AnnaBridge 188:bcfe06ba3d64 200 count = i2c_slave_write_t(&obj->my_i2c, (uint8_t *)data, length);
AnnaBridge 188:bcfe06ba3d64 201
AnnaBridge 188:bcfe06ba3d64 202 return count;
AnnaBridge 188:bcfe06ba3d64 203 }