mbed library sources. Supersedes mbed-src.

Fork of mbed-dev by mbed official

Committer:
mbed_official
Date:
Wed Nov 04 16:30:11 2015 +0000
Revision:
15:a81a8d6c1dfe
Synchronized with git revision 46af745ef4405614c3fa49abbd9a706a362ea514

Full URL: https://github.com/mbedmicro/mbed/commit/46af745ef4405614c3fa49abbd9a706a362ea514/

Renamed TARGET_SAM_CortexM0+ to TARGET_SAM_CortexM0P for compatiblity with online compiler

Who changed what in which revision?

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