28 #include <libopencm3/stm32/rcc.h> 29 #include <libopencm3/stm32/gpio.h> 30 #include <libopencm3/stm32/i2c.h> 31 #include <libopencm3/stm32/timer.h> 50 void i2c_master(bool fast) 59 rcc_periph_clock_enable(RCC_AFIO);
63 i2c_set_clock_frequency(
I2C(
I2C_I2C), rcc_apb1_frequency/1000000);
66 i2c_set_ccr(
I2C(
I2C_I2C), rcc_apb1_frequency/(400000*2));
67 i2c_set_trise(
I2C(
I2C_I2C), (300/(1000/(rcc_apb1_frequency/1000000)))+1);
70 i2c_set_ccr(
I2C(
I2C_I2C), rcc_apb1_frequency/(100000*2));
71 i2c_set_trise(
I2C(
I2C_I2C), (1000/(1000/(rcc_apb1_frequency/1000000)))+1);
78 timer_set_mode(
TIM(
I2C_TIMER), TIM_CR1_CKD_CK_INT, TIM_CR1_CMS_EDGE, TIM_CR1_DIR_UP);
81 timer_set_prescaler(
TIM(
I2C_TIMER), rcc_ahb_frequency/400000-1);
83 timer_set_prescaler(
TIM(
I2C_TIMER), rcc_ahb_frequency/100000-1);
97 bool i2c_read(uint8_t slave,
const uint8_t* address,
size_t address_size, uint8_t* data,
size_t data_size)
100 if (address==NULL || address_size==0 || data==NULL || data_size==0) {
110 bool to_return =
false;
128 i2c_send_7bit_address(
I2C(
I2C_I2C), slave, I2C_WRITE);
138 if (!((I2C_SR2(
I2C(
I2C_I2C)) & I2C_SR2_TRA))) {
143 for (
size_t i=0; i<address_size; i++) {
168 i2c_send_7bit_address(
I2C(
I2C_I2C), slave, I2C_READ);
183 for (
size_t i=0; i<data_size; i++) {
184 if (i==data_size-1) {
219 bool i2c_write(uint8_t slave,
const uint8_t* address,
size_t address_size,
const uint8_t* data,
size_t data_size)
222 if (address==NULL || address_size==0 || data==NULL || data_size==0) {
232 bool to_return =
false;
252 i2c_send_7bit_address(
I2C(
I2C_I2C), slave, I2C_WRITE);
262 if (!((I2C_SR2(
I2C(
I2C_I2C)) & I2C_SR2_TRA))) {
267 for (
size_t i=0; i<address_size; i++) {
281 for (
size_t i=0; i<data_size; i++) {
#define I2C_SCL_PORT(x)
get I2C port for SCL pin based on I2C identifier
#define I2C(x)
get I2C based on I2C identifier
bool i2c_write(uint8_t slave, const uint8_t *address, size_t address_size, const uint8_t *data, size_t data_size)
write to I2C slave
#define I2C_SDA_PIN(x)
get I2C port for SDA pin based on I2C identifier
global definitions and methods (API)
#define I2C_I2C
I2C peripheral.
#define I2C_SDA_PORT(x)
get I2C port for SDA pin based on I2C identifier
#define I2C_TIMEOUT
timeout factor (compared to expected time)
#define RCC_TIM(x)
get RCC for timer based on TIM identifier
bool i2c_read(uint8_t slave, const uint8_t *address, size_t address_size, uint8_t *data, size_t data_size)
read from I2C slave
#define I2C_SCL_PIN(x)
get I2C pin for SCL pin based on I2C identifier
#define RCC_I2C_SCL_PORT(x)
get RCC for GPIO port for SCL based on I2C identifier
#define TIM(x)
get TIM based on TIM identifier
#define I2C_TIMER
timer peripheral
#define RCC_I2C(x)
get RCC for I2C based on I2C identifier
library to communicate using I2C (code)