mbed official / mbed-dev

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
mbed library release version 165

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AnnaBridge 189:f392fc9709a3 1 /**
AnnaBridge 189:f392fc9709a3 2 * \file
AnnaBridge 189:f392fc9709a3 3 *
AnnaBridge 189:f392fc9709a3 4 * \brief SAM SERCOM I2C Master Driver
AnnaBridge 189:f392fc9709a3 5 *
AnnaBridge 189:f392fc9709a3 6 * Copyright (C) 2012-2015 Atmel Corporation. All rights reserved.
AnnaBridge 189:f392fc9709a3 7 *
AnnaBridge 189:f392fc9709a3 8 * \asf_license_start
AnnaBridge 189:f392fc9709a3 9 *
AnnaBridge 189:f392fc9709a3 10 * \page License
AnnaBridge 189:f392fc9709a3 11 *
AnnaBridge 189:f392fc9709a3 12 * Redistribution and use in source and binary forms, with or without
AnnaBridge 189:f392fc9709a3 13 * modification, are permitted provided that the following conditions are met:
AnnaBridge 189:f392fc9709a3 14 *
AnnaBridge 189:f392fc9709a3 15 * 1. Redistributions of source code must retain the above copyright notice,
AnnaBridge 189:f392fc9709a3 16 * this list of conditions and the following disclaimer.
AnnaBridge 189:f392fc9709a3 17 *
AnnaBridge 189:f392fc9709a3 18 * 2. Redistributions in binary form must reproduce the above copyright notice,
AnnaBridge 189:f392fc9709a3 19 * this list of conditions and the following disclaimer in the documentation
AnnaBridge 189:f392fc9709a3 20 * and/or other materials provided with the distribution.
AnnaBridge 189:f392fc9709a3 21 *
AnnaBridge 189:f392fc9709a3 22 * 3. The name of Atmel may not be used to endorse or promote products derived
AnnaBridge 189:f392fc9709a3 23 * from this software without specific prior written permission.
AnnaBridge 189:f392fc9709a3 24 *
AnnaBridge 189:f392fc9709a3 25 * 4. This software may only be redistributed and used in connection with an
AnnaBridge 189:f392fc9709a3 26 * Atmel microcontroller product.
AnnaBridge 189:f392fc9709a3 27 *
AnnaBridge 189:f392fc9709a3 28 * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED
AnnaBridge 189:f392fc9709a3 29 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
AnnaBridge 189:f392fc9709a3 30 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
AnnaBridge 189:f392fc9709a3 31 * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR
AnnaBridge 189:f392fc9709a3 32 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
AnnaBridge 189:f392fc9709a3 33 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
AnnaBridge 189:f392fc9709a3 34 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
AnnaBridge 189:f392fc9709a3 35 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
AnnaBridge 189:f392fc9709a3 36 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
AnnaBridge 189:f392fc9709a3 37 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
AnnaBridge 189:f392fc9709a3 38 * POSSIBILITY OF SUCH DAMAGE.
AnnaBridge 189:f392fc9709a3 39 *
AnnaBridge 189:f392fc9709a3 40 * \asf_license_stop
AnnaBridge 189:f392fc9709a3 41 *
AnnaBridge 189:f392fc9709a3 42 */
AnnaBridge 189:f392fc9709a3 43 /*
AnnaBridge 189:f392fc9709a3 44 * Support and FAQ: visit <a href="http://www.atmel.com/design-support/">Atmel Support</a>
AnnaBridge 189:f392fc9709a3 45 */
AnnaBridge 189:f392fc9709a3 46
AnnaBridge 189:f392fc9709a3 47 #ifndef I2C_MASTER_H_INCLUDED
AnnaBridge 189:f392fc9709a3 48 #define I2C_MASTER_H_INCLUDED
AnnaBridge 189:f392fc9709a3 49
AnnaBridge 189:f392fc9709a3 50 #include "i2c_common.h"
AnnaBridge 189:f392fc9709a3 51 #include <sercom.h>
AnnaBridge 189:f392fc9709a3 52 #include <pinmux.h>
AnnaBridge 189:f392fc9709a3 53
AnnaBridge 189:f392fc9709a3 54 #if I2C_MASTER_CALLBACK_MODE == true
AnnaBridge 189:f392fc9709a3 55 # include <sercom_interrupt.h>
AnnaBridge 189:f392fc9709a3 56 #endif
AnnaBridge 189:f392fc9709a3 57
AnnaBridge 189:f392fc9709a3 58 #ifdef __cplusplus
AnnaBridge 189:f392fc9709a3 59 extern "C" {
AnnaBridge 189:f392fc9709a3 60 #endif
AnnaBridge 189:f392fc9709a3 61
AnnaBridge 189:f392fc9709a3 62 #ifndef PINMUX_DEFAULT
AnnaBridge 189:f392fc9709a3 63 # define PINMUX_DEFAULT 0
AnnaBridge 189:f392fc9709a3 64 #endif
AnnaBridge 189:f392fc9709a3 65
AnnaBridge 189:f392fc9709a3 66 /**
AnnaBridge 189:f392fc9709a3 67 * \addtogroup asfdoc_sam0_sercom_i2c_group
AnnaBridge 189:f392fc9709a3 68 *
AnnaBridge 189:f392fc9709a3 69 * @{
AnnaBridge 189:f392fc9709a3 70 */
AnnaBridge 189:f392fc9709a3 71
AnnaBridge 189:f392fc9709a3 72 /**
AnnaBridge 189:f392fc9709a3 73 * \brief I<SUP>2</SUP>C master packet for read/write
AnnaBridge 189:f392fc9709a3 74 *
AnnaBridge 189:f392fc9709a3 75 * Structure to be used when transferring I<SUP>2</SUP>C master packets.
AnnaBridge 189:f392fc9709a3 76 */
AnnaBridge 189:f392fc9709a3 77 struct i2c_master_packet {
AnnaBridge 189:f392fc9709a3 78 /** Address to slave device. */
AnnaBridge 189:f392fc9709a3 79 uint16_t address;
AnnaBridge 189:f392fc9709a3 80 /** Length of data array. */
AnnaBridge 189:f392fc9709a3 81 uint16_t data_length;
AnnaBridge 189:f392fc9709a3 82 /** Data array containing all data to be transferred. */
AnnaBridge 189:f392fc9709a3 83 uint8_t *data;
AnnaBridge 189:f392fc9709a3 84 /** Use 10-bit addressing. Set to false if the feature is not supported by the device. */
AnnaBridge 189:f392fc9709a3 85 bool ten_bit_address;
AnnaBridge 189:f392fc9709a3 86 /** Use high speed transfer. Set to false if the feature is not supported by the device. */
AnnaBridge 189:f392fc9709a3 87 bool high_speed;
AnnaBridge 189:f392fc9709a3 88 /** High speed mode master code (0000 1XXX), valid when high_speed is true. */
AnnaBridge 189:f392fc9709a3 89 uint8_t hs_master_code;
AnnaBridge 189:f392fc9709a3 90 };
AnnaBridge 189:f392fc9709a3 91
AnnaBridge 189:f392fc9709a3 92 /** \brief Interrupt flags
AnnaBridge 189:f392fc9709a3 93 *
AnnaBridge 189:f392fc9709a3 94 * Flags used when reading or setting interrupt flags.
AnnaBridge 189:f392fc9709a3 95 */
AnnaBridge 189:f392fc9709a3 96 enum i2c_master_interrupt_flag {
AnnaBridge 189:f392fc9709a3 97 /** Interrupt flag used for write. */
AnnaBridge 189:f392fc9709a3 98 I2C_MASTER_INTERRUPT_WRITE = 0,
AnnaBridge 189:f392fc9709a3 99 /** Interrupt flag used for read. */
AnnaBridge 189:f392fc9709a3 100 I2C_MASTER_INTERRUPT_READ = 1,
AnnaBridge 189:f392fc9709a3 101 };
AnnaBridge 189:f392fc9709a3 102
AnnaBridge 189:f392fc9709a3 103 /**
AnnaBridge 189:f392fc9709a3 104 * \brief Values for hold time after start bit.
AnnaBridge 189:f392fc9709a3 105 *
AnnaBridge 189:f392fc9709a3 106 * Values for the possible I<SUP>2</SUP>C master mode SDA internal hold times after start
AnnaBridge 189:f392fc9709a3 107 * bit has been sent.
AnnaBridge 189:f392fc9709a3 108 */
AnnaBridge 189:f392fc9709a3 109 enum i2c_master_start_hold_time {
AnnaBridge 189:f392fc9709a3 110 /** Internal SDA hold time disabled. */
AnnaBridge 189:f392fc9709a3 111 I2C_MASTER_START_HOLD_TIME_DISABLED = SERCOM_I2CM_CTRLA_SDAHOLD(0),
AnnaBridge 189:f392fc9709a3 112 /** Internal SDA hold time 50ns - 100ns. */
AnnaBridge 189:f392fc9709a3 113 I2C_MASTER_START_HOLD_TIME_50NS_100NS = SERCOM_I2CM_CTRLA_SDAHOLD(1),
AnnaBridge 189:f392fc9709a3 114 /** Internal SDA hold time 300ns - 600ns. */
AnnaBridge 189:f392fc9709a3 115 I2C_MASTER_START_HOLD_TIME_300NS_600NS = SERCOM_I2CM_CTRLA_SDAHOLD(2),
AnnaBridge 189:f392fc9709a3 116 /** Internal SDA hold time 400ns - 800ns. */
AnnaBridge 189:f392fc9709a3 117 I2C_MASTER_START_HOLD_TIME_400NS_800NS = SERCOM_I2CM_CTRLA_SDAHOLD(3),
AnnaBridge 189:f392fc9709a3 118 };
AnnaBridge 189:f392fc9709a3 119
AnnaBridge 189:f392fc9709a3 120 /**
AnnaBridge 189:f392fc9709a3 121 * \brief Values for inactive bus time-out.
AnnaBridge 189:f392fc9709a3 122 *
AnnaBridge 189:f392fc9709a3 123 * If the inactive bus time-out is enabled and the bus is inactive for
AnnaBridge 189:f392fc9709a3 124 * longer than the time-out setting, the bus state logic will be set to idle.
AnnaBridge 189:f392fc9709a3 125 */
AnnaBridge 189:f392fc9709a3 126 enum i2c_master_inactive_timeout {
AnnaBridge 189:f392fc9709a3 127 /** Inactive bus time-out disabled. */
AnnaBridge 189:f392fc9709a3 128 I2C_MASTER_INACTIVE_TIMEOUT_DISABLED = SERCOM_I2CM_CTRLA_INACTOUT(0),
AnnaBridge 189:f392fc9709a3 129 /** Inactive bus time-out 5-6 SCL cycle time-out. */
AnnaBridge 189:f392fc9709a3 130 I2C_MASTER_INACTIVE_TIMEOUT_55US = SERCOM_I2CM_CTRLA_INACTOUT(1),
AnnaBridge 189:f392fc9709a3 131 /** Inactive bus time-out 10-11 SCL cycle time-out. */
AnnaBridge 189:f392fc9709a3 132 I2C_MASTER_INACTIVE_TIMEOUT_105US = SERCOM_I2CM_CTRLA_INACTOUT(2),
AnnaBridge 189:f392fc9709a3 133 /** Inactive bus time-out 20-21 SCL cycle time-out. */
AnnaBridge 189:f392fc9709a3 134 I2C_MASTER_INACTIVE_TIMEOUT_205US = SERCOM_I2CM_CTRLA_INACTOUT(3),
AnnaBridge 189:f392fc9709a3 135 };
AnnaBridge 189:f392fc9709a3 136
AnnaBridge 189:f392fc9709a3 137 /**
AnnaBridge 189:f392fc9709a3 138 * \brief I<SUP>2</SUP>C frequencies
AnnaBridge 189:f392fc9709a3 139 *
AnnaBridge 189:f392fc9709a3 140 * Values for I<SUP>2</SUP>C speeds supported by the module. The driver
AnnaBridge 189:f392fc9709a3 141 * will also support setting any other value, in which case set
AnnaBridge 189:f392fc9709a3 142 * the value in the \ref i2c_master_config at desired value divided by 1000.
AnnaBridge 189:f392fc9709a3 143 *
AnnaBridge 189:f392fc9709a3 144 * Example: If 10KHz operation is required, give baud_rate in the configuration
AnnaBridge 189:f392fc9709a3 145 * structure the value 10.
AnnaBridge 189:f392fc9709a3 146 */
AnnaBridge 189:f392fc9709a3 147 enum i2c_master_baud_rate {
AnnaBridge 189:f392fc9709a3 148 /** Baud rate at 100KHz (Standard-mode). */
AnnaBridge 189:f392fc9709a3 149 I2C_MASTER_BAUD_RATE_100KHZ = 100,
AnnaBridge 189:f392fc9709a3 150 /** Baud rate at 400KHz (Fast-mode). */
AnnaBridge 189:f392fc9709a3 151 I2C_MASTER_BAUD_RATE_400KHZ = 400,
AnnaBridge 189:f392fc9709a3 152 #ifdef FEATURE_I2C_FAST_MODE_PLUS_AND_HIGH_SPEED
AnnaBridge 189:f392fc9709a3 153 /** Baud rate at 1MHz (Fast-mode Plus). */
AnnaBridge 189:f392fc9709a3 154 I2C_MASTER_BAUD_RATE_1000KHZ = 1000,
AnnaBridge 189:f392fc9709a3 155 /** Baud rate at 3.4MHz (High-speed mode). */
AnnaBridge 189:f392fc9709a3 156 I2C_MASTER_BAUD_RATE_3400KHZ = 3400,
AnnaBridge 189:f392fc9709a3 157 #endif
AnnaBridge 189:f392fc9709a3 158 };
AnnaBridge 189:f392fc9709a3 159
AnnaBridge 189:f392fc9709a3 160 #ifdef FEATURE_I2C_FAST_MODE_PLUS_AND_HIGH_SPEED
AnnaBridge 189:f392fc9709a3 161 /**
AnnaBridge 189:f392fc9709a3 162 * \brief Enum for the transfer speed
AnnaBridge 189:f392fc9709a3 163 *
AnnaBridge 189:f392fc9709a3 164 * Enum for the transfer speed.
AnnaBridge 189:f392fc9709a3 165 */
AnnaBridge 189:f392fc9709a3 166 enum i2c_master_transfer_speed {
AnnaBridge 189:f392fc9709a3 167 /** Standard-mode (Sm) up to 100KHz and Fast-mode (Fm) up to 400KHz. */
AnnaBridge 189:f392fc9709a3 168 I2C_MASTER_SPEED_STANDARD_AND_FAST = SERCOM_I2CM_CTRLA_SPEED(0),
AnnaBridge 189:f392fc9709a3 169 /** Fast-mode Plus (Fm+) up to 1MHz. */
AnnaBridge 189:f392fc9709a3 170 I2C_MASTER_SPEED_FAST_MODE_PLUS = SERCOM_I2CM_CTRLA_SPEED(1),
AnnaBridge 189:f392fc9709a3 171 /** High-speed mode (Hs-mode) up to 3.4MHz. */
AnnaBridge 189:f392fc9709a3 172 I2C_MASTER_SPEED_HIGH_SPEED = SERCOM_I2CM_CTRLA_SPEED(2),
AnnaBridge 189:f392fc9709a3 173 };
AnnaBridge 189:f392fc9709a3 174 #endif
AnnaBridge 189:f392fc9709a3 175
AnnaBridge 189:f392fc9709a3 176 #if I2C_MASTER_CALLBACK_MODE == true
AnnaBridge 189:f392fc9709a3 177 /**
AnnaBridge 189:f392fc9709a3 178 * \brief Callback types
AnnaBridge 189:f392fc9709a3 179 *
AnnaBridge 189:f392fc9709a3 180 * The available callback types for the I<SUP>2</SUP>C master module.
AnnaBridge 189:f392fc9709a3 181 */
AnnaBridge 189:f392fc9709a3 182 enum i2c_master_callback {
AnnaBridge 189:f392fc9709a3 183 /** Callback for packet write complete. */
AnnaBridge 189:f392fc9709a3 184 I2C_MASTER_CALLBACK_WRITE_COMPLETE = 0,
AnnaBridge 189:f392fc9709a3 185 /** Callback for packet read complete. */
AnnaBridge 189:f392fc9709a3 186 I2C_MASTER_CALLBACK_READ_COMPLETE = 1,
AnnaBridge 189:f392fc9709a3 187 /** Callback for error. */
AnnaBridge 189:f392fc9709a3 188 I2C_MASTER_CALLBACK_ERROR = 2,
AnnaBridge 189:f392fc9709a3 189 # if !defined(__DOXYGEN__)
AnnaBridge 189:f392fc9709a3 190 /** Total number of callbacks. */
AnnaBridge 189:f392fc9709a3 191 _I2C_MASTER_CALLBACK_N = 3,
AnnaBridge 189:f392fc9709a3 192 # endif
AnnaBridge 189:f392fc9709a3 193 };
AnnaBridge 189:f392fc9709a3 194
AnnaBridge 189:f392fc9709a3 195 # if !defined(__DOXYGEN__)
AnnaBridge 189:f392fc9709a3 196 /* Prototype for software module. */
AnnaBridge 189:f392fc9709a3 197 struct i2c_master_module;
AnnaBridge 189:f392fc9709a3 198
AnnaBridge 189:f392fc9709a3 199 typedef void (*i2c_master_callback_t)(
AnnaBridge 189:f392fc9709a3 200 struct i2c_master_module *const module);
AnnaBridge 189:f392fc9709a3 201 # endif
AnnaBridge 189:f392fc9709a3 202 #endif
AnnaBridge 189:f392fc9709a3 203
AnnaBridge 189:f392fc9709a3 204 /**
AnnaBridge 189:f392fc9709a3 205 * \brief SERCOM I<SUP>2</SUP>C Master driver software device instance structure.
AnnaBridge 189:f392fc9709a3 206 *
AnnaBridge 189:f392fc9709a3 207 * SERCOM I<SUP>2</SUP>C Master driver software instance structure, used to
AnnaBridge 189:f392fc9709a3 208 * retain software state information of an associated hardware module instance.
AnnaBridge 189:f392fc9709a3 209 *
AnnaBridge 189:f392fc9709a3 210 * \note The fields of this structure should not be altered by the user
AnnaBridge 189:f392fc9709a3 211 * application; they are reserved for module-internal use only.
AnnaBridge 189:f392fc9709a3 212 */
AnnaBridge 189:f392fc9709a3 213 struct i2c_master_module {
AnnaBridge 189:f392fc9709a3 214 #if !defined(__DOXYGEN__)
AnnaBridge 189:f392fc9709a3 215 /** Hardware instance initialized for the struct. */
AnnaBridge 189:f392fc9709a3 216 Sercom *hw;
AnnaBridge 189:f392fc9709a3 217 /** Module lock. */
AnnaBridge 189:f392fc9709a3 218 volatile bool locked;
AnnaBridge 189:f392fc9709a3 219 /** Unknown bus state timeout. */
AnnaBridge 189:f392fc9709a3 220 uint16_t unknown_bus_state_timeout;
AnnaBridge 189:f392fc9709a3 221 /** Buffer write timeout value. */
AnnaBridge 189:f392fc9709a3 222 uint16_t buffer_timeout;
AnnaBridge 189:f392fc9709a3 223 /** If true, stop condition will be sent after a read/write. */
AnnaBridge 189:f392fc9709a3 224 bool send_stop;
AnnaBridge 189:f392fc9709a3 225 /** If true, nack signal will be sent after a read/write. */
AnnaBridge 189:f392fc9709a3 226 bool send_nack;
AnnaBridge 189:f392fc9709a3 227 # if I2C_MASTER_CALLBACK_MODE == true
AnnaBridge 189:f392fc9709a3 228 /** Pointers to callback functions. */
AnnaBridge 189:f392fc9709a3 229 volatile i2c_master_callback_t callbacks[_I2C_MASTER_CALLBACK_N];
AnnaBridge 189:f392fc9709a3 230 /** Mask for registered callbacks. */
AnnaBridge 189:f392fc9709a3 231 volatile uint8_t registered_callback;
AnnaBridge 189:f392fc9709a3 232 /** Mask for enabled callbacks. */
AnnaBridge 189:f392fc9709a3 233 volatile uint8_t enabled_callback;
AnnaBridge 189:f392fc9709a3 234 /** The total number of bytes to transfer. */
AnnaBridge 189:f392fc9709a3 235 volatile uint16_t buffer_length;
AnnaBridge 189:f392fc9709a3 236 /**
AnnaBridge 189:f392fc9709a3 237 * Counter used for bytes left to send in write and to count number of
AnnaBridge 189:f392fc9709a3 238 * obtained bytes in read.
AnnaBridge 189:f392fc9709a3 239 */
AnnaBridge 189:f392fc9709a3 240 volatile uint16_t buffer_remaining;
AnnaBridge 189:f392fc9709a3 241 /** Data buffer for packet write and read. */
AnnaBridge 189:f392fc9709a3 242 volatile uint8_t *buffer;
AnnaBridge 189:f392fc9709a3 243 /** Save direction of async request. 1 = read, 0 = write. */
AnnaBridge 189:f392fc9709a3 244 volatile enum i2c_transfer_direction transfer_direction;
AnnaBridge 189:f392fc9709a3 245 /** Status for status read back in error callback. */
AnnaBridge 189:f392fc9709a3 246 volatile enum status_code status;
AnnaBridge 189:f392fc9709a3 247 # endif
AnnaBridge 189:f392fc9709a3 248 #endif
AnnaBridge 189:f392fc9709a3 249 };
AnnaBridge 189:f392fc9709a3 250
AnnaBridge 189:f392fc9709a3 251 /**
AnnaBridge 189:f392fc9709a3 252 * \brief Configuration structure for the I<SUP>2</SUP>C Master device
AnnaBridge 189:f392fc9709a3 253 *
AnnaBridge 189:f392fc9709a3 254 * This is the configuration structure for the I<SUP>2</SUP>C Master device. It
AnnaBridge 189:f392fc9709a3 255 * is used as an argument for \ref i2c_master_init to provide the desired
AnnaBridge 189:f392fc9709a3 256 * configurations for the module. The structure should be initialized using the
AnnaBridge 189:f392fc9709a3 257 * \ref i2c_master_get_config_defaults .
AnnaBridge 189:f392fc9709a3 258 */
AnnaBridge 189:f392fc9709a3 259 struct i2c_master_config {
AnnaBridge 189:f392fc9709a3 260 /** Baud rate (in KHz) for I<SUP>2</SUP>C operations in
AnnaBridge 189:f392fc9709a3 261 * standard-mode, Fast-mode and Fast-mode Plus Transfers,
AnnaBridge 189:f392fc9709a3 262 * \ref i2c_master_baud_rate. */
AnnaBridge 189:f392fc9709a3 263 uint32_t baud_rate;
AnnaBridge 189:f392fc9709a3 264 #ifdef FEATURE_I2C_FAST_MODE_PLUS_AND_HIGH_SPEED
AnnaBridge 189:f392fc9709a3 265 /** Baud rate (in KHz) for I<SUP>2</SUP>C operations in
AnnaBridge 189:f392fc9709a3 266 * High-speed mode, \ref i2c_master_baud_rate. */
AnnaBridge 189:f392fc9709a3 267 uint32_t baud_rate_high_speed;
AnnaBridge 189:f392fc9709a3 268 /** Transfer speed mode. */
AnnaBridge 189:f392fc9709a3 269 enum i2c_master_transfer_speed transfer_speed;
AnnaBridge 189:f392fc9709a3 270 #endif
AnnaBridge 189:f392fc9709a3 271 /** GCLK generator to use as clock source. */
AnnaBridge 189:f392fc9709a3 272 enum gclk_generator generator_source;
AnnaBridge 189:f392fc9709a3 273 /** Bus hold time after start signal on data line. */
AnnaBridge 189:f392fc9709a3 274 enum i2c_master_start_hold_time start_hold_time;
AnnaBridge 189:f392fc9709a3 275 /** Unknown bus state \ref asfdoc_sam0_sercom_i2c_unknown_bus_timeout "timeout". */
AnnaBridge 189:f392fc9709a3 276 uint16_t unknown_bus_state_timeout;
AnnaBridge 189:f392fc9709a3 277 /** Timeout for packet write to wait for slave. */
AnnaBridge 189:f392fc9709a3 278 uint16_t buffer_timeout;
AnnaBridge 189:f392fc9709a3 279 /** Set to keep module active in sleep modes. */
AnnaBridge 189:f392fc9709a3 280 bool run_in_standby;
AnnaBridge 189:f392fc9709a3 281 /** PAD0 (SDA) pinmux. */
AnnaBridge 189:f392fc9709a3 282 uint32_t pinmux_pad0;
AnnaBridge 189:f392fc9709a3 283 /** PAD1 (SCL) pinmux. */
AnnaBridge 189:f392fc9709a3 284 uint32_t pinmux_pad1;
AnnaBridge 189:f392fc9709a3 285 /** Set to enable SCL low time-out. */
AnnaBridge 189:f392fc9709a3 286 bool scl_low_timeout;
AnnaBridge 189:f392fc9709a3 287 /** Inactive bus time out. */
AnnaBridge 189:f392fc9709a3 288 enum i2c_master_inactive_timeout inactive_timeout;
AnnaBridge 189:f392fc9709a3 289 #ifdef FEATURE_I2C_SCL_STRETCH_MODE
AnnaBridge 189:f392fc9709a3 290 /** Set to enable SCL stretch only after ACK bit (required for high speed). */
AnnaBridge 189:f392fc9709a3 291 bool scl_stretch_only_after_ack_bit;
AnnaBridge 189:f392fc9709a3 292 #endif
AnnaBridge 189:f392fc9709a3 293 #ifdef FEATURE_I2C_SCL_EXTEND_TIMEOUT
AnnaBridge 189:f392fc9709a3 294 /** Set to enable slave SCL low extend time-out. */
AnnaBridge 189:f392fc9709a3 295 bool slave_scl_low_extend_timeout;
AnnaBridge 189:f392fc9709a3 296 /** Set to enable maser SCL low extend time-out. */
AnnaBridge 189:f392fc9709a3 297 bool master_scl_low_extend_timeout;
AnnaBridge 189:f392fc9709a3 298 #endif
AnnaBridge 189:f392fc9709a3 299 /** Get more accurate BAUD, considering rise time(required for standard-mode and Fast-mode). */
AnnaBridge 189:f392fc9709a3 300 uint16_t sda_scl_rise_time_ns;
AnnaBridge 189:f392fc9709a3 301 };
AnnaBridge 189:f392fc9709a3 302
AnnaBridge 189:f392fc9709a3 303 /**
AnnaBridge 189:f392fc9709a3 304 * \name Lock/Unlock
AnnaBridge 189:f392fc9709a3 305 * @{
AnnaBridge 189:f392fc9709a3 306 */
AnnaBridge 189:f392fc9709a3 307
AnnaBridge 189:f392fc9709a3 308 /**
AnnaBridge 189:f392fc9709a3 309 * \brief Attempt to get lock on driver instance
AnnaBridge 189:f392fc9709a3 310 *
AnnaBridge 189:f392fc9709a3 311 * This function checks the instance's lock, which indicates whether or not it
AnnaBridge 189:f392fc9709a3 312 * is currently in use, and sets the lock if it was not already set.
AnnaBridge 189:f392fc9709a3 313 *
AnnaBridge 189:f392fc9709a3 314 * The purpose of this is to enable exclusive access to driver instances, so
AnnaBridge 189:f392fc9709a3 315 * that, e.g., transactions by different services will not interfere with each
AnnaBridge 189:f392fc9709a3 316 * other.
AnnaBridge 189:f392fc9709a3 317 *
AnnaBridge 189:f392fc9709a3 318 * \param[in,out] module Pointer to the driver instance to lock
AnnaBridge 189:f392fc9709a3 319 *
AnnaBridge 189:f392fc9709a3 320 * \retval STATUS_OK If the module was locked
AnnaBridge 189:f392fc9709a3 321 * \retval STATUS_BUSY If the module was already locked
AnnaBridge 189:f392fc9709a3 322 */
AnnaBridge 189:f392fc9709a3 323 static inline enum status_code i2c_master_lock(
AnnaBridge 189:f392fc9709a3 324 struct i2c_master_module *const module)
AnnaBridge 189:f392fc9709a3 325 {
AnnaBridge 189:f392fc9709a3 326 enum status_code status;
AnnaBridge 189:f392fc9709a3 327
AnnaBridge 189:f392fc9709a3 328 system_interrupt_enter_critical_section();
AnnaBridge 189:f392fc9709a3 329
AnnaBridge 189:f392fc9709a3 330 if (module->locked) {
AnnaBridge 189:f392fc9709a3 331 status = STATUS_BUSY;
AnnaBridge 189:f392fc9709a3 332 } else {
AnnaBridge 189:f392fc9709a3 333 module->locked = true;
AnnaBridge 189:f392fc9709a3 334 status = STATUS_OK;
AnnaBridge 189:f392fc9709a3 335 }
AnnaBridge 189:f392fc9709a3 336
AnnaBridge 189:f392fc9709a3 337 system_interrupt_leave_critical_section();
AnnaBridge 189:f392fc9709a3 338
AnnaBridge 189:f392fc9709a3 339 return status;
AnnaBridge 189:f392fc9709a3 340 }
AnnaBridge 189:f392fc9709a3 341
AnnaBridge 189:f392fc9709a3 342 /**
AnnaBridge 189:f392fc9709a3 343 * \brief Unlock driver instance
AnnaBridge 189:f392fc9709a3 344 *
AnnaBridge 189:f392fc9709a3 345 * This function clears the instance lock, indicating that it is available for
AnnaBridge 189:f392fc9709a3 346 * use.
AnnaBridge 189:f392fc9709a3 347 *
AnnaBridge 189:f392fc9709a3 348 * \param[in,out] module Pointer to the driver instance to lock
AnnaBridge 189:f392fc9709a3 349 *
AnnaBridge 189:f392fc9709a3 350 * \retval STATUS_OK If the module was locked
AnnaBridge 189:f392fc9709a3 351 * \retval STATUS_BUSY If the module was already locked
AnnaBridge 189:f392fc9709a3 352 */
AnnaBridge 189:f392fc9709a3 353 static inline void i2c_master_unlock(struct i2c_master_module *const module)
AnnaBridge 189:f392fc9709a3 354 {
AnnaBridge 189:f392fc9709a3 355 module->locked = false;
AnnaBridge 189:f392fc9709a3 356 }
AnnaBridge 189:f392fc9709a3 357
AnnaBridge 189:f392fc9709a3 358 /** @} */
AnnaBridge 189:f392fc9709a3 359
AnnaBridge 189:f392fc9709a3 360 /**
AnnaBridge 189:f392fc9709a3 361 * \name Configuration and Initialization
AnnaBridge 189:f392fc9709a3 362 * @{
AnnaBridge 189:f392fc9709a3 363 */
AnnaBridge 189:f392fc9709a3 364
AnnaBridge 189:f392fc9709a3 365 /**
AnnaBridge 189:f392fc9709a3 366 * \brief Returns the synchronization status of the module
AnnaBridge 189:f392fc9709a3 367 *
AnnaBridge 189:f392fc9709a3 368 * Returns the synchronization status of the module.
AnnaBridge 189:f392fc9709a3 369 *
AnnaBridge 189:f392fc9709a3 370 * \param[in] module Pointer to software module structure
AnnaBridge 189:f392fc9709a3 371 *
AnnaBridge 189:f392fc9709a3 372 * \return Status of the synchronization.
AnnaBridge 189:f392fc9709a3 373 * \retval true Module is busy synchronizing
AnnaBridge 189:f392fc9709a3 374 * \retval false Module is not synchronizing
AnnaBridge 189:f392fc9709a3 375 */
AnnaBridge 189:f392fc9709a3 376 static inline bool i2c_master_is_syncing (
AnnaBridge 189:f392fc9709a3 377 const struct i2c_master_module *const module)
AnnaBridge 189:f392fc9709a3 378 {
AnnaBridge 189:f392fc9709a3 379 /* Sanity check. */
AnnaBridge 189:f392fc9709a3 380 Assert(module);
AnnaBridge 189:f392fc9709a3 381 Assert(module->hw);
AnnaBridge 189:f392fc9709a3 382
AnnaBridge 189:f392fc9709a3 383 SercomI2cm *const i2c_hw = &(module->hw->I2CM);
AnnaBridge 189:f392fc9709a3 384
AnnaBridge 189:f392fc9709a3 385 #if defined(FEATURE_SERCOM_SYNCBUSY_SCHEME_VERSION_1)
AnnaBridge 189:f392fc9709a3 386 return (i2c_hw->STATUS.reg & SERCOM_I2CM_STATUS_SYNCBUSY);
AnnaBridge 189:f392fc9709a3 387 #elif defined(FEATURE_SERCOM_SYNCBUSY_SCHEME_VERSION_2)
AnnaBridge 189:f392fc9709a3 388 return (i2c_hw->SYNCBUSY.reg & SERCOM_I2CM_SYNCBUSY_MASK);
AnnaBridge 189:f392fc9709a3 389 #else
AnnaBridge 189:f392fc9709a3 390 # error Unknown SERCOM SYNCBUSY scheme!
AnnaBridge 189:f392fc9709a3 391 #endif
AnnaBridge 189:f392fc9709a3 392 }
AnnaBridge 189:f392fc9709a3 393
AnnaBridge 189:f392fc9709a3 394 #if !defined(__DOXYGEN__)
AnnaBridge 189:f392fc9709a3 395 /**
AnnaBridge 189:f392fc9709a3 396 * \internal
AnnaBridge 189:f392fc9709a3 397 * Wait for hardware module to sync
AnnaBridge 189:f392fc9709a3 398 *
AnnaBridge 189:f392fc9709a3 399 * \param[in] module Pointer to software module structure
AnnaBridge 189:f392fc9709a3 400 */
AnnaBridge 189:f392fc9709a3 401 static void _i2c_master_wait_for_sync(
AnnaBridge 189:f392fc9709a3 402 const struct i2c_master_module *const module)
AnnaBridge 189:f392fc9709a3 403 {
AnnaBridge 189:f392fc9709a3 404 /* Sanity check. */
AnnaBridge 189:f392fc9709a3 405 Assert(module);
AnnaBridge 189:f392fc9709a3 406
AnnaBridge 189:f392fc9709a3 407 while (i2c_master_is_syncing(module)) {
AnnaBridge 189:f392fc9709a3 408 /* Wait for I2C module to sync. */
AnnaBridge 189:f392fc9709a3 409 }
AnnaBridge 189:f392fc9709a3 410 }
AnnaBridge 189:f392fc9709a3 411 #endif
AnnaBridge 189:f392fc9709a3 412
AnnaBridge 189:f392fc9709a3 413 /**
AnnaBridge 189:f392fc9709a3 414 * \brief Gets the I<SUP>2</SUP>C master default configurations
AnnaBridge 189:f392fc9709a3 415 *
AnnaBridge 189:f392fc9709a3 416 * Use to initialize the configuration structure to known default values.
AnnaBridge 189:f392fc9709a3 417 *
AnnaBridge 189:f392fc9709a3 418 * The default configuration is as follows:
AnnaBridge 189:f392fc9709a3 419 * - Baudrate 100KHz
AnnaBridge 189:f392fc9709a3 420 * - GCLK generator 0
AnnaBridge 189:f392fc9709a3 421 * - Do not run in standby
AnnaBridge 189:f392fc9709a3 422 * - Start bit hold time 300ns - 600ns
AnnaBridge 189:f392fc9709a3 423 * - Buffer timeout = 65535
AnnaBridge 189:f392fc9709a3 424 * - Unknown bus status timeout = 65535
AnnaBridge 189:f392fc9709a3 425 * - Do not run in standby
AnnaBridge 189:f392fc9709a3 426 * - PINMUX_DEFAULT for SERCOM pads
AnnaBridge 189:f392fc9709a3 427 *
AnnaBridge 189:f392fc9709a3 428 * Those default configuration only available if the device supports it:
AnnaBridge 189:f392fc9709a3 429 * - High speed baudrate 3.4MHz
AnnaBridge 189:f392fc9709a3 430 * - Standard-mode and Fast-mode transfer speed
AnnaBridge 189:f392fc9709a3 431 * - SCL stretch disabled
AnnaBridge 189:f392fc9709a3 432 * - slave SCL low extend time-out disabled
AnnaBridge 189:f392fc9709a3 433 * - maser SCL low extend time-out disabled
AnnaBridge 189:f392fc9709a3 434 *
AnnaBridge 189:f392fc9709a3 435 * \param[out] config Pointer to configuration structure to be initiated
AnnaBridge 189:f392fc9709a3 436 */
AnnaBridge 189:f392fc9709a3 437 static inline void i2c_master_get_config_defaults(
AnnaBridge 189:f392fc9709a3 438 struct i2c_master_config *const config)
AnnaBridge 189:f392fc9709a3 439 {
AnnaBridge 189:f392fc9709a3 440 /*Sanity check argument. */
AnnaBridge 189:f392fc9709a3 441 Assert(config);
AnnaBridge 189:f392fc9709a3 442 config->baud_rate = I2C_MASTER_BAUD_RATE_100KHZ;
AnnaBridge 189:f392fc9709a3 443 #ifdef FEATURE_I2C_FAST_MODE_PLUS_AND_HIGH_SPEED
AnnaBridge 189:f392fc9709a3 444 config->baud_rate_high_speed = I2C_MASTER_BAUD_RATE_3400KHZ;
AnnaBridge 189:f392fc9709a3 445 config->transfer_speed = I2C_MASTER_SPEED_STANDARD_AND_FAST;
AnnaBridge 189:f392fc9709a3 446 #endif
AnnaBridge 189:f392fc9709a3 447 config->generator_source = GCLK_GENERATOR_0;
AnnaBridge 189:f392fc9709a3 448 config->run_in_standby = false;
AnnaBridge 189:f392fc9709a3 449 config->start_hold_time = I2C_MASTER_START_HOLD_TIME_300NS_600NS;
AnnaBridge 189:f392fc9709a3 450 config->buffer_timeout = 65535;
AnnaBridge 189:f392fc9709a3 451 config->unknown_bus_state_timeout = 65535;
AnnaBridge 189:f392fc9709a3 452 config->pinmux_pad0 = PINMUX_DEFAULT;
AnnaBridge 189:f392fc9709a3 453 config->pinmux_pad1 = PINMUX_DEFAULT;
AnnaBridge 189:f392fc9709a3 454 config->scl_low_timeout = false;
AnnaBridge 189:f392fc9709a3 455 config->inactive_timeout = I2C_MASTER_INACTIVE_TIMEOUT_DISABLED;
AnnaBridge 189:f392fc9709a3 456 #ifdef FEATURE_I2C_SCL_STRETCH_MODE
AnnaBridge 189:f392fc9709a3 457 config->scl_stretch_only_after_ack_bit = false;
AnnaBridge 189:f392fc9709a3 458 #endif
AnnaBridge 189:f392fc9709a3 459 #ifdef FEATURE_I2C_SCL_EXTEND_TIMEOUT
AnnaBridge 189:f392fc9709a3 460 config->slave_scl_low_extend_timeout = false;
AnnaBridge 189:f392fc9709a3 461 config->master_scl_low_extend_timeout = false;
AnnaBridge 189:f392fc9709a3 462 #endif
AnnaBridge 189:f392fc9709a3 463 /* The typical value is 215ns */
AnnaBridge 189:f392fc9709a3 464 config->sda_scl_rise_time_ns = 215;
AnnaBridge 189:f392fc9709a3 465 }
AnnaBridge 189:f392fc9709a3 466
AnnaBridge 189:f392fc9709a3 467 enum status_code i2c_master_init(
AnnaBridge 189:f392fc9709a3 468 struct i2c_master_module *const module,
AnnaBridge 189:f392fc9709a3 469 Sercom *const hw,
AnnaBridge 189:f392fc9709a3 470 const struct i2c_master_config *const config);
AnnaBridge 189:f392fc9709a3 471
AnnaBridge 189:f392fc9709a3 472 /**
AnnaBridge 189:f392fc9709a3 473 * \brief Enables the I<SUP>2</SUP>C module
AnnaBridge 189:f392fc9709a3 474 *
AnnaBridge 189:f392fc9709a3 475 * Enables the requested I<SUP>2</SUP>C module and set the bus state to IDLE
AnnaBridge 189:f392fc9709a3 476 * after the specified \ref asfdoc_sam0_sercom_i2c_timeout "timeout" period if no
AnnaBridge 189:f392fc9709a3 477 * stop bit is detected.
AnnaBridge 189:f392fc9709a3 478 *
AnnaBridge 189:f392fc9709a3 479 * \param[in] module Pointer to the software module struct
AnnaBridge 189:f392fc9709a3 480 */
AnnaBridge 189:f392fc9709a3 481 static inline void i2c_master_enable(
AnnaBridge 189:f392fc9709a3 482 const struct i2c_master_module *const module)
AnnaBridge 189:f392fc9709a3 483 {
AnnaBridge 189:f392fc9709a3 484 /* Sanity check of arguments. */
AnnaBridge 189:f392fc9709a3 485 Assert(module);
AnnaBridge 189:f392fc9709a3 486 Assert(module->hw);
AnnaBridge 189:f392fc9709a3 487
AnnaBridge 189:f392fc9709a3 488 SercomI2cm *const i2c_module = &(module->hw->I2CM);
AnnaBridge 189:f392fc9709a3 489
AnnaBridge 189:f392fc9709a3 490 /* Timeout counter used to force bus state. */
AnnaBridge 189:f392fc9709a3 491 uint32_t timeout_counter = 0;
AnnaBridge 189:f392fc9709a3 492
AnnaBridge 189:f392fc9709a3 493 /* Wait for module to sync. */
AnnaBridge 189:f392fc9709a3 494 _i2c_master_wait_for_sync(module);
AnnaBridge 189:f392fc9709a3 495
AnnaBridge 189:f392fc9709a3 496 /* Enable module. */
AnnaBridge 189:f392fc9709a3 497 i2c_module->CTRLA.reg |= SERCOM_I2CM_CTRLA_ENABLE;
AnnaBridge 189:f392fc9709a3 498
AnnaBridge 189:f392fc9709a3 499 #if I2C_MASTER_CALLBACK_MODE == true
AnnaBridge 189:f392fc9709a3 500 /* Enable module interrupts */
AnnaBridge 189:f392fc9709a3 501 system_interrupt_enable(_sercom_get_interrupt_vector(module->hw));
AnnaBridge 189:f392fc9709a3 502 #endif
AnnaBridge 189:f392fc9709a3 503 /* Start timeout if bus state is unknown. */
AnnaBridge 189:f392fc9709a3 504 while (!(i2c_module->STATUS.reg & SERCOM_I2CM_STATUS_BUSSTATE(1))) {
AnnaBridge 189:f392fc9709a3 505 timeout_counter++;
AnnaBridge 189:f392fc9709a3 506 if(timeout_counter >= (module->unknown_bus_state_timeout)) {
AnnaBridge 189:f392fc9709a3 507 /* Timeout, force bus state to idle. */
AnnaBridge 189:f392fc9709a3 508 i2c_module->STATUS.reg = SERCOM_I2CM_STATUS_BUSSTATE(1);
AnnaBridge 189:f392fc9709a3 509 /* Workaround #1 */
AnnaBridge 189:f392fc9709a3 510 return;
AnnaBridge 189:f392fc9709a3 511 }
AnnaBridge 189:f392fc9709a3 512 }
AnnaBridge 189:f392fc9709a3 513 }
AnnaBridge 189:f392fc9709a3 514
AnnaBridge 189:f392fc9709a3 515 /**
AnnaBridge 189:f392fc9709a3 516 * \brief Disable the I<SUP>2</SUP>C module
AnnaBridge 189:f392fc9709a3 517 *
AnnaBridge 189:f392fc9709a3 518 * Disables the requested I<SUP>2</SUP>C module.
AnnaBridge 189:f392fc9709a3 519 *
AnnaBridge 189:f392fc9709a3 520 * \param[in] module Pointer to the software module struct
AnnaBridge 189:f392fc9709a3 521 */
AnnaBridge 189:f392fc9709a3 522 static inline void i2c_master_disable(
AnnaBridge 189:f392fc9709a3 523 const struct i2c_master_module *const module)
AnnaBridge 189:f392fc9709a3 524 {
AnnaBridge 189:f392fc9709a3 525 /* Sanity check of arguments. */
AnnaBridge 189:f392fc9709a3 526 Assert(module);
AnnaBridge 189:f392fc9709a3 527 Assert(module->hw);
AnnaBridge 189:f392fc9709a3 528
AnnaBridge 189:f392fc9709a3 529 SercomI2cm *const i2c_module = &(module->hw->I2CM);
AnnaBridge 189:f392fc9709a3 530
AnnaBridge 189:f392fc9709a3 531 /* Wait for module to sync. */
AnnaBridge 189:f392fc9709a3 532 _i2c_master_wait_for_sync(module);
AnnaBridge 189:f392fc9709a3 533
AnnaBridge 189:f392fc9709a3 534 /* Disable module. */
AnnaBridge 189:f392fc9709a3 535 i2c_module->CTRLA.reg &= ~SERCOM_I2CM_CTRLA_ENABLE;
AnnaBridge 189:f392fc9709a3 536
AnnaBridge 189:f392fc9709a3 537 #if I2C_MASTER_CALLBACK_MODE == true
AnnaBridge 189:f392fc9709a3 538 /* Disable module interrupts */
AnnaBridge 189:f392fc9709a3 539 system_interrupt_disable(_sercom_get_interrupt_vector(module->hw));
AnnaBridge 189:f392fc9709a3 540 #endif
AnnaBridge 189:f392fc9709a3 541 }
AnnaBridge 189:f392fc9709a3 542
AnnaBridge 189:f392fc9709a3 543 void i2c_master_reset(struct i2c_master_module *const module);
AnnaBridge 189:f392fc9709a3 544
AnnaBridge 189:f392fc9709a3 545 /** @} */
AnnaBridge 189:f392fc9709a3 546
AnnaBridge 189:f392fc9709a3 547 /**
AnnaBridge 189:f392fc9709a3 548 * \name Read and Write
AnnaBridge 189:f392fc9709a3 549 * @{
AnnaBridge 189:f392fc9709a3 550 */
AnnaBridge 189:f392fc9709a3 551
AnnaBridge 189:f392fc9709a3 552 enum status_code i2c_master_read_packet_wait(
AnnaBridge 189:f392fc9709a3 553 struct i2c_master_module *const module,
AnnaBridge 189:f392fc9709a3 554 struct i2c_master_packet *const packet);
AnnaBridge 189:f392fc9709a3 555
AnnaBridge 189:f392fc9709a3 556 enum status_code i2c_master_read_packet_wait_no_stop(
AnnaBridge 189:f392fc9709a3 557 struct i2c_master_module *const module,
AnnaBridge 189:f392fc9709a3 558 struct i2c_master_packet *const packet);
AnnaBridge 189:f392fc9709a3 559
AnnaBridge 189:f392fc9709a3 560 enum status_code i2c_master_write_packet_wait(
AnnaBridge 189:f392fc9709a3 561 struct i2c_master_module *const module,
AnnaBridge 189:f392fc9709a3 562 struct i2c_master_packet *const packet);
AnnaBridge 189:f392fc9709a3 563
AnnaBridge 189:f392fc9709a3 564 enum status_code i2c_master_write_packet_wait_no_stop(
AnnaBridge 189:f392fc9709a3 565 struct i2c_master_module *const module,
AnnaBridge 189:f392fc9709a3 566 struct i2c_master_packet *const packet);
AnnaBridge 189:f392fc9709a3 567
AnnaBridge 189:f392fc9709a3 568 void i2c_master_send_stop(struct i2c_master_module *const module);
AnnaBridge 189:f392fc9709a3 569
AnnaBridge 189:f392fc9709a3 570 void i2c_master_send_nack(struct i2c_master_module *const module);
AnnaBridge 189:f392fc9709a3 571
AnnaBridge 189:f392fc9709a3 572 enum status_code i2c_master_read_byte(
AnnaBridge 189:f392fc9709a3 573 struct i2c_master_module *const module,
AnnaBridge 189:f392fc9709a3 574 uint8_t *byte);
AnnaBridge 189:f392fc9709a3 575
AnnaBridge 189:f392fc9709a3 576 enum status_code i2c_master_write_byte(
AnnaBridge 189:f392fc9709a3 577 struct i2c_master_module *const module,
AnnaBridge 189:f392fc9709a3 578 uint8_t byte);
AnnaBridge 189:f392fc9709a3 579
AnnaBridge 189:f392fc9709a3 580 enum status_code i2c_master_read_packet_wait_no_nack(
AnnaBridge 189:f392fc9709a3 581 struct i2c_master_module *const module,
AnnaBridge 189:f392fc9709a3 582 struct i2c_master_packet *const packet);
AnnaBridge 189:f392fc9709a3 583
AnnaBridge 189:f392fc9709a3 584 /** @} */
AnnaBridge 189:f392fc9709a3 585
AnnaBridge 189:f392fc9709a3 586 #ifdef FEATURE_I2C_DMA_SUPPORT
AnnaBridge 189:f392fc9709a3 587 /**
AnnaBridge 189:f392fc9709a3 588 * \name SERCOM I2C Master with DMA Interfaces
AnnaBridge 189:f392fc9709a3 589 * @{
AnnaBridge 189:f392fc9709a3 590 */
AnnaBridge 189:f392fc9709a3 591
AnnaBridge 189:f392fc9709a3 592 /**
AnnaBridge 189:f392fc9709a3 593 * \brief Set I<SUP>2</SUP>C for DMA transfer with slave address and transfer size.
AnnaBridge 189:f392fc9709a3 594 *
AnnaBridge 189:f392fc9709a3 595 * This function will set the slave address, transfer size and enable the auto transfer
AnnaBridge 189:f392fc9709a3 596 * mode for DMA.
AnnaBridge 189:f392fc9709a3 597 *
AnnaBridge 189:f392fc9709a3 598 * \param[in,out] module Pointer to the driver instance to lock
AnnaBridge 189:f392fc9709a3 599 * \param[in] addr I<SUP>2</SUP>C slave address
AnnaBridge 189:f392fc9709a3 600 * \param[in] length I<SUP>2</SUP>C transfer length with DMA
AnnaBridge 189:f392fc9709a3 601 * \param[in] direction I<SUP>2</SUP>C transfer direction
AnnaBridge 189:f392fc9709a3 602 *
AnnaBridge 189:f392fc9709a3 603 */
AnnaBridge 189:f392fc9709a3 604 static inline void i2c_master_dma_set_transfer(struct i2c_master_module *const module,
AnnaBridge 189:f392fc9709a3 605 uint16_t addr, uint8_t length, enum i2c_transfer_direction direction)
AnnaBridge 189:f392fc9709a3 606 {
AnnaBridge 189:f392fc9709a3 607 module->hw->I2CM.ADDR.reg =
AnnaBridge 189:f392fc9709a3 608 SERCOM_I2CM_ADDR_ADDR(addr<<1) |
AnnaBridge 189:f392fc9709a3 609 SERCOM_I2CM_ADDR_LENEN |
AnnaBridge 189:f392fc9709a3 610 SERCOM_I2CM_ADDR_LEN(length) |
AnnaBridge 189:f392fc9709a3 611 direction;
AnnaBridge 189:f392fc9709a3 612 }
AnnaBridge 189:f392fc9709a3 613
AnnaBridge 189:f392fc9709a3 614 /** @} */
AnnaBridge 189:f392fc9709a3 615 #endif
AnnaBridge 189:f392fc9709a3 616
AnnaBridge 189:f392fc9709a3 617 /** @} */
AnnaBridge 189:f392fc9709a3 618
AnnaBridge 189:f392fc9709a3 619 #ifdef __cplusplus
AnnaBridge 189:f392fc9709a3 620 }
AnnaBridge 189:f392fc9709a3 621 #endif
AnnaBridge 189:f392fc9709a3 622
AnnaBridge 189:f392fc9709a3 623 #endif /* I2C_MASTER_H_INCLUDED */