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:
149:156823d33999
mbed library release version 165

Who changed what in which revision?

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