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