diff options
Diffstat (limited to 'hal/i2c.h')
-rw-r--r-- | hal/i2c.h | 52 |
1 files changed, 37 insertions, 15 deletions
@@ -2,16 +2,23 @@ #define I2C_H #include <stdint.h> - #include "interrupt.h" +#include "pin.h" -class I2C { - friend void interrupt<Interrupt::I2C1_EV>(); - friend void interrupt<Interrupt::I2C1_ER>(); - +struct I2C_reg_t { + volatile uint32_t CR1; + volatile uint32_t CR2; + volatile uint32_t OAR1; + volatile uint32_t OAR2; + volatile uint32_t DR; + volatile uint32_t SR1; + volatile uint32_t SR2; + volatile uint32_t CCR; + volatile uint32_t TRISE; +}; + +class I2C_t { private: - static I2C* self; - volatile uint8_t addr; volatile uint8_t writing; volatile uint8_t reading; @@ -19,22 +26,37 @@ class I2C { volatile uint8_t* read_p; volatile bool busy; + + public: + I2C_reg_t& reg; + const uint32_t clk; + Interrupt::IRQ irq_ev_n; + Interrupt::IRQ irq_er_n; + + I2C_t(uint32_t reg_addr, uint32_t bus_clk, Interrupt::IRQ ev_n, Interrupt::IRQ er_n) : reg(*(I2C_reg_t*)reg_addr), clk(bus_clk), irq_ev_n(ev_n), irq_er_n(er_n) { + reading = writing = 0; + } void irq_ev(); void irq_er(); + void handle_error(); - - public: - I2C() { - self = this; - } - void enable(); + void enable(Pin& scl, Pin& sda); - void write_reg(uint8_t addr_, uint8_t reg, uint8_t data); - void read_reg(uint8_t addr_, uint8_t reg, uint8_t len, uint8_t* buf); + void write_reg(uint8_t addr_, uint8_t reg_, uint8_t data); + void read_reg(uint8_t addr_, uint8_t reg_, uint8_t len, uint8_t* buf); }; +#if defined(STM32F1) +extern I2C_t I2C1; +extern I2C_t I2C2; +#elif defined(STM32F4) +extern I2C_t I2C1; +extern I2C_t I2C2; +extern I2C_t I2C3; +#endif +typedef I2C_t I2C; #endif |