/* * eth_ecat_eeprom.hpp * * Created on: May 2, 2023 * Author: algin */ #ifndef FREE_RTOS_ETHERNET_INDUSTRY_ETH_ECAT_EEPROM_HPP_ #define FREE_RTOS_ETHERNET_INDUSTRY_ETH_ECAT_EEPROM_HPP_ #include namespace free_rtos { namespace eeprom { class EEPROM { public: EEPROM(datagram::EcatTelegram& telegram) : telegram_{telegram} { } template void wait_busy(typename TypeT::TSlaveAddress& slave_address) { using TCommand = command::EcatCommand; volatile uint16_t stat; datagram::EcatDatagram datagram{ {{slave_address, ECT_REG_EEPSTAT}}, stat }; do { telegram_.transfer(datagram); }while((stat & EC_ESTAT_BUSY) != 0); } template void control_register(typename TypeT::TSlaveAddress& slave_address, ec_ecmdtype eeprom_cmd, uint16_t eeprom_address) { using TCommand = command::EcatCommand; std::array request{eeprom_cmd, eeprom_address}; datagram::EcatDatagram> datagram{ {{slave_address, ECT_REG_EEPCTL}}, request }; telegram_.transfer(datagram); } template void data_register(typename TypeT::TSlaveAddress& slave_address, EcatDgDataT& data) { using TCommand = command::EcatCommand; datagram::EcatDatagram datagram{ {{slave_address, ECT_REG_EEPDAT}}, data }; telegram_.transfer(datagram); } template void read(typename TypeT::TSlaveAddress& slave_address, uint16_t eeprom_address, EcatDgDataT& data) { wait_busy(slave_address); control_register(slave_address, EC_ECMD_READ, eeprom_address); wait_busy(slave_address); data_register(slave_address, data); } template void write(typename TypeT::TSlaveAddress& slave_address, uint16_t eeprom_address, EcatDgDataT& data) { wait_busy(slave_address); data_register(slave_address, data); wait_busy(slave_address); control_register(slave_address, EC_ECMD_WRITE, eeprom_address); } private: datagram::EcatTelegram& telegram_; }; } } #endif /* FREE_RTOS_ETHERNET_INDUSTRY_ETH_ECAT_EEPROM_HPP_ */