59 lines
1.9 KiB
C++
59 lines
1.9 KiB
C++
/*
|
|
* FRToSI2C.hpp
|
|
*
|
|
* Created on: 14Apr.,2018
|
|
* Author: Ralim
|
|
*/
|
|
|
|
#ifndef FRTOSI2C_HPP_
|
|
#define FRTOSI2C_HPP_
|
|
|
|
#include "cmsis_os.h"
|
|
|
|
/*
|
|
* Wrapper class to work with the device I2C bus
|
|
*
|
|
* This provides mutex protection of the peripheral
|
|
* Also allows hardware to use DMA should it want to
|
|
*
|
|
*
|
|
*/
|
|
class FRToSI2C {
|
|
public:
|
|
static void FRToSInit() {
|
|
if (I2CSemaphore == nullptr) {
|
|
I2CSemaphore = xSemaphoreCreateBinaryStatic(&xSemaphoreBuffer);
|
|
xSemaphoreGive(I2CSemaphore);
|
|
}
|
|
}
|
|
|
|
static void CpltCallback(); // Normal Tx Callback
|
|
|
|
static bool Mem_Read(uint16_t DevAddress, uint16_t MemAddress, uint8_t *pData, uint16_t Size);
|
|
static bool Mem_Write(uint16_t DevAddress, uint16_t MemAddress, uint8_t *pData, uint16_t Size);
|
|
// Returns true if device ACK's being addressed
|
|
static bool probe(uint16_t DevAddress);
|
|
static bool wakePart(uint16_t DevAddress);
|
|
static bool Transmit(uint16_t DevAddress, uint8_t *pData, uint16_t Size);
|
|
static void Receive(uint16_t DevAddress, uint8_t *pData, uint16_t Size);
|
|
static void TransmitReceive(uint16_t DevAddress, uint8_t *pData_tx, uint16_t Size_tx, uint8_t *pData_rx, uint16_t Size_rx);
|
|
static bool I2C_RegisterWrite(uint8_t address, uint8_t reg, uint8_t data);
|
|
static uint8_t I2C_RegisterRead(uint8_t address, uint8_t reg);
|
|
|
|
typedef struct {
|
|
const uint8_t reg; // The register to write to
|
|
uint8_t val; // The value to write to this register
|
|
const uint8_t pause_ms; // How many ms to pause _after_ writing this reg
|
|
} I2C_REG;
|
|
static bool writeRegistersBulk(const uint8_t address, const I2C_REG *registers, const uint8_t registersLength);
|
|
|
|
private:
|
|
static void unlock();
|
|
static bool lock();
|
|
static void I2C_Unstick();
|
|
static SemaphoreHandle_t I2CSemaphore;
|
|
static StaticSemaphore_t xSemaphoreBuffer;
|
|
};
|
|
|
|
#endif /* FRTOSI2C_HPP_ */
|