106 lines
5.0 KiB
C++
106 lines
5.0 KiB
C++
|
|
/*
|
|||
|
|
* 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_ */
|