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 Slave Driver
mbed_official 15:a81a8d6c1dfe 5 *
mbed_official 15:a81a8d6c1dfe 6 * Copyright (c) 2013-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_SLAVE_H_INCLUDED
mbed_official 15:a81a8d6c1dfe 48 #define I2C_SLAVE_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_SLAVE_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 #ifndef PINMUX_DEFAULT
mbed_official 15:a81a8d6c1dfe 59 # define PINMUX_DEFAULT 0
mbed_official 15:a81a8d6c1dfe 60 #endif
mbed_official 15:a81a8d6c1dfe 61
mbed_official 15:a81a8d6c1dfe 62 #ifdef __cplusplus
mbed_official 15:a81a8d6c1dfe 63 extern "C" {
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 /**
mbed_official 15:a81a8d6c1dfe 74 * \name I2C Slave Status Flags
mbed_official 15:a81a8d6c1dfe 75 *
mbed_official 15:a81a8d6c1dfe 76 * I<SUP>2</SUP>C slave status flags, returned by \ref i2c_slave_get_status() and cleared
mbed_official 15:a81a8d6c1dfe 77 * by \ref i2c_slave_clear_status().
mbed_official 15:a81a8d6c1dfe 78 * @{
mbed_official 15:a81a8d6c1dfe 79 */
mbed_official 15:a81a8d6c1dfe 80
mbed_official 15:a81a8d6c1dfe 81 /** Address Match.
mbed_official 15:a81a8d6c1dfe 82 * \note Should only be cleared internally by driver.
mbed_official 15:a81a8d6c1dfe 83 */
mbed_official 15:a81a8d6c1dfe 84 #define I2C_SLAVE_STATUS_ADDRESS_MATCH (1UL << 0)
mbed_official 15:a81a8d6c1dfe 85 /** Data Ready. */
mbed_official 15:a81a8d6c1dfe 86 #define I2C_SLAVE_STATUS_DATA_READY (1UL << 1)
mbed_official 15:a81a8d6c1dfe 87 /** Stop Received. */
mbed_official 15:a81a8d6c1dfe 88 #define I2C_SLAVE_STATUS_STOP_RECEIVED (1UL << 2)
mbed_official 15:a81a8d6c1dfe 89 /** Clock Hold.
mbed_official 15:a81a8d6c1dfe 90 * \note Cannot be cleared, only valid when I2C_SLAVE_STATUS_ADDRESS_MATCH is
mbed_official 15:a81a8d6c1dfe 91 * set.
mbed_official 15:a81a8d6c1dfe 92 */
mbed_official 15:a81a8d6c1dfe 93 #define I2C_SLAVE_STATUS_CLOCK_HOLD (1UL << 3)
mbed_official 15:a81a8d6c1dfe 94 /** SCL Low Timeout. */
mbed_official 15:a81a8d6c1dfe 95 #define I2C_SLAVE_STATUS_SCL_LOW_TIMEOUT (1UL << 4)
mbed_official 15:a81a8d6c1dfe 96 /** Repeated Start.
mbed_official 15:a81a8d6c1dfe 97 * \note Cannot be cleared, only valid when I2C_SLAVE_STATUS_ADDRESS_MATCH is
mbed_official 15:a81a8d6c1dfe 98 * set.
mbed_official 15:a81a8d6c1dfe 99 */
mbed_official 15:a81a8d6c1dfe 100 #define I2C_SLAVE_STATUS_REPEATED_START (1UL << 5)
mbed_official 15:a81a8d6c1dfe 101 /** Received not acknowledge.
mbed_official 15:a81a8d6c1dfe 102 * \note Cannot be cleared.
mbed_official 15:a81a8d6c1dfe 103 */
mbed_official 15:a81a8d6c1dfe 104 #define I2C_SLAVE_STATUS_RECEIVED_NACK (1UL << 6)
mbed_official 15:a81a8d6c1dfe 105 /** Transmit Collision. */
mbed_official 15:a81a8d6c1dfe 106 #define I2C_SLAVE_STATUS_COLLISION (1UL << 7)
mbed_official 15:a81a8d6c1dfe 107 /** Bus error. */
mbed_official 15:a81a8d6c1dfe 108 #define I2C_SLAVE_STATUS_BUS_ERROR (1UL << 8)
mbed_official 15:a81a8d6c1dfe 109
mbed_official 15:a81a8d6c1dfe 110 /** @} */
mbed_official 15:a81a8d6c1dfe 111
mbed_official 15:a81a8d6c1dfe 112 /**
mbed_official 15:a81a8d6c1dfe 113 * \brief I<SUP>2</SUP>C slave packet for read/write
mbed_official 15:a81a8d6c1dfe 114 *
mbed_official 15:a81a8d6c1dfe 115 * Structure to be used when transferring I<SUP>2</SUP>C slave packets.
mbed_official 15:a81a8d6c1dfe 116 */
mbed_official 15:a81a8d6c1dfe 117 struct i2c_slave_packet {
mbed_official 15:a81a8d6c1dfe 118 /** Length of data array. */
mbed_official 15:a81a8d6c1dfe 119 uint16_t data_length;
mbed_official 15:a81a8d6c1dfe 120 /** Data array containing all data to be transferred. */
mbed_official 15:a81a8d6c1dfe 121 uint8_t *data;
mbed_official 15:a81a8d6c1dfe 122 };
mbed_official 15:a81a8d6c1dfe 123
mbed_official 15:a81a8d6c1dfe 124 #if I2C_SLAVE_CALLBACK_MODE == true
mbed_official 15:a81a8d6c1dfe 125 /**
mbed_official 15:a81a8d6c1dfe 126 * \brief Callback types
mbed_official 15:a81a8d6c1dfe 127 *
mbed_official 15:a81a8d6c1dfe 128 * The available callback types for the I<SUP>2</SUP>C slave.
mbed_official 15:a81a8d6c1dfe 129 */
mbed_official 15:a81a8d6c1dfe 130 enum i2c_slave_callback {
mbed_official 15:a81a8d6c1dfe 131 /** Callback for packet write complete. */
mbed_official 15:a81a8d6c1dfe 132 I2C_SLAVE_CALLBACK_WRITE_COMPLETE,
mbed_official 15:a81a8d6c1dfe 133 /** Callback for packet read complete. */
mbed_official 15:a81a8d6c1dfe 134 I2C_SLAVE_CALLBACK_READ_COMPLETE,
mbed_official 15:a81a8d6c1dfe 135 /**
mbed_official 15:a81a8d6c1dfe 136 * Callback for read request from master - can be used to
mbed_official 15:a81a8d6c1dfe 137 * issue a write.
mbed_official 15:a81a8d6c1dfe 138 */
mbed_official 15:a81a8d6c1dfe 139 I2C_SLAVE_CALLBACK_READ_REQUEST,
mbed_official 15:a81a8d6c1dfe 140 /**
mbed_official 15:a81a8d6c1dfe 141 * Callback for write request from master - can be used to issue a read.
mbed_official 15:a81a8d6c1dfe 142 */
mbed_official 15:a81a8d6c1dfe 143 I2C_SLAVE_CALLBACK_WRITE_REQUEST,
mbed_official 15:a81a8d6c1dfe 144 /** Callback for error. */
mbed_official 15:a81a8d6c1dfe 145 I2C_SLAVE_CALLBACK_ERROR,
mbed_official 15:a81a8d6c1dfe 146 /**
mbed_official 15:a81a8d6c1dfe 147 * Callback for error in last transfer. Discovered on a new address
mbed_official 15:a81a8d6c1dfe 148 * interrupt.
mbed_official 15:a81a8d6c1dfe 149 */
mbed_official 15:a81a8d6c1dfe 150 I2C_SLAVE_CALLBACK_ERROR_LAST_TRANSFER,
mbed_official 15:a81a8d6c1dfe 151 # if !defined(__DOXYGEN__)
mbed_official 15:a81a8d6c1dfe 152 /** Total number of callbacks. */
mbed_official 15:a81a8d6c1dfe 153 _I2C_SLAVE_CALLBACK_N,
mbed_official 15:a81a8d6c1dfe 154 # endif
mbed_official 15:a81a8d6c1dfe 155 };
mbed_official 15:a81a8d6c1dfe 156
mbed_official 15:a81a8d6c1dfe 157 # if !defined(__DOXYGEN__)
mbed_official 15:a81a8d6c1dfe 158 /** Software module prototype. */
mbed_official 15:a81a8d6c1dfe 159 struct i2c_slave_module;
mbed_official 15:a81a8d6c1dfe 160
mbed_official 15:a81a8d6c1dfe 161 /** Callback type. */
mbed_official 15:a81a8d6c1dfe 162 typedef void (*i2c_slave_callback_t)(
mbed_official 15:a81a8d6c1dfe 163 struct i2c_slave_module *const module);
mbed_official 15:a81a8d6c1dfe 164 # endif
mbed_official 15:a81a8d6c1dfe 165 #endif
mbed_official 15:a81a8d6c1dfe 166
mbed_official 15:a81a8d6c1dfe 167 /**
mbed_official 15:a81a8d6c1dfe 168 * \brief Enum for the possible SDA hold times with respect to the negative
mbed_official 15:a81a8d6c1dfe 169 * edge of SCL
mbed_official 15:a81a8d6c1dfe 170 *
mbed_official 15:a81a8d6c1dfe 171 * Enum for the possible SDA hold times with respect to the negative edge
mbed_official 15:a81a8d6c1dfe 172 * of SCL.
mbed_official 15:a81a8d6c1dfe 173 */
mbed_official 15:a81a8d6c1dfe 174 enum i2c_slave_sda_hold_time {
mbed_official 15:a81a8d6c1dfe 175 /** SDA hold time disabled. */
mbed_official 15:a81a8d6c1dfe 176 I2C_SLAVE_SDA_HOLD_TIME_DISABLED =
mbed_official 15:a81a8d6c1dfe 177 ((SERCOM_I2CS_CTRLA_SDAHOLD_Msk & ((0) << SERCOM_I2CS_CTRLA_SDAHOLD_Pos))),
mbed_official 15:a81a8d6c1dfe 178 /** SDA hold time 50ns - 100ns. */
mbed_official 15:a81a8d6c1dfe 179 I2C_SLAVE_SDA_HOLD_TIME_50NS_100NS =
mbed_official 15:a81a8d6c1dfe 180 ((SERCOM_I2CS_CTRLA_SDAHOLD_Msk & ((1) << SERCOM_I2CS_CTRLA_SDAHOLD_Pos))),
mbed_official 15:a81a8d6c1dfe 181 /** SDA hold time 300ns - 600ns. */
mbed_official 15:a81a8d6c1dfe 182 I2C_SLAVE_SDA_HOLD_TIME_300NS_600NS =
mbed_official 15:a81a8d6c1dfe 183 ((SERCOM_I2CS_CTRLA_SDAHOLD_Msk & ((2) << SERCOM_I2CS_CTRLA_SDAHOLD_Pos))),
mbed_official 15:a81a8d6c1dfe 184 /** SDA hold time 400ns - 800ns. */
mbed_official 15:a81a8d6c1dfe 185 I2C_SLAVE_SDA_HOLD_TIME_400NS_800NS =
mbed_official 15:a81a8d6c1dfe 186 ((SERCOM_I2CS_CTRLA_SDAHOLD_Msk & ((3) << SERCOM_I2CS_CTRLA_SDAHOLD_Pos))),
mbed_official 15:a81a8d6c1dfe 187 };
mbed_official 15:a81a8d6c1dfe 188
mbed_official 15:a81a8d6c1dfe 189 /**
mbed_official 15:a81a8d6c1dfe 190 * \brief Enum for the possible address modes
mbed_official 15:a81a8d6c1dfe 191 *
mbed_official 15:a81a8d6c1dfe 192 * Enum for the possible address modes.
mbed_official 15:a81a8d6c1dfe 193 */
mbed_official 15:a81a8d6c1dfe 194 enum i2c_slave_address_mode {
mbed_official 15:a81a8d6c1dfe 195 /** Address match on address_mask used as a mask to address. */
mbed_official 15:a81a8d6c1dfe 196 I2C_SLAVE_ADDRESS_MODE_MASK = SERCOM_I2CS_CTRLB_AMODE(0),
mbed_official 15:a81a8d6c1dfe 197 /** Address math on both address and address_mask. */
mbed_official 15:a81a8d6c1dfe 198 I2C_SLAVE_ADDRESS_MODE_TWO_ADDRESSES = SERCOM_I2CS_CTRLB_AMODE(1),
mbed_official 15:a81a8d6c1dfe 199 /**
mbed_official 15:a81a8d6c1dfe 200 * Address match on range of addresses between and including address and
mbed_official 15:a81a8d6c1dfe 201 * address_mask.
mbed_official 15:a81a8d6c1dfe 202 */
mbed_official 15:a81a8d6c1dfe 203 I2C_SLAVE_ADDRESS_MODE_RANGE = SERCOM_I2CS_CTRLB_AMODE(2),
mbed_official 15:a81a8d6c1dfe 204 };
mbed_official 15:a81a8d6c1dfe 205
mbed_official 15:a81a8d6c1dfe 206 /**
mbed_official 15:a81a8d6c1dfe 207 * \brief Enum for the direction of a request
mbed_official 15:a81a8d6c1dfe 208 *
mbed_official 15:a81a8d6c1dfe 209 * Enum for the direction of a request.
mbed_official 15:a81a8d6c1dfe 210 */
mbed_official 15:a81a8d6c1dfe 211 enum i2c_slave_direction {
mbed_official 15:a81a8d6c1dfe 212 /** Read. */
mbed_official 15:a81a8d6c1dfe 213 I2C_SLAVE_DIRECTION_READ,
mbed_official 15:a81a8d6c1dfe 214 /** Write. */
mbed_official 15:a81a8d6c1dfe 215 I2C_SLAVE_DIRECTION_WRITE,
mbed_official 15:a81a8d6c1dfe 216 /** No direction. */
mbed_official 15:a81a8d6c1dfe 217 I2C_SLAVE_DIRECTION_NONE,
mbed_official 15:a81a8d6c1dfe 218 };
mbed_official 15:a81a8d6c1dfe 219
mbed_official 15:a81a8d6c1dfe 220 #ifdef FEATURE_I2C_FAST_MODE_PLUS_AND_HIGH_SPEED
mbed_official 15:a81a8d6c1dfe 221 /**
mbed_official 15:a81a8d6c1dfe 222 * \brief Enum for the transfer speed
mbed_official 15:a81a8d6c1dfe 223 *
mbed_official 15:a81a8d6c1dfe 224 * Enum for the transfer speed.
mbed_official 15:a81a8d6c1dfe 225 */
mbed_official 15:a81a8d6c1dfe 226 enum i2c_slave_transfer_speed {
mbed_official 15:a81a8d6c1dfe 227 /** Standard-mode (Sm) up to 100KHz and Fast-mode (Fm) up to 400KHz. */
mbed_official 15:a81a8d6c1dfe 228 I2C_SLAVE_SPEED_STANDARD_AND_FAST = SERCOM_I2CS_CTRLA_SPEED(0),
mbed_official 15:a81a8d6c1dfe 229 /** Fast-mode Plus (Fm+) up to 1MHz. */
mbed_official 15:a81a8d6c1dfe 230 I2C_SLAVE_SPEED_FAST_MODE_PLUS = SERCOM_I2CS_CTRLA_SPEED(1),
mbed_official 15:a81a8d6c1dfe 231 /** High-speed mode (Hs-mode) up to 3.4MHz. */
mbed_official 15:a81a8d6c1dfe 232 I2C_SLAVE_SPEED_HIGH_SPEED = SERCOM_I2CS_CTRLA_SPEED(2),
mbed_official 15:a81a8d6c1dfe 233 };
mbed_official 15:a81a8d6c1dfe 234 #endif
mbed_official 15:a81a8d6c1dfe 235
mbed_official 15:a81a8d6c1dfe 236 /**
mbed_official 15:a81a8d6c1dfe 237 * \brief SERCOM I<SUP>2</SUP>C Slave driver software device instance structure.
mbed_official 15:a81a8d6c1dfe 238 *
mbed_official 15:a81a8d6c1dfe 239 * SERCOM I<SUP>2</SUP>C Slave driver software instance structure, used to
mbed_official 15:a81a8d6c1dfe 240 * retain software state information of an associated hardware module instance.
mbed_official 15:a81a8d6c1dfe 241 *
mbed_official 15:a81a8d6c1dfe 242 * \note The fields of this structure should not be altered by the user
mbed_official 15:a81a8d6c1dfe 243 * application; they are reserved for module-internal use only.
mbed_official 15:a81a8d6c1dfe 244 */
mbed_official 15:a81a8d6c1dfe 245 struct i2c_slave_module {
mbed_official 15:a81a8d6c1dfe 246 #if !defined(__DOXYGEN__)
mbed_official 15:a81a8d6c1dfe 247 /** Hardware instance initialized for the struct. */
mbed_official 15:a81a8d6c1dfe 248 Sercom *hw;
mbed_official 15:a81a8d6c1dfe 249 /** Module lock. */
mbed_official 15:a81a8d6c1dfe 250 volatile bool locked;
mbed_official 15:a81a8d6c1dfe 251 /** Timeout value for polled functions. */
mbed_official 15:a81a8d6c1dfe 252 uint16_t buffer_timeout;
mbed_official 15:a81a8d6c1dfe 253 # ifdef FEATURE_I2C_10_BIT_ADDRESS
mbed_official 15:a81a8d6c1dfe 254 /** Using 10-bit addressing for the slave. */
mbed_official 15:a81a8d6c1dfe 255 bool ten_bit_address;
mbed_official 15:a81a8d6c1dfe 256 # endif
mbed_official 15:a81a8d6c1dfe 257 # if I2C_SLAVE_CALLBACK_MODE == true
mbed_official 15:a81a8d6c1dfe 258 /** Nack on address match. */
mbed_official 15:a81a8d6c1dfe 259 bool nack_on_address;
mbed_official 15:a81a8d6c1dfe 260 /** Pointers to callback functions. */
mbed_official 15:a81a8d6c1dfe 261 volatile i2c_slave_callback_t callbacks[_I2C_SLAVE_CALLBACK_N];
mbed_official 15:a81a8d6c1dfe 262 /** Mask for registered callbacks. */
mbed_official 15:a81a8d6c1dfe 263 volatile uint8_t registered_callback;
mbed_official 15:a81a8d6c1dfe 264 /** Mask for enabled callbacks. */
mbed_official 15:a81a8d6c1dfe 265 volatile uint8_t enabled_callback;
mbed_official 15:a81a8d6c1dfe 266 /** The total number of bytes to transfer. */
mbed_official 15:a81a8d6c1dfe 267 volatile uint16_t buffer_length;
mbed_official 15:a81a8d6c1dfe 268 /**
mbed_official 15:a81a8d6c1dfe 269 * Counter used for bytes left to send in write and to count number of
mbed_official 15:a81a8d6c1dfe 270 * obtained bytes in read.
mbed_official 15:a81a8d6c1dfe 271 */
mbed_official 15:a81a8d6c1dfe 272 uint16_t buffer_remaining;
mbed_official 15:a81a8d6c1dfe 273 /** Data buffer for packet write and read. */
mbed_official 15:a81a8d6c1dfe 274 volatile uint8_t *buffer;
mbed_official 15:a81a8d6c1dfe 275 /** Save direction of request from master. 1 = read, 0 = write. */
mbed_official 15:a81a8d6c1dfe 276 volatile enum i2c_transfer_direction transfer_direction;
mbed_official 15:a81a8d6c1dfe 277 /** Status for status read back in error callback. */
mbed_official 15:a81a8d6c1dfe 278 volatile enum status_code status;
mbed_official 15:a81a8d6c1dfe 279 # endif
mbed_official 15:a81a8d6c1dfe 280 #endif
mbed_official 15:a81a8d6c1dfe 281 };
mbed_official 15:a81a8d6c1dfe 282
mbed_official 15:a81a8d6c1dfe 283 /**
mbed_official 15:a81a8d6c1dfe 284 * \brief Configuration structure for the I<SUP>2</SUP>C Slave device
mbed_official 15:a81a8d6c1dfe 285 *
mbed_official 15:a81a8d6c1dfe 286 * This is the configuration structure for the I<SUP>2</SUP>C Slave device. It is used
mbed_official 15:a81a8d6c1dfe 287 * as an argument for \ref i2c_slave_init to provide the desired
mbed_official 15:a81a8d6c1dfe 288 * configurations for the module. The structure should be initialized using the
mbed_official 15:a81a8d6c1dfe 289 * \ref i2c_slave_get_config_defaults.
mbed_official 15:a81a8d6c1dfe 290 */
mbed_official 15:a81a8d6c1dfe 291 struct i2c_slave_config {
mbed_official 15:a81a8d6c1dfe 292 /** Set to enable the SCL low timeout. */
mbed_official 15:a81a8d6c1dfe 293 bool enable_scl_low_timeout;
mbed_official 15:a81a8d6c1dfe 294 /** SDA hold time with respect to the negative edge of SCL. */
mbed_official 15:a81a8d6c1dfe 295 enum i2c_slave_sda_hold_time sda_hold_time;
mbed_official 15:a81a8d6c1dfe 296 /** Timeout to wait for master in polled functions. */
mbed_official 15:a81a8d6c1dfe 297 uint16_t buffer_timeout;
mbed_official 15:a81a8d6c1dfe 298 /** Addressing mode. */
mbed_official 15:a81a8d6c1dfe 299 enum i2c_slave_address_mode address_mode;
mbed_official 15:a81a8d6c1dfe 300 /** Address or upper limit of address range. */
mbed_official 15:a81a8d6c1dfe 301 uint16_t address;
mbed_official 15:a81a8d6c1dfe 302 /** Address mask, second address or lower limit of address range. */
mbed_official 15:a81a8d6c1dfe 303 uint16_t address_mask;
mbed_official 15:a81a8d6c1dfe 304 #ifdef FEATURE_I2C_10_BIT_ADDRESS
mbed_official 15:a81a8d6c1dfe 305 /** Enable 10-bit addressing. */
mbed_official 15:a81a8d6c1dfe 306 bool ten_bit_address;
mbed_official 15:a81a8d6c1dfe 307 #endif
mbed_official 15:a81a8d6c1dfe 308 /**
mbed_official 15:a81a8d6c1dfe 309 * Enable general call address recognition (general call address
mbed_official 15:a81a8d6c1dfe 310 * is defined as 0000000 with direction bit 0).
mbed_official 15:a81a8d6c1dfe 311 */
mbed_official 15:a81a8d6c1dfe 312 bool enable_general_call_address;
mbed_official 15:a81a8d6c1dfe 313
mbed_official 15:a81a8d6c1dfe 314 #ifdef FEATURE_I2C_FAST_MODE_PLUS_AND_HIGH_SPEED
mbed_official 15:a81a8d6c1dfe 315 /** Transfer speed mode. */
mbed_official 15:a81a8d6c1dfe 316 enum i2c_slave_transfer_speed transfer_speed;
mbed_official 15:a81a8d6c1dfe 317 #endif
mbed_official 15:a81a8d6c1dfe 318
mbed_official 15:a81a8d6c1dfe 319 #if I2C_SLAVE_CALLBACK_MODE == true
mbed_official 15:a81a8d6c1dfe 320 /**
mbed_official 15:a81a8d6c1dfe 321 * Enable NACK on address match (this can be changed after initialization
mbed_official 15:a81a8d6c1dfe 322 * via the \ref i2c_slave_enable_nack_on_address and
mbed_official 15:a81a8d6c1dfe 323 * \ref i2c_slave_disable_nack_on_address functions).
mbed_official 15:a81a8d6c1dfe 324 */
mbed_official 15:a81a8d6c1dfe 325 bool enable_nack_on_address;
mbed_official 15:a81a8d6c1dfe 326 #endif
mbed_official 15:a81a8d6c1dfe 327 /** GCLK generator to use as clock source. */
mbed_official 15:a81a8d6c1dfe 328 enum gclk_generator generator_source;
mbed_official 15:a81a8d6c1dfe 329 /** Set to keep module active in sleep modes. */
mbed_official 15:a81a8d6c1dfe 330 bool run_in_standby;
mbed_official 15:a81a8d6c1dfe 331 /** PAD0 (SDA) pinmux. */
mbed_official 15:a81a8d6c1dfe 332 uint32_t pinmux_pad0;
mbed_official 15:a81a8d6c1dfe 333 /** PAD1 (SCL) pinmux. */
mbed_official 15:a81a8d6c1dfe 334 uint32_t pinmux_pad1;
mbed_official 15:a81a8d6c1dfe 335 /** Set to enable SCL low time-out. */
mbed_official 15:a81a8d6c1dfe 336 bool scl_low_timeout;
mbed_official 15:a81a8d6c1dfe 337 #ifdef FEATURE_I2C_SCL_STRETCH_MODE
mbed_official 15:a81a8d6c1dfe 338 /** Set to enable SCL stretch only after ACK bit (required for high speed). */
mbed_official 15:a81a8d6c1dfe 339 bool scl_stretch_only_after_ack_bit;
mbed_official 15:a81a8d6c1dfe 340 #endif
mbed_official 15:a81a8d6c1dfe 341 #ifdef FEATURE_I2C_SCL_EXTEND_TIMEOUT
mbed_official 15:a81a8d6c1dfe 342 /** Set to enable slave SCL low extend time-out. */
mbed_official 15:a81a8d6c1dfe 343 bool slave_scl_low_extend_timeout;
mbed_official 15:a81a8d6c1dfe 344 #endif
mbed_official 15:a81a8d6c1dfe 345 };
mbed_official 15:a81a8d6c1dfe 346
mbed_official 15:a81a8d6c1dfe 347
mbed_official 15:a81a8d6c1dfe 348 /**
mbed_official 15:a81a8d6c1dfe 349 * \name Lock/Unlock
mbed_official 15:a81a8d6c1dfe 350 * @{
mbed_official 15:a81a8d6c1dfe 351 */
mbed_official 15:a81a8d6c1dfe 352
mbed_official 15:a81a8d6c1dfe 353 /**
mbed_official 15:a81a8d6c1dfe 354 * \brief Attempt to get lock on driver instance
mbed_official 15:a81a8d6c1dfe 355 *
mbed_official 15:a81a8d6c1dfe 356 * This function checks the instance's lock, which indicates whether or not it
mbed_official 15:a81a8d6c1dfe 357 * is currently in use, and sets the lock if it was not already set.
mbed_official 15:a81a8d6c1dfe 358 *
mbed_official 15:a81a8d6c1dfe 359 * The purpose of this is to enable exclusive access to driver instances, so
mbed_official 15:a81a8d6c1dfe 360 * that, e.g., transactions by different services will not interfere with each
mbed_official 15:a81a8d6c1dfe 361 * other.
mbed_official 15:a81a8d6c1dfe 362 *
mbed_official 15:a81a8d6c1dfe 363 * \param[in,out] module Pointer to the driver instance to lock
mbed_official 15:a81a8d6c1dfe 364 *
mbed_official 15:a81a8d6c1dfe 365 * \retval STATUS_OK If the module was locked
mbed_official 15:a81a8d6c1dfe 366 * \retval STATUS_BUSY If the module was already locked
mbed_official 15:a81a8d6c1dfe 367 */
mbed_official 15:a81a8d6c1dfe 368 static inline enum status_code i2c_slave_lock(
mbed_official 15:a81a8d6c1dfe 369 struct i2c_slave_module *const module)
mbed_official 15:a81a8d6c1dfe 370 {
mbed_official 15:a81a8d6c1dfe 371 enum status_code status;
mbed_official 15:a81a8d6c1dfe 372
mbed_official 15:a81a8d6c1dfe 373 system_interrupt_enter_critical_section();
mbed_official 15:a81a8d6c1dfe 374
mbed_official 15:a81a8d6c1dfe 375 if (module->locked) {
mbed_official 15:a81a8d6c1dfe 376 status = STATUS_BUSY;
mbed_official 15:a81a8d6c1dfe 377 } else {
mbed_official 15:a81a8d6c1dfe 378 module->locked = true;
mbed_official 15:a81a8d6c1dfe 379 status = STATUS_OK;
mbed_official 15:a81a8d6c1dfe 380 }
mbed_official 15:a81a8d6c1dfe 381
mbed_official 15:a81a8d6c1dfe 382 system_interrupt_leave_critical_section();
mbed_official 15:a81a8d6c1dfe 383
mbed_official 15:a81a8d6c1dfe 384 return status;
mbed_official 15:a81a8d6c1dfe 385 }
mbed_official 15:a81a8d6c1dfe 386
mbed_official 15:a81a8d6c1dfe 387 /**
mbed_official 15:a81a8d6c1dfe 388 * \brief Unlock driver instance
mbed_official 15:a81a8d6c1dfe 389 *
mbed_official 15:a81a8d6c1dfe 390 * This function clears the instance lock, indicating that it is available for
mbed_official 15:a81a8d6c1dfe 391 * use.
mbed_official 15:a81a8d6c1dfe 392 *
mbed_official 15:a81a8d6c1dfe 393 * \param[in,out] module Pointer to the driver instance to lock
mbed_official 15:a81a8d6c1dfe 394 *
mbed_official 15:a81a8d6c1dfe 395 * \retval STATUS_OK If the module was locked
mbed_official 15:a81a8d6c1dfe 396 * \retval STATUS_BUSY If the module was already locked
mbed_official 15:a81a8d6c1dfe 397 */
mbed_official 15:a81a8d6c1dfe 398 static inline void i2c_slave_unlock(struct i2c_slave_module *const module)
mbed_official 15:a81a8d6c1dfe 399 {
mbed_official 15:a81a8d6c1dfe 400 module->locked = false;
mbed_official 15:a81a8d6c1dfe 401 }
mbed_official 15:a81a8d6c1dfe 402
mbed_official 15:a81a8d6c1dfe 403 /** @} */
mbed_official 15:a81a8d6c1dfe 404
mbed_official 15:a81a8d6c1dfe 405 /**
mbed_official 15:a81a8d6c1dfe 406 * \name Configuration and Initialization
mbed_official 15:a81a8d6c1dfe 407 * @{
mbed_official 15:a81a8d6c1dfe 408 */
mbed_official 15:a81a8d6c1dfe 409
mbed_official 15:a81a8d6c1dfe 410 /**
mbed_official 15:a81a8d6c1dfe 411 * \brief Returns the synchronization status of the module
mbed_official 15:a81a8d6c1dfe 412 *
mbed_official 15:a81a8d6c1dfe 413 * Returns the synchronization status of the module.
mbed_official 15:a81a8d6c1dfe 414 *
mbed_official 15:a81a8d6c1dfe 415 * \param[out] module Pointer to software module structure
mbed_official 15:a81a8d6c1dfe 416 *
mbed_official 15:a81a8d6c1dfe 417 * \return Status of the synchronization.
mbed_official 15:a81a8d6c1dfe 418 * \retval true Module is busy synchronizing
mbed_official 15:a81a8d6c1dfe 419 * \retval false Module is not synchronizing
mbed_official 15:a81a8d6c1dfe 420 */
mbed_official 15:a81a8d6c1dfe 421 static inline bool i2c_slave_is_syncing(
mbed_official 15:a81a8d6c1dfe 422 const struct i2c_slave_module *const module)
mbed_official 15:a81a8d6c1dfe 423 {
mbed_official 15:a81a8d6c1dfe 424 /* Sanity check */
mbed_official 15:a81a8d6c1dfe 425 Assert(module);
mbed_official 15:a81a8d6c1dfe 426 Assert(module->hw);
mbed_official 15:a81a8d6c1dfe 427
mbed_official 15:a81a8d6c1dfe 428 SercomI2cs *const i2c_hw = &(module->hw->I2CS);
mbed_official 15:a81a8d6c1dfe 429
mbed_official 15:a81a8d6c1dfe 430 /* Return sync status */
mbed_official 15:a81a8d6c1dfe 431 #if defined(FEATURE_SERCOM_SYNCBUSY_SCHEME_VERSION_1)
mbed_official 15:a81a8d6c1dfe 432 return (i2c_hw->STATUS.reg & SERCOM_I2CS_STATUS_SYNCBUSY);
mbed_official 15:a81a8d6c1dfe 433 #elif defined(FEATURE_SERCOM_SYNCBUSY_SCHEME_VERSION_2)
mbed_official 15:a81a8d6c1dfe 434 return (i2c_hw->SYNCBUSY.reg & SERCOM_I2CS_SYNCBUSY_MASK);
mbed_official 15:a81a8d6c1dfe 435 #else
mbed_official 15:a81a8d6c1dfe 436 # error Unknown SERCOM SYNCBUSY scheme!
mbed_official 15:a81a8d6c1dfe 437 #endif
mbed_official 15:a81a8d6c1dfe 438 }
mbed_official 15:a81a8d6c1dfe 439
mbed_official 15:a81a8d6c1dfe 440 #if !defined(__DOXYGEN__)
mbed_official 15:a81a8d6c1dfe 441 /**
mbed_official 15:a81a8d6c1dfe 442 * \internal Wait for hardware module to sync
mbed_official 15:a81a8d6c1dfe 443 *
mbed_official 15:a81a8d6c1dfe 444 * \param[in] module Pointer to software module structure
mbed_official 15:a81a8d6c1dfe 445 */
mbed_official 15:a81a8d6c1dfe 446 static void _i2c_slave_wait_for_sync(
mbed_official 15:a81a8d6c1dfe 447 const struct i2c_slave_module *const module)
mbed_official 15:a81a8d6c1dfe 448 {
mbed_official 15:a81a8d6c1dfe 449 /* Sanity check. */
mbed_official 15:a81a8d6c1dfe 450 Assert(module);
mbed_official 15:a81a8d6c1dfe 451
mbed_official 15:a81a8d6c1dfe 452 while (i2c_slave_is_syncing(module)) {
mbed_official 15:a81a8d6c1dfe 453 /* Wait for I2C module to sync */
mbed_official 15:a81a8d6c1dfe 454 }
mbed_official 15:a81a8d6c1dfe 455 }
mbed_official 15:a81a8d6c1dfe 456 #endif
mbed_official 15:a81a8d6c1dfe 457
mbed_official 15:a81a8d6c1dfe 458 ///@cond INTERNAL
mbed_official 15:a81a8d6c1dfe 459 /**
mbed_official 15:a81a8d6c1dfe 460 * \internal Workaround for errata 13574
mbed_official 15:a81a8d6c1dfe 461 * Instead set ACK/NACK of CTRLB
mbed_official 15:a81a8d6c1dfe 462 *
mbed_official 15:a81a8d6c1dfe 463 * This errata exist in part revisions of SAMD20/D21
mbed_official 15:a81a8d6c1dfe 464 * D10/D11/L21/DAx/C20/C21, but workaround can be works in all
mbed_official 15:a81a8d6c1dfe 465 * revision of those device. As this function operation
mbed_official 15:a81a8d6c1dfe 466 * should be use less cpu time as possible, so caller
mbed_official 15:a81a8d6c1dfe 467 * function can ignore to check revision number, and use
mbed_official 15:a81a8d6c1dfe 468 * this workaround in all revision of those device.
mbed_official 15:a81a8d6c1dfe 469 *
mbed_official 15:a81a8d6c1dfe 470 * \param[in,out] module Pointer to software module structure
mbed_official 15:a81a8d6c1dfe 471 * \param[in] send_ack true send ACK, false send NACK
mbed_official 15:a81a8d6c1dfe 472 */
mbed_official 15:a81a8d6c1dfe 473 static inline void _i2c_slave_set_ctrlb_ackact(
mbed_official 15:a81a8d6c1dfe 474 struct i2c_slave_module *const module,
mbed_official 15:a81a8d6c1dfe 475 bool send_ack)
mbed_official 15:a81a8d6c1dfe 476 {
mbed_official 15:a81a8d6c1dfe 477 Assert(module);
mbed_official 15:a81a8d6c1dfe 478 Assert(module->hw);
mbed_official 15:a81a8d6c1dfe 479
mbed_official 15:a81a8d6c1dfe 480 SercomI2cs *const i2c_hw = &(module->hw->I2CS);
mbed_official 15:a81a8d6c1dfe 481
mbed_official 15:a81a8d6c1dfe 482 #if (SAMD20 || SAMD21 || SAMD10 || SAMD11 || SAML21 || SAMDA1 || SAMC20 || SAMC21)
mbed_official 15:a81a8d6c1dfe 483 /* Workaround, Following two write are atomic */
mbed_official 15:a81a8d6c1dfe 484 system_interrupt_enter_critical_section();
mbed_official 15:a81a8d6c1dfe 485 i2c_hw->STATUS.reg = 0;
mbed_official 15:a81a8d6c1dfe 486
mbed_official 15:a81a8d6c1dfe 487 if (send_ack == true) {
mbed_official 15:a81a8d6c1dfe 488 i2c_hw->CTRLB.reg = 0;
mbed_official 15:a81a8d6c1dfe 489 } else {
mbed_official 15:a81a8d6c1dfe 490 i2c_hw->CTRLB.reg = SERCOM_I2CS_CTRLB_ACKACT;
mbed_official 15:a81a8d6c1dfe 491 }
mbed_official 15:a81a8d6c1dfe 492 system_interrupt_leave_critical_section();
mbed_official 15:a81a8d6c1dfe 493 #else
mbed_official 15:a81a8d6c1dfe 494 /* Normal operation */
mbed_official 15:a81a8d6c1dfe 495 if (send_ack == true) {
mbed_official 15:a81a8d6c1dfe 496 i2c_hw->CTRLB.reg &= ~SERCOM_I2CS_CTRLB_ACKACT;
mbed_official 15:a81a8d6c1dfe 497 } else {
mbed_official 15:a81a8d6c1dfe 498 i2c_hw->CTRLB.reg |= SERCOM_I2CS_CTRLB_ACKACT;
mbed_official 15:a81a8d6c1dfe 499 }
mbed_official 15:a81a8d6c1dfe 500 #endif
mbed_official 15:a81a8d6c1dfe 501 return;
mbed_official 15:a81a8d6c1dfe 502 }
mbed_official 15:a81a8d6c1dfe 503
mbed_official 15:a81a8d6c1dfe 504 /**
mbed_official 15:a81a8d6c1dfe 505 * \internal Workaround for SAM0 errata 13574,
mbed_official 15:a81a8d6c1dfe 506 * instead Set CMD3 of CTRLB
mbed_official 15:a81a8d6c1dfe 507 *
mbed_official 15:a81a8d6c1dfe 508 * This errata exist in part revisions of SAMD20/D21
mbed_official 15:a81a8d6c1dfe 509 * D10/D11/L21/DAx/C20/C21, but workaround can be works in all
mbed_official 15:a81a8d6c1dfe 510 * revision of those device. As this function operation
mbed_official 15:a81a8d6c1dfe 511 * should be use less cpu time as possible, so caller
mbed_official 15:a81a8d6c1dfe 512 * function can ignore to check revision number, and use
mbed_official 15:a81a8d6c1dfe 513 * this workaround in all revision of those device.
mbed_official 15:a81a8d6c1dfe 514 *
mbed_official 15:a81a8d6c1dfe 515 * \param[in,out] module Pointer to software module structure
mbed_official 15:a81a8d6c1dfe 516 */
mbed_official 15:a81a8d6c1dfe 517 static inline void _i2c_slave_set_ctrlb_cmd3(
mbed_official 15:a81a8d6c1dfe 518 struct i2c_slave_module *const module)
mbed_official 15:a81a8d6c1dfe 519 {
mbed_official 15:a81a8d6c1dfe 520 Assert(module);
mbed_official 15:a81a8d6c1dfe 521 Assert(module->hw);
mbed_official 15:a81a8d6c1dfe 522
mbed_official 15:a81a8d6c1dfe 523 SercomI2cs *const i2c_hw = &(module->hw->I2CS);
mbed_official 15:a81a8d6c1dfe 524
mbed_official 15:a81a8d6c1dfe 525 #if (SAMD20 || SAMD21 || SAMD10 || SAMD11 || SAML21 || SAMDA1 || SAMC20 || SAMC21)
mbed_official 15:a81a8d6c1dfe 526 /* Workaround */
mbed_official 15:a81a8d6c1dfe 527 /*
mbed_official 15:a81a8d6c1dfe 528 * Below code instead i2c_hw->CTRLB.reg = SERCOM_I2CS_CTRLB_CMD(0x3);
mbed_official 15:a81a8d6c1dfe 529 * CMD=0x3 clears all interrupts, so to keep the result similar
mbed_official 15:a81a8d6c1dfe 530 * PREC is cleared if it was set
mbed_official 15:a81a8d6c1dfe 531 */
mbed_official 15:a81a8d6c1dfe 532 if (i2c_hw->INTFLAG.bit.PREC) {
mbed_official 15:a81a8d6c1dfe 533 i2c_hw->INTFLAG.reg = SERCOM_I2CS_INTFLAG_PREC;
mbed_official 15:a81a8d6c1dfe 534 }
mbed_official 15:a81a8d6c1dfe 535 i2c_hw->INTFLAG.reg = SERCOM_I2CS_INTFLAG_AMATCH;
mbed_official 15:a81a8d6c1dfe 536 #else
mbed_official 15:a81a8d6c1dfe 537 /* Normal operation */
mbed_official 15:a81a8d6c1dfe 538 i2c_hw->CTRLB.reg = SERCOM_I2CS_CTRLB_CMD(0x3);
mbed_official 15:a81a8d6c1dfe 539 #endif
mbed_official 15:a81a8d6c1dfe 540 return;
mbed_official 15:a81a8d6c1dfe 541 }
mbed_official 15:a81a8d6c1dfe 542 ///@endcond
mbed_official 15:a81a8d6c1dfe 543
mbed_official 15:a81a8d6c1dfe 544 /**
mbed_official 15:a81a8d6c1dfe 545 * \brief Gets the I<SUP>2</SUP>C slave default configurations
mbed_official 15:a81a8d6c1dfe 546 *
mbed_official 15:a81a8d6c1dfe 547 * This will initialize the configuration structure to known default values.
mbed_official 15:a81a8d6c1dfe 548 *
mbed_official 15:a81a8d6c1dfe 549 * The default configuration is as follows:
mbed_official 15:a81a8d6c1dfe 550 * - Disable SCL low timeout
mbed_official 15:a81a8d6c1dfe 551 * - 300ns - 600ns SDA hold time
mbed_official 15:a81a8d6c1dfe 552 * - Buffer timeout = 65535
mbed_official 15:a81a8d6c1dfe 553 * - Address with mask
mbed_official 15:a81a8d6c1dfe 554 * - Address = 0
mbed_official 15:a81a8d6c1dfe 555 * - Address mask = 0 (one single address)
mbed_official 15:a81a8d6c1dfe 556 * - General call address disabled
mbed_official 15:a81a8d6c1dfe 557 * - Address nack disabled if the interrupt driver is used
mbed_official 15:a81a8d6c1dfe 558 * - GCLK generator 0
mbed_official 15:a81a8d6c1dfe 559 * - Do not run in standby
mbed_official 15:a81a8d6c1dfe 560 * - PINMUX_DEFAULT for SERCOM pads
mbed_official 15:a81a8d6c1dfe 561 *
mbed_official 15:a81a8d6c1dfe 562 * Those default configuration only available if the device supports it:
mbed_official 15:a81a8d6c1dfe 563 * - Not using 10-bit addressing
mbed_official 15:a81a8d6c1dfe 564 * - Standard-mode and Fast-mode transfer speed
mbed_official 15:a81a8d6c1dfe 565 * - SCL stretch disabled
mbed_official 15:a81a8d6c1dfe 566 * - slave SCL low extend time-out disabled
mbed_official 15:a81a8d6c1dfe 567 *
mbed_official 15:a81a8d6c1dfe 568 * \param[out] config Pointer to configuration structure to be initialized
mbed_official 15:a81a8d6c1dfe 569 */
mbed_official 15:a81a8d6c1dfe 570 static inline void i2c_slave_get_config_defaults(
mbed_official 15:a81a8d6c1dfe 571 struct i2c_slave_config *const config)
mbed_official 15:a81a8d6c1dfe 572 {
mbed_official 15:a81a8d6c1dfe 573 /*Sanity check argument. */
mbed_official 15:a81a8d6c1dfe 574 Assert(config);
mbed_official 15:a81a8d6c1dfe 575 config->enable_scl_low_timeout = false;
mbed_official 15:a81a8d6c1dfe 576 config->sda_hold_time = I2C_SLAVE_SDA_HOLD_TIME_300NS_600NS;
mbed_official 15:a81a8d6c1dfe 577 config->buffer_timeout = 65535;
mbed_official 15:a81a8d6c1dfe 578 config->address_mode = I2C_SLAVE_ADDRESS_MODE_MASK;
mbed_official 15:a81a8d6c1dfe 579 config->address = 0;
mbed_official 15:a81a8d6c1dfe 580 config->address_mask = 0;
mbed_official 15:a81a8d6c1dfe 581 #ifdef FEATURE_I2C_10_BIT_ADDRESS
mbed_official 15:a81a8d6c1dfe 582 config->ten_bit_address = false;
mbed_official 15:a81a8d6c1dfe 583 #endif
mbed_official 15:a81a8d6c1dfe 584 config->enable_general_call_address = false;
mbed_official 15:a81a8d6c1dfe 585 #ifdef FEATURE_I2C_FAST_MODE_PLUS_AND_HIGH_SPEED
mbed_official 15:a81a8d6c1dfe 586 config->transfer_speed = I2C_SLAVE_SPEED_STANDARD_AND_FAST;
mbed_official 15:a81a8d6c1dfe 587 #endif
mbed_official 15:a81a8d6c1dfe 588 #if I2C_SLAVE_CALLBACK_MODE == true
mbed_official 15:a81a8d6c1dfe 589 config->enable_nack_on_address = false;
mbed_official 15:a81a8d6c1dfe 590 #endif
mbed_official 15:a81a8d6c1dfe 591 config->generator_source = GCLK_GENERATOR_0;
mbed_official 15:a81a8d6c1dfe 592 config->run_in_standby = false;
mbed_official 15:a81a8d6c1dfe 593 config->pinmux_pad0 = PINMUX_DEFAULT;
mbed_official 15:a81a8d6c1dfe 594 config->pinmux_pad1 = PINMUX_DEFAULT;
mbed_official 15:a81a8d6c1dfe 595 config->scl_low_timeout = false;
mbed_official 15:a81a8d6c1dfe 596 #ifdef FEATURE_I2C_SCL_STRETCH_MODE
mbed_official 15:a81a8d6c1dfe 597 config->scl_stretch_only_after_ack_bit = false;
mbed_official 15:a81a8d6c1dfe 598 #endif
mbed_official 15:a81a8d6c1dfe 599 #ifdef FEATURE_I2C_SCL_EXTEND_TIMEOUT
mbed_official 15:a81a8d6c1dfe 600 config->slave_scl_low_extend_timeout = false;
mbed_official 15:a81a8d6c1dfe 601 #endif
mbed_official 15:a81a8d6c1dfe 602 }
mbed_official 15:a81a8d6c1dfe 603
mbed_official 15:a81a8d6c1dfe 604 enum status_code i2c_slave_init(struct i2c_slave_module *const module,
mbed_official 15:a81a8d6c1dfe 605 Sercom *const hw,
mbed_official 15:a81a8d6c1dfe 606 const struct i2c_slave_config *const config);
mbed_official 15:a81a8d6c1dfe 607
mbed_official 15:a81a8d6c1dfe 608 /**
mbed_official 15:a81a8d6c1dfe 609 * \brief Enables the I<SUP>2</SUP>C module
mbed_official 15:a81a8d6c1dfe 610 *
mbed_official 15:a81a8d6c1dfe 611 * This will enable the requested I<SUP>2</SUP>C module.
mbed_official 15:a81a8d6c1dfe 612 *
mbed_official 15:a81a8d6c1dfe 613 * \param[in] module Pointer to the software module struct
mbed_official 15:a81a8d6c1dfe 614 */
mbed_official 15:a81a8d6c1dfe 615 static inline void i2c_slave_enable(
mbed_official 15:a81a8d6c1dfe 616 const struct i2c_slave_module *const module)
mbed_official 15:a81a8d6c1dfe 617 {
mbed_official 15:a81a8d6c1dfe 618 /* Sanity check of arguments. */
mbed_official 15:a81a8d6c1dfe 619 Assert(module);
mbed_official 15:a81a8d6c1dfe 620 Assert(module->hw);
mbed_official 15:a81a8d6c1dfe 621
mbed_official 15:a81a8d6c1dfe 622 SercomI2cs *const i2c_hw = &(module->hw->I2CS);
mbed_official 15:a81a8d6c1dfe 623
mbed_official 15:a81a8d6c1dfe 624 #if I2C_SLAVE_CALLBACK_MODE == true
mbed_official 15:a81a8d6c1dfe 625 /* Enable global interrupt for module */
mbed_official 15:a81a8d6c1dfe 626 system_interrupt_enable(_sercom_get_interrupt_vector(module->hw));
mbed_official 15:a81a8d6c1dfe 627 #endif
mbed_official 15:a81a8d6c1dfe 628
mbed_official 15:a81a8d6c1dfe 629 /* Wait for module to sync */
mbed_official 15:a81a8d6c1dfe 630 _i2c_slave_wait_for_sync(module);
mbed_official 15:a81a8d6c1dfe 631
mbed_official 15:a81a8d6c1dfe 632 /* Enable module */
mbed_official 15:a81a8d6c1dfe 633 i2c_hw->CTRLA.reg |= SERCOM_I2CS_CTRLA_ENABLE;
mbed_official 15:a81a8d6c1dfe 634 }
mbed_official 15:a81a8d6c1dfe 635
mbed_official 15:a81a8d6c1dfe 636
mbed_official 15:a81a8d6c1dfe 637 /**
mbed_official 15:a81a8d6c1dfe 638 * \brief Disables the I<SUP>2</SUP>C module
mbed_official 15:a81a8d6c1dfe 639 *
mbed_official 15:a81a8d6c1dfe 640 * This will disable the I<SUP>2</SUP>C module specified in the provided software module
mbed_official 15:a81a8d6c1dfe 641 * structure.
mbed_official 15:a81a8d6c1dfe 642 *
mbed_official 15:a81a8d6c1dfe 643 * \param[in] module Pointer to the software module struct
mbed_official 15:a81a8d6c1dfe 644 */
mbed_official 15:a81a8d6c1dfe 645 static inline void i2c_slave_disable(
mbed_official 15:a81a8d6c1dfe 646 const struct i2c_slave_module *const module)
mbed_official 15:a81a8d6c1dfe 647 {
mbed_official 15:a81a8d6c1dfe 648 /* Sanity check of arguments. */
mbed_official 15:a81a8d6c1dfe 649 Assert(module);
mbed_official 15:a81a8d6c1dfe 650 Assert(module->hw);
mbed_official 15:a81a8d6c1dfe 651
mbed_official 15:a81a8d6c1dfe 652 SercomI2cs *const i2c_hw = &(module->hw->I2CS);
mbed_official 15:a81a8d6c1dfe 653
mbed_official 15:a81a8d6c1dfe 654 #if I2C_SLAVE_CALLBACK_MODE == true
mbed_official 15:a81a8d6c1dfe 655 /* Disable interrupts */
mbed_official 15:a81a8d6c1dfe 656 i2c_hw->INTENCLR.reg = SERCOM_I2CS_INTENSET_PREC |
mbed_official 15:a81a8d6c1dfe 657 SERCOM_I2CS_INTENSET_AMATCH | SERCOM_I2CS_INTENSET_DRDY;
mbed_official 15:a81a8d6c1dfe 658
mbed_official 15:a81a8d6c1dfe 659 /* Clear interrupt flags */
mbed_official 15:a81a8d6c1dfe 660 i2c_hw->INTFLAG.reg = SERCOM_I2CS_INTFLAG_PREC | SERCOM_I2CS_INTFLAG_AMATCH |
mbed_official 15:a81a8d6c1dfe 661 SERCOM_I2CS_INTFLAG_DRDY;
mbed_official 15:a81a8d6c1dfe 662
mbed_official 15:a81a8d6c1dfe 663 /* Disable global interrupt for module */
mbed_official 15:a81a8d6c1dfe 664 system_interrupt_disable(_sercom_get_interrupt_vector(module->hw));
mbed_official 15:a81a8d6c1dfe 665 #endif
mbed_official 15:a81a8d6c1dfe 666
mbed_official 15:a81a8d6c1dfe 667 /* Wait for module to sync */
mbed_official 15:a81a8d6c1dfe 668 _i2c_slave_wait_for_sync(module);
mbed_official 15:a81a8d6c1dfe 669
mbed_official 15:a81a8d6c1dfe 670 /* Disable module */
mbed_official 15:a81a8d6c1dfe 671 i2c_hw->CTRLA.reg &= ~SERCOM_I2CS_CTRLA_ENABLE;
mbed_official 15:a81a8d6c1dfe 672 }
mbed_official 15:a81a8d6c1dfe 673
mbed_official 15:a81a8d6c1dfe 674 void i2c_slave_reset(
mbed_official 15:a81a8d6c1dfe 675 struct i2c_slave_module *const module);
mbed_official 15:a81a8d6c1dfe 676
mbed_official 15:a81a8d6c1dfe 677 /** @} */
mbed_official 15:a81a8d6c1dfe 678
mbed_official 15:a81a8d6c1dfe 679 /**
mbed_official 15:a81a8d6c1dfe 680 * \name Read and Write
mbed_official 15:a81a8d6c1dfe 681 * @{
mbed_official 15:a81a8d6c1dfe 682 */
mbed_official 15:a81a8d6c1dfe 683
mbed_official 15:a81a8d6c1dfe 684 enum status_code i2c_slave_write_packet_wait(
mbed_official 15:a81a8d6c1dfe 685 struct i2c_slave_module *const module,
mbed_official 15:a81a8d6c1dfe 686 struct i2c_slave_packet *const packet);
mbed_official 15:a81a8d6c1dfe 687 enum status_code i2c_slave_read_packet_wait(
mbed_official 15:a81a8d6c1dfe 688 struct i2c_slave_module *const module,
mbed_official 15:a81a8d6c1dfe 689 struct i2c_slave_packet *const packet);
mbed_official 15:a81a8d6c1dfe 690 enum i2c_slave_direction i2c_slave_get_direction_wait(
mbed_official 15:a81a8d6c1dfe 691 struct i2c_slave_module *const module);
mbed_official 15:a81a8d6c1dfe 692
mbed_official 15:a81a8d6c1dfe 693 /** @} */
mbed_official 15:a81a8d6c1dfe 694
mbed_official 15:a81a8d6c1dfe 695 /**
mbed_official 15:a81a8d6c1dfe 696 * \name Status Management
mbed_official 15:a81a8d6c1dfe 697 * @{
mbed_official 15:a81a8d6c1dfe 698 */
mbed_official 15:a81a8d6c1dfe 699 uint32_t i2c_slave_get_status(
mbed_official 15:a81a8d6c1dfe 700 struct i2c_slave_module *const module);
mbed_official 15:a81a8d6c1dfe 701 void i2c_slave_clear_status(
mbed_official 15:a81a8d6c1dfe 702 struct i2c_slave_module *const module,
mbed_official 15:a81a8d6c1dfe 703 uint32_t status_flags);
mbed_official 15:a81a8d6c1dfe 704 /** @} */
mbed_official 15:a81a8d6c1dfe 705
mbed_official 15:a81a8d6c1dfe 706 #ifdef FEATURE_I2C_DMA_SUPPORT
mbed_official 15:a81a8d6c1dfe 707 /**
mbed_official 15:a81a8d6c1dfe 708 * \name SERCOM I2C Slave with DMA Interfaces
mbed_official 15:a81a8d6c1dfe 709 * @{
mbed_official 15:a81a8d6c1dfe 710 */
mbed_official 15:a81a8d6c1dfe 711
mbed_official 15:a81a8d6c1dfe 712 /**
mbed_official 15:a81a8d6c1dfe 713 * \brief Read SERCOM I<SUP>2</SUP>C interrupt status.
mbed_official 15:a81a8d6c1dfe 714 *
mbed_official 15:a81a8d6c1dfe 715 * Read I<SUP>2</SUP>C interrupt status for DMA transfer.
mbed_official 15:a81a8d6c1dfe 716 *
mbed_official 15:a81a8d6c1dfe 717 * \param[in,out] module Pointer to the driver instance to lock
mbed_official 15:a81a8d6c1dfe 718 *
mbed_official 15:a81a8d6c1dfe 719 */
mbed_official 15:a81a8d6c1dfe 720 static inline uint8_t i2c_slave_dma_read_interrupt_status(struct i2c_slave_module *const module)
mbed_official 15:a81a8d6c1dfe 721 {
mbed_official 15:a81a8d6c1dfe 722 return (uint8_t)module->hw->I2CS.INTFLAG.reg;
mbed_official 15:a81a8d6c1dfe 723 }
mbed_official 15:a81a8d6c1dfe 724
mbed_official 15:a81a8d6c1dfe 725 /**
mbed_official 15:a81a8d6c1dfe 726 * \brief Write SERCOM I<SUP>2</SUP>C interrupt status.
mbed_official 15:a81a8d6c1dfe 727 *
mbed_official 15:a81a8d6c1dfe 728 * Write I<SUP>2</SUP>C interrupt status for DMA transfer.
mbed_official 15:a81a8d6c1dfe 729 *
mbed_official 15:a81a8d6c1dfe 730 * \param[in,out] module Pointer to the driver instance to lock
mbed_official 15:a81a8d6c1dfe 731 * \param[in] flag Interrupt flag status
mbed_official 15:a81a8d6c1dfe 732 *
mbed_official 15:a81a8d6c1dfe 733 */
mbed_official 15:a81a8d6c1dfe 734 static inline void i2c_slave_dma_write_interrupt_status(struct i2c_slave_module *const module,
mbed_official 15:a81a8d6c1dfe 735 uint8_t flag)
mbed_official 15:a81a8d6c1dfe 736 {
mbed_official 15:a81a8d6c1dfe 737 module->hw->I2CS.INTFLAG.reg = flag;
mbed_official 15:a81a8d6c1dfe 738 }
mbed_official 15:a81a8d6c1dfe 739
mbed_official 15:a81a8d6c1dfe 740 /** @} */
mbed_official 15:a81a8d6c1dfe 741 #endif
mbed_official 15:a81a8d6c1dfe 742
mbed_official 15:a81a8d6c1dfe 743 /** @} */
mbed_official 15:a81a8d6c1dfe 744
mbed_official 15:a81a8d6c1dfe 745 #ifdef __cplusplus
mbed_official 15:a81a8d6c1dfe 746 }
mbed_official 15:a81a8d6c1dfe 747 #endif
mbed_official 15:a81a8d6c1dfe 748
mbed_official 15:a81a8d6c1dfe 749 #endif /* I2C_SLAVE_H_INCLUDED */