semf
stm32i2cslave.h
Go to the documentation of this file.
1
10#ifndef SEMF_HARDWAREABSTRACTION_STM32_STM32I2CSLAVE_H_
11#define SEMF_HARDWAREABSTRACTION_STM32_STM32I2CSLAVE_H_
12
16
17#if defined(STM32) && defined(HAL_I2C_MODULE_ENABLED)
18namespace semf
19{
23class Stm32I2cSlave : public I2cSlaveHardware, public LinkedQueue<Stm32I2cSlave>::Node
24{
25public:
27 enum class ErrorCode : uint8_t
28 {
29 Init_HalError = 0,
30 Init_HalBusy,
31 Init_HalTimeout,
32 Deinit_HalError,
33 Deinit_HalBusy,
34 Deinit_HalTimeout,
35 SystemIsrListen_EnableListenHalError,
36 SystemIsrListen_EnableListenHalBusy,
37 SystemIsrListen_EnableListenHalTimeout,
38 SetFrequency_IsBusy,
39 SystemIsrError_HalError,
40 ReadHardware_HalError,
41 ReadHardware_HalBusy,
42 ReadHardware_HalTimeout,
43 WriteHardware_HalError,
44 WriteHardware_HalBusy,
45 WriteHardware_HalTimeout,
46 StartListeningHardware_HalError,
47 StartListeningHardware_HalBusy,
48 StartListeningHardware_HalTimeout,
49 StopListeningHardware_HalError,
50 StopListeningHardware_HalBusy,
51 StopListeningHardware_HalTimeout
52 };
53
58 explicit Stm32I2cSlave(I2C_HandleTypeDef& hwHandle);
59 explicit Stm32I2cSlave(const Stm32I2cSlave& other) = delete;
60 virtual ~Stm32I2cSlave() = default;
61
68 void init() override;
75 void deinit() override;
76 void stopRead() override;
77 void stopWrite() override;
82 void setFrequency(uint32_t hz) override;
87 static void systemIsrRead(I2C_HandleTypeDef& hwHandle);
92 static void systemIsrWritten(I2C_HandleTypeDef& hwHandle);
100 static void systemIsrListen(I2C_HandleTypeDef& hwHandle);
101 /*
102 * @brief System-wide isr for an error on an I2C-bus.
103 * @param hwHandle Native handle.
104 */
105 static void systemIsrError(I2C_HandleTypeDef& hwHandle);
106 /*
107 * @brief System-wide isr getting addressed on an I2C-bus.
108 * @param hwHandle Native handle.
109 * @param direction Direction of the data transmission.
110 * @param addrMatchCode Address match code.
111 */
112 static void systemIsrAddressing(I2C_HandleTypeDef& hwHandle, uint8_t direction, uint16_t addrMatchCode);
113
114protected:
121 void readHardware(uint8_t buffer[], size_t bufferSize) override;
128 void writeHardware(const uint8_t data[], size_t dataSize) override;
135 void startListeningHardware() override;
142 void stopListeningHardware() override;
143 void setAddressHardware(uint8_t address) override;
149 virtual uint32_t hardwareFrame(CommunicationHardware::Frame frame) const;
154 I2C_HandleTypeDef* hardwareHandle();
155
156private:
158 I2C_HandleTypeDef* m_hwHandle;
160 static LinkedQueue<Stm32I2cSlave> m_queue;
162 uint8_t* m_readBuffer;
164 size_t m_readBufferSize;
166 static constexpr Error::ClassID kSemfClassId = Error::ClassID::Stm32I2cSlave;
167};
168} /* namespace semf */
169#endif
170#endif // SEMF_HARDWAREABSTRACTION_STM32_STM32I2CSLAVE_H_
ClassID
Semf class IDs.
Definition: error.h:28
This class can be used for using the I2C bus as a slave. Call startListening() for receiving I/O-requ...
uint8_t address() const override
Returns the I2C slave device address.
CommunicationHardware::Frame frame() const
Returns the actual frame mode setting.
LinkedQueue is an managed single linked queue implementation.
Definition: linkedqueue.h:38
I2cSlaveHardware implementation for STM32.
Definition: stm32i2cslave.h:24
void init() override
void stopListeningHardware() override
void writeHardware(const uint8_t data[], size_t dataSize) override
Hardware will write data. After finished write operation, onDataWritten() function will be called.
void setFrequency(uint32_t hz) override
Sets the speed (I2C baud rate).
static void systemIsrAddressing(I2C_HandleTypeDef &hwHandle, uint8_t direction, uint16_t addrMatchCode)
I2C_HandleTypeDef * hardwareHandle()
Returns the hardware Handle.
virtual ~Stm32I2cSlave()=default
void readHardware(uint8_t buffer[], size_t bufferSize) override
Hardware will read data. After finished read operation, onDataAvailable() function will be called.
void stopRead() override
void setAddressHardware(uint8_t address) override
Sets the address of the i2c hardware.
static void systemIsrWritten(I2C_HandleTypeDef &hwHandle)
System-wide isr for data transmission on an I2C-bus.
static void systemIsrError(I2C_HandleTypeDef &hwHandle)
virtual uint32_t hardwareFrame(CommunicationHardware::Frame frame) const
Converts the frame information from semf to STM.
Stm32I2cSlave(const Stm32I2cSlave &other)=delete
void deinit() override
static void systemIsrListen(I2C_HandleTypeDef &hwHandle)
System-wide isr for end of listening on an I2C-bus.
static void systemIsrRead(I2C_HandleTypeDef &hwHandle)
System-wide isr for data reception on an I2C-bus.
void stopWrite() override
Stm32I2cSlave(I2C_HandleTypeDef &hwHandle)
Constructor.
void startListeningHardware() override