mbed library sources. Supersedes mbed-src.
Dependents: Nucleo_Hello_Encoder BLE_iBeaconScan AM1805_DEMO DISCO-F429ZI_ExportTemplate1 ... more
targets/TARGET_TOSHIBA/TARGET_TMPM4G9/i2c_api.c@189:f392fc9709a3, 2019-02-20 (annotated)
- 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?
User | Revision | Line number | New 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 | } |