semf
stm32i2cmaster.h
Go to the documentation of this file.
1
10#ifndef SEMF_HARDWAREABSTRACTION_STM32_STM32I2CMASTER_H_
11#define SEMF_HARDWAREABSTRACTION_STM32_STM32I2CMASTER_H_
12
17
18#if defined(STM32) && defined(HAL_I2C_MODULE_ENABLED)
19namespace semf
20{
24class Stm32I2cMaster : public I2cMasterHardware, public LinkedQueue<Stm32I2cMaster>::Node
25{
26public:
28 enum class ErrorCode : uint8_t
29 {
30 Init_HalError = 0,
31 Init_HalBusy,
32 Init_HalTimeout,
33 Deinit_HalError,
34 Deinit_HalBusy,
35 Deinit_HalTimeout,
36 StopWrite_HalError,
37 StopWrite_HalBusy,
38 StopWrite_HalTimeout,
39 StopRead_HalError,
40 StopRead_HalBusy,
41 StopRead_HalTimeout,
42 SetFrequency_IsBusy,
43 IsrError_HalError,
44 ReadHardware_HalError,
45 ReadHardware_HalBusy,
46 ReadHardware_HalTimeout,
47 WriteHardware_HalError,
48 WriteHardware_HalBusy,
49 WriteHardware_HalTimeout,
50 };
55 explicit Stm32I2cMaster(I2C_HandleTypeDef& hwHandle);
56 explicit Stm32I2cMaster(const Stm32I2cMaster& other) = delete;
57 virtual ~Stm32I2cMaster() = default;
58
65 void init() override;
72 void deinit() override;
79 void stopWrite() override;
86 void stopRead() override;
91 void setFrequency(uint32_t hz) override;
92 void checkAddress(uint8_t address) override;
102 static void systemIsrRead(I2C_HandleTypeDef& i2c);
107 static void systemIsrWritten(I2C_HandleTypeDef& i2c);
112 static void systemIsrError(I2C_HandleTypeDef& i2c);
117 static void systemIsrAbort(I2C_HandleTypeDef& i2c);
122 void isrRead(I2C_HandleTypeDef& i2c);
127 void isrWritten(I2C_HandleTypeDef& i2c);
133 void isrError(I2C_HandleTypeDef& i2c);
138 void isrAbort(I2C_HandleTypeDef& i2c);
139
140protected:
145 I2C_HandleTypeDef* hardwareHandle();
151 virtual uint32_t hardwareFrame(CommunicationHardware::Frame frame) const;
158 void readHardware(uint8_t buffer[], size_t bufferSize) override;
165 void writeHardware(const uint8_t data[], size_t dataSize) override;
166
167private:
171 void onAddressChecked();
172
174 Signal<> canceled;
176 SEMF_SLOT(m_canceledSlot, Signal<>, canceled, emitSignal);
178 SEMF_SLOT(m_onAddressCheckedSlot, Stm32I2cMaster, *this, onAddressChecked);
180 I2C_HandleTypeDef* m_hwHandle;
182 static LinkedQueue<Stm32I2cMaster> m_queue;
184 static constexpr Error::ClassID kSemfClassId = Error::ClassID::Stm32I2cMaster;
185};
186} /* namespace semf */
187#endif
188#endif /* SEMF_HARDWAREABSTRACTION_STM32_STM32I2CMASTER_H_ */
ClassID
Semf class IDs.
Definition: error.h:28
For using the I2C in master mode.
CommunicationHardware::Frame frame() const
Returns the actual frame mode setting.
uint8_t address() const override
Returns the I2C slave device address.
LinkedQueue is an managed single linked queue implementation.
Definition: linkedqueue.h:38
Signal for lightweight signal/slot implementation. One signal can be connected to multiple slots and ...
Definition: signal.h:41
I2cMasterHardware implementation for STM32.
void stopRead() override
void isrError(I2C_HandleTypeDef &i2c)
Interrupt service routine for i2c object error.
void writeHardware(const uint8_t data[], size_t dataSize) override
Hardware will write data. After finished write operation, onDataWritten() function will be called.
I2C_HandleTypeDef * hardwareHandle()
Returns the hardware handle.
virtual uint32_t hardwareFrame(CommunicationHardware::Frame frame) const
Converts the frame information from semf to STM.
void checkAddress(uint8_t address) override
Checks if the given address is available on the bus. Emits address found if successful (ACK)....
void init() override
void stopWrite() override
void isrWritten(I2C_HandleTypeDef &i2c)
Interrupt service routine for i2c object transmit.
virtual ~Stm32I2cMaster()=default
static void systemIsrWritten(I2C_HandleTypeDef &i2c)
System-wide interrupt service routine for i2c transmit.
static LinkedQueue< Stm32I2cMaster > * queue()
Get the list with all i2c.
void readHardware(uint8_t buffer[], size_t bufferSize) override
Hardware will read data. After finished read operation, onDataAvailable() function will be called.
void setFrequency(uint32_t hz) override
Sets the speed (I2C baud rate).
void isrRead(I2C_HandleTypeDef &i2c)
Interrupt service routine for i2c object receive.
static void systemIsrError(I2C_HandleTypeDef &i2c)
System-wide interrupt service routine for i2c error.
Stm32I2cMaster(const Stm32I2cMaster &other)=delete
void isrAbort(I2C_HandleTypeDef &i2c)
Interrupt service routine for i2c object abort.
Stm32I2cMaster(I2C_HandleTypeDef &hwHandle)
Constructor.
static void systemIsrAbort(I2C_HandleTypeDef &i2c)
System-wide interrupt service routine for process canceling.
static void systemIsrRead(I2C_HandleTypeDef &i2c)
System-wide interrupt service routine for i2c receive.
void deinit() override