sitara_depot/components/free_rtos/ethernet_industry/eth_ecat_eeprom.hpp
algin ae3cac8a7d feat: First commit
Adds sitara_depot/free_rtos

Original one is on server_gorbunov/SmartForce4.0/sitara_depot
2023-05-03 14:01:32 +03:00

83 lines
2.5 KiB
C++

/*
* 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 <ethernet_industry/eth_ecat_datagram.hpp>
namespace free_rtos {
namespace eeprom {
class EEPROM {
public:
EEPROM(datagram::EcatTelegram& telegram)
: telegram_{telegram} { }
template<typename TypeT>
void wait_busy(typename TypeT::TSlaveAddress& slave_address) {
using TCommand = command::EcatCommand<TypeT, command::RD>;
volatile uint16_t stat;
datagram::EcatDatagram<TCommand, volatile uint16_t> datagram{ {{slave_address, ECT_REG_EEPSTAT}}, stat };
do {
telegram_.transfer(datagram);
}while((stat & EC_ESTAT_BUSY) != 0);
}
template<typename TypeT, typename DirT>
void control_register(typename TypeT::TSlaveAddress& slave_address, ec_ecmdtype eeprom_cmd, uint16_t eeprom_address) {
using TCommand = command::EcatCommand<TypeT, DirT>;
std::array<uint16_t, 2> request{eeprom_cmd, eeprom_address};
datagram::EcatDatagram<TCommand, std::array<uint16_t, 2>> datagram{ {{slave_address, ECT_REG_EEPCTL}}, request };
telegram_.transfer(datagram);
}
template<typename TypeT, typename DirT, typename EcatDgDataT>
void data_register(typename TypeT::TSlaveAddress& slave_address, EcatDgDataT& data) {
using TCommand = command::EcatCommand<TypeT, DirT>;
datagram::EcatDatagram<TCommand, EcatDgDataT> datagram{ {{slave_address, ECT_REG_EEPDAT}}, data };
telegram_.transfer(datagram);
}
template<typename TypeT, typename EcatDgDataT>
void read(typename TypeT::TSlaveAddress& slave_address, uint16_t eeprom_address, EcatDgDataT& data) {
wait_busy<TypeT>(slave_address);
control_register<TypeT, command::WR>(slave_address, EC_ECMD_READ, eeprom_address);
wait_busy<TypeT>(slave_address);
data_register<TypeT, command::RD, EcatDgDataT>(slave_address, data);
}
template<typename TypeT, typename EcatDgDataT>
void write(typename TypeT::TSlaveAddress& slave_address, uint16_t eeprom_address, EcatDgDataT& data) {
wait_busy<TypeT>(slave_address);
data_register<TypeT, command::WR, EcatDgDataT>(slave_address, data);
wait_busy<TypeT>(slave_address);
control_register<TypeT, command::WR>(slave_address, EC_ECMD_WRITE, eeprom_address);
}
private:
datagram::EcatTelegram& telegram_;
};
}
}
#endif /* FREE_RTOS_ETHERNET_INDUSTRY_ETH_ECAT_EEPROM_HPP_ */