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

164 lines
4.8 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.

/*
* PackagerADS1259.h
*
* Created on: 7 авг. 2019 г.
* Author: user
*/
#ifndef SOURCE_DRIVER_CHIPSET_PACKAGERADS1259_H_
#define SOURCE_DRIVER_CHIPSET_PACKAGERADS1259_H_
#include <cstddef>
#include <stdint.h>
namespace driver { namespace chipset {
struct PackagerADS1259 {
typedef uint16_t Data; //!<Тип данных используемых пользователем для хранения полезной информации.
typedef uint32_t Frame; //!<Тип данных отправляемый и получаемый по линии связи.
static const std::size_t FrameSize; //!<Фиксированный размер кадра передаваемого по линии связи.
typedef uint16_t RegAddress; //!<Тип адреса регистра в устройстве.
static Frame encode( RegAddress rg_address, Data data, bool write_nread );
static Frame encode( RegAddress control_reg );
static Data decode( Frame frame );
struct Packager {
typedef PackagerADS1259::Frame Frame;
typedef PackagerADS1259::Data Data;
RegAddress rg_address;
bool write_nread;
Frame pack( Data ) const;
Data unpack( Frame ) const;
};
struct CommandPackager {
typedef PackagerADS1259::Frame Frame;
typedef PackagerADS1259::Data Data;
Frame pack( Data ) const;
Data unpack( Frame ) const;
};
struct AdcResultPackager {
static const uint32_t read_adc_command = 0x12 << 8;
typedef uint32_t Frame;
typedef uint32_t Data;
Frame pack( Data ) const;
Data unpack( Frame ) const;
};
struct AdcContModePackager {
typedef uint32_t Frame;
typedef uint32_t Data;
static Frame encode() { return 0xFFFFFFFFul; }
static Data decode(Frame frame) { return (frame >> 16ul) | (frame << 16ul); }
struct RdataCrc {
uint32_t adc_result : 24;
uint32_t crc : 8;
static RdataCrc createRdataCrc(uint32_t data) { return { .adc_result = data >> 8, .crc = data & 0xFF }; }
static uint16_t calcCrc(uint32_t data) { return ( (data >> 8) + (data >> 16) + data + 0x9B ) & 0xFF; }
static bool checkCrc(const RdataCrc & rdata) { return rdata.crc == calcCrc(rdata.adc_result); }
};
};
private:
static const uint16_t READ_OP_CODE = 0x02;
static const uint16_t WRITE_OP_CODE = 0x04;
//!Структура адресного заголовка фрейма.
struct AddressingRegisterForm {
uint16_t NUM_REG_TO_READ : 8;
uint16_t REGISTER_ADDRESS : 4;
uint16_t READ_WRITE_OP : 4;
AddressingRegisterForm(uint16_t reg_addr, bool write_nread) :
REGISTER_ADDRESS(reg_addr),
READ_WRITE_OP(write_nread ? WRITE_OP_CODE : READ_OP_CODE),
NUM_REG_TO_READ(0) {}
};
//!Структура компановки адресного заголовка и СЛОВА данных.
struct RegisterAddressAndData {
AddressingRegisterForm address;
Data data;
RegisterAddressAndData(uint16_t reg_addr, bool write_nread, Data data) :
address(reg_addr, write_nread),
data(data << 8) {}
};
struct CommandRegisterForm {
uint16_t c1 : 8;
uint16_t command : 8;
uint16_t c2 : 16;
CommandRegisterForm(uint16_t command) : command(command), c1(0), c2(0) {}
};
};
} /* namespace chipset */
} /* namespace driver */
inline driver::chipset::PackagerADS1259::Packager::Frame driver::chipset::PackagerADS1259::Packager::pack(
Data data ) const {
return encode( rg_address, data, write_nread );
}
inline driver::chipset::PackagerADS1259::Packager::Data driver::chipset::PackagerADS1259::Packager::unpack(
Frame frame ) const {
return decode( frame );
}
inline driver::chipset::PackagerADS1259::CommandPackager::Frame driver::chipset::PackagerADS1259::CommandPackager::pack(
Data data) const {
return encode( data );
}
inline driver::chipset::PackagerADS1259::CommandPackager::Data driver::chipset::PackagerADS1259::CommandPackager::unpack(
Frame frame) const {
return 0;
}
inline driver::chipset::PackagerADS1259::AdcResultPackager::Frame driver::chipset::PackagerADS1259::AdcResultPackager::pack(
Data data) const {
return read_adc_command;
}
inline driver::chipset::PackagerADS1259::AdcResultPackager::Data driver::chipset::PackagerADS1259::AdcResultPackager::unpack(
Frame frame) const {
return ((frame >> 16ul) | (frame << 16ul)) & 0xFFFFFFul;
}
#endif /* SOURCE_DRIVER_CHIPSET_PACKAGERADS1259_H_ */