fixed drive strength

Dependents:   capstone_i2c

Fork of mbed-dev by mbed official

Committer:
mbed_official
Date:
Thu Nov 26 13:15:10 2015 +0000
Revision:
29:d3245924094c
Parent:
0:9b334a45a8ff
Child:
144:ef7eb2e8f9f7
Synchronized with git revision afe56019e06e2aa8eb37c925549569f186b2bba0

Full URL: https://github.com/mbedmicro/mbed/commit/afe56019e06e2aa8eb37c925549569f186b2bba0/

Fix #1393 - I2C assumes NRF_TWI1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bogdanm 0:9b334a45a8ff 1 /* Copyright (c) 2009 Nordic Semiconductor. All Rights Reserved.
bogdanm 0:9b334a45a8ff 2 *
bogdanm 0:9b334a45a8ff 3 * The information contained herein is property of Nordic Semiconductor ASA.
bogdanm 0:9b334a45a8ff 4 * Terms and conditions of usage are described in detail in NORDIC
bogdanm 0:9b334a45a8ff 5 * SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT.
bogdanm 0:9b334a45a8ff 6 *
bogdanm 0:9b334a45a8ff 7 * Licensees are granted free, non-transferable use of the information. NO
bogdanm 0:9b334a45a8ff 8 * WARRANTY of ANY KIND is provided. This heading must NOT be removed from
bogdanm 0:9b334a45a8ff 9 * the file.
bogdanm 0:9b334a45a8ff 10 *
bogdanm 0:9b334a45a8ff 11 */
bogdanm 0:9b334a45a8ff 12
bogdanm 0:9b334a45a8ff 13 #include "twi_master.h"
bogdanm 0:9b334a45a8ff 14 #include "twi_config.h"
bogdanm 0:9b334a45a8ff 15 #include <stdbool.h>
bogdanm 0:9b334a45a8ff 16 #include <stdint.h>
bogdanm 0:9b334a45a8ff 17 #include "nrf.h"
bogdanm 0:9b334a45a8ff 18 #include "nrf_delay.h"
bogdanm 0:9b334a45a8ff 19
bogdanm 0:9b334a45a8ff 20 /* Max cycles approximately to wait on RXDREADY and TXDREADY event,
bogdanm 0:9b334a45a8ff 21 * This is optimized way instead of using timers, this is not power aware. */
bogdanm 0:9b334a45a8ff 22 #define MAX_TIMEOUT_LOOPS (20000UL) /**< MAX while loops to wait for RXD/TXD event */
bogdanm 0:9b334a45a8ff 23
mbed_official 29:d3245924094c 24 static bool twi_master_write(uint8_t * data, uint8_t data_length, bool issue_stop_condition, NRF_TWI_Type* twi)
bogdanm 0:9b334a45a8ff 25 {
bogdanm 0:9b334a45a8ff 26 uint32_t timeout = MAX_TIMEOUT_LOOPS; /* max loops to wait for EVENTS_TXDSENT event*/
bogdanm 0:9b334a45a8ff 27
bogdanm 0:9b334a45a8ff 28 if (data_length == 0)
bogdanm 0:9b334a45a8ff 29 {
bogdanm 0:9b334a45a8ff 30 /* Return false for requesting data of size 0 */
bogdanm 0:9b334a45a8ff 31 return false;
bogdanm 0:9b334a45a8ff 32 }
bogdanm 0:9b334a45a8ff 33
mbed_official 29:d3245924094c 34 twi->TXD = *data++;
mbed_official 29:d3245924094c 35 twi->TASKS_STARTTX = 1;
bogdanm 0:9b334a45a8ff 36
bogdanm 0:9b334a45a8ff 37 /** @snippet [TWI HW master write] */
bogdanm 0:9b334a45a8ff 38 while (true)
bogdanm 0:9b334a45a8ff 39 {
mbed_official 29:d3245924094c 40 while (twi->EVENTS_TXDSENT == 0 && twi->EVENTS_ERROR == 0 && (--timeout))
bogdanm 0:9b334a45a8ff 41 {
bogdanm 0:9b334a45a8ff 42 // Do nothing.
bogdanm 0:9b334a45a8ff 43 }
bogdanm 0:9b334a45a8ff 44
bogdanm 0:9b334a45a8ff 45 if (timeout == 0 || NRF_TWI1->EVENTS_ERROR != 0)
bogdanm 0:9b334a45a8ff 46 {
bogdanm 0:9b334a45a8ff 47 // Recover the peripheral as indicated by PAN 56: "TWI: TWI module lock-up." found at
bogdanm 0:9b334a45a8ff 48 // Product Anomaly Notification document found at
bogdanm 0:9b334a45a8ff 49 // https://www.nordicsemi.com/eng/Products/Bluetooth-R-low-energy/nRF51822/#Downloads
mbed_official 29:d3245924094c 50 twi->EVENTS_ERROR = 0;
mbed_official 29:d3245924094c 51 twi->ENABLE = TWI_ENABLE_ENABLE_Disabled << TWI_ENABLE_ENABLE_Pos;
mbed_official 29:d3245924094c 52 twi->POWER = 0;
bogdanm 0:9b334a45a8ff 53 nrf_delay_us(5);
mbed_official 29:d3245924094c 54 twi->POWER = 1;
mbed_official 29:d3245924094c 55 twi->ENABLE = TWI_ENABLE_ENABLE_Enabled << TWI_ENABLE_ENABLE_Pos;
bogdanm 0:9b334a45a8ff 56
mbed_official 29:d3245924094c 57 (void)twi_master_init_and_clear(twi);
bogdanm 0:9b334a45a8ff 58
bogdanm 0:9b334a45a8ff 59 return false;
bogdanm 0:9b334a45a8ff 60 }
mbed_official 29:d3245924094c 61 twi->EVENTS_TXDSENT = 0;
bogdanm 0:9b334a45a8ff 62 if (--data_length == 0)
bogdanm 0:9b334a45a8ff 63 {
bogdanm 0:9b334a45a8ff 64 break;
bogdanm 0:9b334a45a8ff 65 }
bogdanm 0:9b334a45a8ff 66
mbed_official 29:d3245924094c 67 twi->TXD = *data++;
bogdanm 0:9b334a45a8ff 68 }
bogdanm 0:9b334a45a8ff 69 /** @snippet [TWI HW master write] */
bogdanm 0:9b334a45a8ff 70
bogdanm 0:9b334a45a8ff 71 if (issue_stop_condition)
bogdanm 0:9b334a45a8ff 72 {
mbed_official 29:d3245924094c 73 twi->EVENTS_STOPPED = 0;
mbed_official 29:d3245924094c 74 twi->TASKS_STOP = 1;
bogdanm 0:9b334a45a8ff 75 /* Wait until stop sequence is sent */
mbed_official 29:d3245924094c 76 while(twi->EVENTS_STOPPED == 0)
bogdanm 0:9b334a45a8ff 77 {
bogdanm 0:9b334a45a8ff 78 // Do nothing.
bogdanm 0:9b334a45a8ff 79 }
bogdanm 0:9b334a45a8ff 80 }
bogdanm 0:9b334a45a8ff 81 return true;
bogdanm 0:9b334a45a8ff 82 }
bogdanm 0:9b334a45a8ff 83
bogdanm 0:9b334a45a8ff 84
bogdanm 0:9b334a45a8ff 85 /** @brief Function for read by twi_master.
bogdanm 0:9b334a45a8ff 86 */
mbed_official 29:d3245924094c 87 static bool twi_master_read(uint8_t * data, uint8_t data_length, bool issue_stop_condition, NRF_TWI_Type* twi)
bogdanm 0:9b334a45a8ff 88 {
bogdanm 0:9b334a45a8ff 89 uint32_t timeout = MAX_TIMEOUT_LOOPS; /* max loops to wait for RXDREADY event*/
bogdanm 0:9b334a45a8ff 90
bogdanm 0:9b334a45a8ff 91 if (data_length == 0)
bogdanm 0:9b334a45a8ff 92 {
bogdanm 0:9b334a45a8ff 93 /* Return false for requesting data of size 0 */
bogdanm 0:9b334a45a8ff 94 return false;
bogdanm 0:9b334a45a8ff 95 }
bogdanm 0:9b334a45a8ff 96 else if (data_length == 1)
bogdanm 0:9b334a45a8ff 97 {
mbed_official 29:d3245924094c 98 NRF_PPI->CH[0].TEP = (uint32_t)&twi->TASKS_STOP;
bogdanm 0:9b334a45a8ff 99 }
bogdanm 0:9b334a45a8ff 100 else
bogdanm 0:9b334a45a8ff 101 {
mbed_official 29:d3245924094c 102 NRF_PPI->CH[0].TEP = (uint32_t)&twi->TASKS_SUSPEND;
bogdanm 0:9b334a45a8ff 103 }
bogdanm 0:9b334a45a8ff 104
bogdanm 0:9b334a45a8ff 105 NRF_PPI->CHENSET = PPI_CHENSET_CH0_Msk;
mbed_official 29:d3245924094c 106 twi->EVENTS_RXDREADY = 0;
mbed_official 29:d3245924094c 107 twi->TASKS_STARTRX = 1;
bogdanm 0:9b334a45a8ff 108
bogdanm 0:9b334a45a8ff 109 /** @snippet [TWI HW master read] */
bogdanm 0:9b334a45a8ff 110 while (true)
bogdanm 0:9b334a45a8ff 111 {
mbed_official 29:d3245924094c 112 while (twi->EVENTS_RXDREADY == 0 && NRF_TWI1->EVENTS_ERROR == 0 && (--timeout))
bogdanm 0:9b334a45a8ff 113 {
bogdanm 0:9b334a45a8ff 114 // Do nothing.
bogdanm 0:9b334a45a8ff 115 }
mbed_official 29:d3245924094c 116 twi->EVENTS_RXDREADY = 0;
bogdanm 0:9b334a45a8ff 117
mbed_official 29:d3245924094c 118 if (timeout == 0 || twi->EVENTS_ERROR != 0)
bogdanm 0:9b334a45a8ff 119 {
bogdanm 0:9b334a45a8ff 120 // Recover the peripheral as indicated by PAN 56: "TWI: TWI module lock-up." found at
bogdanm 0:9b334a45a8ff 121 // Product Anomaly Notification document found at
bogdanm 0:9b334a45a8ff 122 // https://www.nordicsemi.com/eng/Products/Bluetooth-R-low-energy/nRF51822/#Downloads
mbed_official 29:d3245924094c 123 twi->EVENTS_ERROR = 0;
mbed_official 29:d3245924094c 124 twi->ENABLE = TWI_ENABLE_ENABLE_Disabled << TWI_ENABLE_ENABLE_Pos;
mbed_official 29:d3245924094c 125 twi->POWER = 0;
bogdanm 0:9b334a45a8ff 126 nrf_delay_us(5);
mbed_official 29:d3245924094c 127 twi->POWER = 1;
mbed_official 29:d3245924094c 128 twi->ENABLE = TWI_ENABLE_ENABLE_Enabled << TWI_ENABLE_ENABLE_Pos;
bogdanm 0:9b334a45a8ff 129
mbed_official 29:d3245924094c 130 (void)twi_master_init_and_clear(twi);
bogdanm 0:9b334a45a8ff 131
bogdanm 0:9b334a45a8ff 132 return false;
bogdanm 0:9b334a45a8ff 133 }
bogdanm 0:9b334a45a8ff 134
bogdanm 0:9b334a45a8ff 135 *data++ = NRF_TWI1->RXD;
bogdanm 0:9b334a45a8ff 136
bogdanm 0:9b334a45a8ff 137 /* Configure PPI to stop TWI master before we get last BB event */
bogdanm 0:9b334a45a8ff 138 if (--data_length == 1)
bogdanm 0:9b334a45a8ff 139 {
bogdanm 0:9b334a45a8ff 140 NRF_PPI->CH[0].TEP = (uint32_t)&NRF_TWI1->TASKS_STOP;
bogdanm 0:9b334a45a8ff 141 }
bogdanm 0:9b334a45a8ff 142
bogdanm 0:9b334a45a8ff 143 if (data_length == 0)
bogdanm 0:9b334a45a8ff 144 {
bogdanm 0:9b334a45a8ff 145 break;
bogdanm 0:9b334a45a8ff 146 }
bogdanm 0:9b334a45a8ff 147
bogdanm 0:9b334a45a8ff 148 // Recover the peripheral as indicated by PAN 56: "TWI: TWI module lock-up." found at
bogdanm 0:9b334a45a8ff 149 // Product Anomaly Notification document found at
bogdanm 0:9b334a45a8ff 150 // https://www.nordicsemi.com/eng/Products/Bluetooth-R-low-energy/nRF51822/#Downloads
bogdanm 0:9b334a45a8ff 151 nrf_delay_us(20);
mbed_official 29:d3245924094c 152 twi->TASKS_RESUME = 1;
bogdanm 0:9b334a45a8ff 153 }
bogdanm 0:9b334a45a8ff 154 /** @snippet [TWI HW master read] */
bogdanm 0:9b334a45a8ff 155
bogdanm 0:9b334a45a8ff 156 /* Wait until stop sequence is sent */
mbed_official 29:d3245924094c 157 while(twi->EVENTS_STOPPED == 0)
bogdanm 0:9b334a45a8ff 158 {
bogdanm 0:9b334a45a8ff 159 // Do nothing.
bogdanm 0:9b334a45a8ff 160 }
mbed_official 29:d3245924094c 161 twi->EVENTS_STOPPED = 0;
bogdanm 0:9b334a45a8ff 162
bogdanm 0:9b334a45a8ff 163 NRF_PPI->CHENCLR = PPI_CHENCLR_CH0_Msk;
bogdanm 0:9b334a45a8ff 164 return true;
bogdanm 0:9b334a45a8ff 165 }
bogdanm 0:9b334a45a8ff 166
bogdanm 0:9b334a45a8ff 167
bogdanm 0:9b334a45a8ff 168 /**
bogdanm 0:9b334a45a8ff 169 * @brief Function for detecting stuck slaves (SDA = 0 and SCL = 1) and tries to clear the bus.
bogdanm 0:9b334a45a8ff 170 *
bogdanm 0:9b334a45a8ff 171 * @return
bogdanm 0:9b334a45a8ff 172 * @retval false Bus is stuck.
bogdanm 0:9b334a45a8ff 173 * @retval true Bus is clear.
bogdanm 0:9b334a45a8ff 174 */
mbed_official 29:d3245924094c 175 static bool twi_master_clear_bus(NRF_TWI_Type* twi)
bogdanm 0:9b334a45a8ff 176 {
bogdanm 0:9b334a45a8ff 177 uint32_t twi_state;
bogdanm 0:9b334a45a8ff 178 bool bus_clear;
bogdanm 0:9b334a45a8ff 179 uint32_t clk_pin_config;
bogdanm 0:9b334a45a8ff 180 uint32_t data_pin_config;
bogdanm 0:9b334a45a8ff 181
bogdanm 0:9b334a45a8ff 182 // Save and disable TWI hardware so software can take control over the pins.
mbed_official 29:d3245924094c 183 twi_state = twi->ENABLE;
mbed_official 29:d3245924094c 184 twi->ENABLE = TWI_ENABLE_ENABLE_Disabled << TWI_ENABLE_ENABLE_Pos;
bogdanm 0:9b334a45a8ff 185
bogdanm 0:9b334a45a8ff 186 clk_pin_config = \
bogdanm 0:9b334a45a8ff 187 NRF_GPIO->PIN_CNF[TWI_MASTER_CONFIG_CLOCK_PIN_NUMBER];
bogdanm 0:9b334a45a8ff 188 NRF_GPIO->PIN_CNF[TWI_MASTER_CONFIG_CLOCK_PIN_NUMBER] = \
bogdanm 0:9b334a45a8ff 189 (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos) \
bogdanm 0:9b334a45a8ff 190 | (GPIO_PIN_CNF_DRIVE_S0D1 << GPIO_PIN_CNF_DRIVE_Pos) \
bogdanm 0:9b334a45a8ff 191 | (GPIO_PIN_CNF_PULL_Pullup << GPIO_PIN_CNF_PULL_Pos) \
bogdanm 0:9b334a45a8ff 192 | (GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) \
bogdanm 0:9b334a45a8ff 193 | (GPIO_PIN_CNF_DIR_Output << GPIO_PIN_CNF_DIR_Pos);
bogdanm 0:9b334a45a8ff 194
bogdanm 0:9b334a45a8ff 195 data_pin_config = \
bogdanm 0:9b334a45a8ff 196 NRF_GPIO->PIN_CNF[TWI_MASTER_CONFIG_DATA_PIN_NUMBER];
bogdanm 0:9b334a45a8ff 197 NRF_GPIO->PIN_CNF[TWI_MASTER_CONFIG_DATA_PIN_NUMBER] = \
bogdanm 0:9b334a45a8ff 198 (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos) \
bogdanm 0:9b334a45a8ff 199 | (GPIO_PIN_CNF_DRIVE_S0D1 << GPIO_PIN_CNF_DRIVE_Pos) \
bogdanm 0:9b334a45a8ff 200 | (GPIO_PIN_CNF_PULL_Pullup << GPIO_PIN_CNF_PULL_Pos) \
bogdanm 0:9b334a45a8ff 201 | (GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) \
bogdanm 0:9b334a45a8ff 202 | (GPIO_PIN_CNF_DIR_Output << GPIO_PIN_CNF_DIR_Pos);
bogdanm 0:9b334a45a8ff 203
bogdanm 0:9b334a45a8ff 204 TWI_SDA_HIGH();
bogdanm 0:9b334a45a8ff 205 TWI_SCL_HIGH();
bogdanm 0:9b334a45a8ff 206 TWI_DELAY();
bogdanm 0:9b334a45a8ff 207
bogdanm 0:9b334a45a8ff 208 if ((TWI_SDA_READ() == 1) && (TWI_SCL_READ() == 1))
bogdanm 0:9b334a45a8ff 209 {
bogdanm 0:9b334a45a8ff 210 bus_clear = true;
bogdanm 0:9b334a45a8ff 211 }
bogdanm 0:9b334a45a8ff 212 else
bogdanm 0:9b334a45a8ff 213 {
bogdanm 0:9b334a45a8ff 214 uint_fast8_t i;
bogdanm 0:9b334a45a8ff 215 bus_clear = false;
bogdanm 0:9b334a45a8ff 216
bogdanm 0:9b334a45a8ff 217 // Clock max 18 pulses worst case scenario(9 for master to send the rest of command and 9
bogdanm 0:9b334a45a8ff 218 // for slave to respond) to SCL line and wait for SDA come high.
bogdanm 0:9b334a45a8ff 219 for (i=18; i--;)
bogdanm 0:9b334a45a8ff 220 {
bogdanm 0:9b334a45a8ff 221 TWI_SCL_LOW();
bogdanm 0:9b334a45a8ff 222 TWI_DELAY();
bogdanm 0:9b334a45a8ff 223 TWI_SCL_HIGH();
bogdanm 0:9b334a45a8ff 224 TWI_DELAY();
bogdanm 0:9b334a45a8ff 225
bogdanm 0:9b334a45a8ff 226 if (TWI_SDA_READ() == 1)
bogdanm 0:9b334a45a8ff 227 {
bogdanm 0:9b334a45a8ff 228 bus_clear = true;
bogdanm 0:9b334a45a8ff 229 break;
bogdanm 0:9b334a45a8ff 230 }
bogdanm 0:9b334a45a8ff 231 }
bogdanm 0:9b334a45a8ff 232 }
bogdanm 0:9b334a45a8ff 233
bogdanm 0:9b334a45a8ff 234 NRF_GPIO->PIN_CNF[TWI_MASTER_CONFIG_CLOCK_PIN_NUMBER] = clk_pin_config;
bogdanm 0:9b334a45a8ff 235 NRF_GPIO->PIN_CNF[TWI_MASTER_CONFIG_DATA_PIN_NUMBER] = data_pin_config;
bogdanm 0:9b334a45a8ff 236
mbed_official 29:d3245924094c 237 twi->ENABLE = twi_state;
bogdanm 0:9b334a45a8ff 238
bogdanm 0:9b334a45a8ff 239 return bus_clear;
bogdanm 0:9b334a45a8ff 240 }
bogdanm 0:9b334a45a8ff 241
bogdanm 0:9b334a45a8ff 242
bogdanm 0:9b334a45a8ff 243 /** @brief Function for initializing the twi_master.
bogdanm 0:9b334a45a8ff 244 */
mbed_official 29:d3245924094c 245 bool twi_master_init_and_clear(NRF_TWI_Type* twi)
bogdanm 0:9b334a45a8ff 246 {
bogdanm 0:9b334a45a8ff 247 /* To secure correct signal levels on the pins used by the TWI
bogdanm 0:9b334a45a8ff 248 master when the system is in OFF mode, and when the TWI master is
bogdanm 0:9b334a45a8ff 249 disabled, these pins must be configured in the GPIO peripheral.
bogdanm 0:9b334a45a8ff 250 */
bogdanm 0:9b334a45a8ff 251 NRF_GPIO->PIN_CNF[TWI_MASTER_CONFIG_CLOCK_PIN_NUMBER] = \
bogdanm 0:9b334a45a8ff 252 (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos) \
bogdanm 0:9b334a45a8ff 253 | (GPIO_PIN_CNF_DRIVE_S0D1 << GPIO_PIN_CNF_DRIVE_Pos) \
bogdanm 0:9b334a45a8ff 254 | (GPIO_PIN_CNF_PULL_Pullup << GPIO_PIN_CNF_PULL_Pos) \
bogdanm 0:9b334a45a8ff 255 | (GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) \
bogdanm 0:9b334a45a8ff 256 | (GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos);
bogdanm 0:9b334a45a8ff 257
bogdanm 0:9b334a45a8ff 258 NRF_GPIO->PIN_CNF[TWI_MASTER_CONFIG_DATA_PIN_NUMBER] = \
bogdanm 0:9b334a45a8ff 259 (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos) \
bogdanm 0:9b334a45a8ff 260 | (GPIO_PIN_CNF_DRIVE_S0D1 << GPIO_PIN_CNF_DRIVE_Pos) \
bogdanm 0:9b334a45a8ff 261 | (GPIO_PIN_CNF_PULL_Pullup << GPIO_PIN_CNF_PULL_Pos) \
bogdanm 0:9b334a45a8ff 262 | (GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) \
bogdanm 0:9b334a45a8ff 263 | (GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos);
bogdanm 0:9b334a45a8ff 264
mbed_official 29:d3245924094c 265 twi->EVENTS_RXDREADY = 0;
mbed_official 29:d3245924094c 266 twi->EVENTS_TXDSENT = 0;
mbed_official 29:d3245924094c 267 twi->PSELSCL = TWI_MASTER_CONFIG_CLOCK_PIN_NUMBER;
mbed_official 29:d3245924094c 268 twi->PSELSDA = TWI_MASTER_CONFIG_DATA_PIN_NUMBER;
mbed_official 29:d3245924094c 269 twi->FREQUENCY = TWI_FREQUENCY_FREQUENCY_K100 << TWI_FREQUENCY_FREQUENCY_Pos;
mbed_official 29:d3245924094c 270 NRF_PPI->CH[0].EEP = (uint32_t)&twi->EVENTS_BB;
mbed_official 29:d3245924094c 271 NRF_PPI->CH[0].TEP = (uint32_t)&twi->TASKS_SUSPEND;
bogdanm 0:9b334a45a8ff 272 NRF_PPI->CHENCLR = PPI_CHENCLR_CH0_Msk;
mbed_official 29:d3245924094c 273 twi->ENABLE = TWI_ENABLE_ENABLE_Enabled << TWI_ENABLE_ENABLE_Pos;
bogdanm 0:9b334a45a8ff 274
mbed_official 29:d3245924094c 275 return twi_master_clear_bus(twi);
bogdanm 0:9b334a45a8ff 276 }
bogdanm 0:9b334a45a8ff 277
bogdanm 0:9b334a45a8ff 278
bogdanm 0:9b334a45a8ff 279 /** @brief Function for transfer by twi_master.
bogdanm 0:9b334a45a8ff 280 */
bogdanm 0:9b334a45a8ff 281 bool twi_master_transfer(uint8_t address,
bogdanm 0:9b334a45a8ff 282 uint8_t * data,
bogdanm 0:9b334a45a8ff 283 uint8_t data_length,
mbed_official 29:d3245924094c 284 bool issue_stop_condition,
mbed_official 29:d3245924094c 285 NRF_TWI_Type* twi)
bogdanm 0:9b334a45a8ff 286 {
bogdanm 0:9b334a45a8ff 287 bool transfer_succeeded = false;
mbed_official 29:d3245924094c 288 if (data_length > 0 && twi_master_clear_bus(twi))
bogdanm 0:9b334a45a8ff 289 {
mbed_official 29:d3245924094c 290 twi->ADDRESS = (address >> 1);
bogdanm 0:9b334a45a8ff 291
bogdanm 0:9b334a45a8ff 292 if ((address & TWI_READ_BIT))
bogdanm 0:9b334a45a8ff 293 {
mbed_official 29:d3245924094c 294 transfer_succeeded = twi_master_read(data, data_length, issue_stop_condition, twi);
bogdanm 0:9b334a45a8ff 295 }
bogdanm 0:9b334a45a8ff 296 else
bogdanm 0:9b334a45a8ff 297 {
mbed_official 29:d3245924094c 298 transfer_succeeded = twi_master_write(data, data_length, issue_stop_condition, twi);
bogdanm 0:9b334a45a8ff 299 }
bogdanm 0:9b334a45a8ff 300 }
bogdanm 0:9b334a45a8ff 301 return transfer_succeeded;
bogdanm 0:9b334a45a8ff 302 }
bogdanm 0:9b334a45a8ff 303
bogdanm 0:9b334a45a8ff 304 /*lint --flb "Leave library region" */