33#include <libopencm3/stm32/rcc.h>
34#include <libopencm3/stm32/gpio.h>
35#include <libopencm3/cm3/nvic.h>
36#include <libopencm3/cm3/scb.h>
52#define I2C_SR1_ERR_MASK (I2C_SR1_SMBALERT | \
52#define I2C_SR1_ERR_MASK (I2C_SR1_SMBALERT | \ …
62#define BIT_X_IS_SET_IN_REG(X,REG) (((REG) & (X)) == (X))
71#define __I2C_REG_CRITICAL_ZONE_START __disable_irq();
72#define __I2C_REG_CRITICAL_ZONE_STOP __enable_irq();
75#ifndef NVIC_I2C_IRQ_PRIO
76#define NVIC_I2C1_IRQ_PRIO 0
77#define NVIC_I2C2_IRQ_PRIO 0
78#define NVIC_I2C3_IRQ_PRIO 0
80#define NVIC_I2C1_IRQ_PRIO NVIC_I2C_IRQ_PRIO
81#define NVIC_I2C2_IRQ_PRIO NVIC_I2C_IRQ_PRIO
82#define NVIC_I2C3_IRQ_PRIO NVIC_I2C_IRQ_PRIO
85#if USE_I2C1 || USE_I2C2 || USE_I2C3
111#elif defined(STM32F4)
113#define I2C1_GPIO_AF GPIO_AF4
117#define I2C2_GPIO_AF GPIO_AF4
120#ifndef I2C3_GPIO_SCL_AF
121#define I2C3_GPIO_SCL_AF GPIO_AF4
123#ifndef I2C3_GPIO_SDA_AF
124#define I2C3_GPIO_SDA_AF GPIO_AF4
245 if (trans->
len_w > 1) {
742 switch (trans->
len_r) {
838#error "The STM32 doesn't have I2C0, use I2C1 or I2C2"
844#ifndef I2C1_CLOCK_SPEED
845#define I2C1_CLOCK_SPEED 200000
918#ifndef I2C2_CLOCK_SPEED
919#define I2C2_CLOCK_SPEED 300000
991#if USE_I2C3 && defined STM32F4
994#ifndef I2C3_CLOCK_SPEED
995#define I2C3_CLOCK_SPEED 300000
1156#define WD_RECOVERY_TICKS 18
1158#if USE_I2C1 || USE_I2C2 || USE_I2C3
1223 if (periph->watchdog ==
WD_DELAY + 1) {
1228 periph->trans_insert_idx = 0;
1229 periph->trans_extract_idx = 0;
1233 trans = periph->trans[i];
1292 periph->watchdog = 0;
1294 periph->errors->wd_reset_cnt++;
1299 if (periph->watchdog >= 0) {
void gpio_setup_output(ioportid_t port, uint16_t gpios)
Setup one or more pins of the given GPIO port as outputs.
void gpio_setup_input(ioportid_t port, uint16_t gpios)
Setup one or more pins of the given GPIO port as inputs.
static void gpio_set(ioportid_t port, uint16_t pin)
Set a gpio output to high level.
static void gpio_toggle(ioportid_t port, uint16_t pin)
Toggle a gpio output to low level.
static uint8_t gpio_get(ioportid_t port, uint16_t pin)
Get level of a gpio.
Some architecture independent helper functions for GPIOs.
volatile uint16_t pec_recep_cnt
volatile uint8_t buf[I2C_BUF_LEN]
Transaction buffer With I2C_BUF_LEN number of bytes.
volatile uint16_t smbus_alert_cnt
struct i2c_errors * errors
uint8_t trans_extract_idx
uint16_t len_r
Number of bytes to read/receive.
volatile uint16_t ack_fail_cnt
volatile uint16_t timeout_tlow_cnt
volatile uint16_t over_under_cnt
volatile uint16_t unexpected_event_cnt
volatile uint32_t last_unexpected_event
volatile uint32_t er_irq_cnt
enum I2CTransactionType type
Transaction type.
enum I2CTransactionStatus status
Transaction status.
volatile uint16_t queue_full_cnt
struct i2c_transaction * trans[I2C_TRANSACTION_QUEUE_LEN]
volatile uint16_t miss_start_stop_cnt
volatile int16_t watchdog
uint8_t slave_addr
Slave address.
volatile uint16_t arb_lost_cnt
uint8_t len_w
Number of bytes to write/transmit.
void i2c_event(void)
i2c_event() function
#define ZEROS_ERR_COUNTER(_i2c_err)
#define I2C_TRANSACTION_QUEUE_LEN
I2C transaction queue length.
static bool i2c_idle(struct i2c_periph *p)
Check if I2C bus is idle.
static void i2c_setbitrate(struct i2c_periph *p, int bitrate)
Set I2C bitrate.
@ I2CTransSuccess
transaction successfully finished by I2C driver
@ I2CTransFailed
transaction failed
@ I2CTransPending
transaction is pending in queue
@ I2CTransRx
receive only transaction
@ I2CTransTx
transmit only transaction
@ I2CTransTxRx
transmit and receive transaction
I2C transaction structure.
Architecture independent I2C (Inter-Integrated Circuit Bus) API.
#define I2C3_GPIO_PORT_SCL
#define I2C3_GPIO_PORT_SDA
PRINT_CONFIG_VAR(ONELOOP_ANDI_FILT_CUTOFF)
void gpio_enable_clock(uint32_t port)
Enable the relevant clock.
#define BIT_X_IS_SET_IN_REG(X, REG)
#define NVIC_I2C2_IRQ_PRIO
static enum STMI2CSubTransactionStatus stmi2c_read1(uint32_t i2c, struct i2c_periph *periph, struct i2c_transaction *trans)
static void PPRZ_I2C_SEND_START(struct i2c_periph *periph)
static enum STMI2CSubTransactionStatus stmi2c_send(uint32_t i2c, struct i2c_periph *periph, struct i2c_transaction *trans)
static void i2c_error(struct i2c_periph *periph)
static void PPRZ_I2C_SEND_STOP(uint32_t i2c)
STMI2CSubTransactionStatus
@ STMI2C_SubTra_Ready_StopRequested
#define WD_RECOVERY_TICKS
#define NVIC_I2C1_IRQ_PRIO
#define __I2C_REG_CRITICAL_ZONE_STOP
static void __enable_irq(void)
static void __disable_irq(void)
static void i2c_irq(struct i2c_periph *periph)
#define NVIC_I2C3_IRQ_PRIO
static bool i2c_stm32_idle(struct i2c_periph *periph)
static void stmi2c_clear_pending_interrupts(uint32_t i2c)
#define __I2C_REG_CRITICAL_ZONE_START
static enum STMI2CSubTransactionStatus stmi2c_readmany(uint32_t i2c, struct i2c_periph *periph, struct i2c_transaction *trans)
static bool i2c_stm32_submit(struct i2c_periph *periph, struct i2c_transaction *t)
static enum STMI2CSubTransactionStatus stmi2c_read2(uint32_t i2c, struct i2c_periph *periph, struct i2c_transaction *trans)
static void i2c_stm32_setbitrate(struct i2c_periph *periph, int bitrate)
Architecture independent timing functions.
#define SysTimeTimerStart(_t)
struct tag_tracking_public dummy
unsigned short uint16_t
Typedef defining 16 bit unsigned short type.
unsigned int uint32_t
Typedef defining 32 bit unsigned int type.
unsigned char uint8_t
Typedef defining 8 bit unsigned char type.