MotorControlModuleSDFM_TMS3.../Projects/EFC_Communication/UMLibrary/driver/I2cEeprom24LCxxB.hh
2024-06-07 11:12:56 +03:00

106 lines
5.0 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* I2cEeprom24LCxxB.h
*
* Created on: 14 апр. 2018 г.
* Author: Pair programming
*/
#ifndef SOURCE_DRIVER_I2CEEPROM24LC64B_H_
#define SOURCE_DRIVER_I2CEEPROM24LC64B_H_
#include "../peripheral/IMemoryAccess.hh"
#include "../systemic/IProcess.hh"
#include "../peripheral/II2c.hh"
#include "IDiscreteOutput.hh"
#include "../systemic/Timer.hh"
namespace driver { namespace detail {
//!Драйвер для работы с eeprom 24LC64B или аналагом по шине i2c.
/*!Класс осуществляет чтение из энергонезависимой памяти, запись в энергонезависимую память.
* Не осуществляет проверку правильности записанных данных.
* Контролирует наличие и работоспособность микросхемы eeprom.
*/
class I2cEeprom24LCxxB : public peripheral::IMemoryAccess, public systemic::IProcess {
//!Класс заглушка для неиспользуемого вывода защиты записи.
static class DiscreteOutputDummy : public IDiscreteOutput {
void on() {}
void off() {}
bool isOn() const { return false; }
} write_protect;
public:
//!Структура описывает настройки для драйвера микросхемы EEPROM 24LC64B.
struct Setting {
uint16_t polling_time; //!<Максимальное время ожидания записи страницы, мс.
uint16_t size; //!<Размер памяти EEPROM 24LC64B.
uint16_t address; //!<Адрес на шине i2c.
uint32_t baud_rate; //!<Частота SCL сигнала, Гц.
uint16_t page_size; //!<Размер страницы данных в EEPROM.
};
//!Контруктор класса.
/*!w
* \param[in] bus Интерфейс доступа к периферие i2c.
* \param[in] config Структура настроек.
* \param[in] wp Дискретный выход защиты микросхемы от записи.
*/
I2cEeprom24LCxxB( peripheral::II2c & bus, const Setting & config, IDiscreteOutput & wp = write_protect );
void init(systemic::IProcessControl * pc, float Ts);
void process();
bool read( char * data, size_t startAddress, size_t size );
bool write( const char * data, size_t startAddress, size_t size );
bool isReadComplete() const override;
bool isWriteComplete() const override;
std::size_t getCapacity() const override;
//!Признак ошибки модуля.
bool isError() const;
private:
peripheral::II2c & i2c; //!<Интерфейс доступа к периферие i2c.
peripheral::II2c::IResult * result; //!<Указатель на интерфейс доступа к результатам транзакции i2c.
IDiscreteOutput & write_protected; //!<Защита микросхемы от записи.
systemic::IProcessControl * proc_ctrl; //!<Интерфейс управления процессом.
bool failed_request; //!<Признак необходимости запроса.
const uint16_t polling_time; //!<Максимальное время ожидания записи страницы, мс.
const uint16_t size; //!<Размер памяти EEPROM.
const uint16_t address; //!<Адрес на шине i2c.
const uint32_t baud_rate; //!<Частота SCL сигнала, Гц.
const uint16_t page_size; //!<Размер страницы данных в EEPROM.
systemic::Timer timer; //!<Таймер для контроля времени записи страници в EEPROM.
char page_buff[16]; //!<Буфер для записи в и чтения из EEPROM.
std::size_t index; //!<Текущий индкес.
std::size_t start_index; //!<Стартовый индекс.
std::size_t stop_index; //!<Крайний индекс.
std::size_t current_step; //!<Текущий шаг, байт.
static const unsigned int frame_step = 12; //!<Размер поля данных не включающий байт управления и двух байт адреса.
static const unsigned int address_bytes_count = 2; //!<Количество байт для хранения адреса на запись/чтение.
static const unsigned int bytes_in_char = 2; //<! Количество байт в char.
char * read_p; //!<Указатель на буфер для чтения данных.
const char * write_p; //!<Указатель на буфер для записи данных.
unsigned int error_counter; //!<Счетчик отказов.
static const unsigned int error_counter_failure = 16; //!<Количество ошибок для диагностического отказа.
};
}
}
#endif /* SOURCE_DRIVER_I2CEEPROM24LCXXB_H_ */