Example how to use DS28EC20 EEPROM with MaximInterface over GPIO

Dependencies:   MaximInterface_Extended

main.cpp

Committer:
reARMnimator
Date:
2020-01-06
Revision:
1:62acf2e0179a
Parent:
0:476a6e04dc69

File content as of revision 1:62acf2e0179a:

#include "mbed.h"
#include "MaximInterface/Links/RomCommands.hpp"
#include "Platforms/mbed/TARGET_STM32/GpioOneWireMaster.hpp"
#include "MaximInterface/Devices/DS28EC20.hpp"

DigitalOut myled(LED1);
#define CONFIG_OW_PIN_NAME  PinName::PA_1

class Sleep : public MaximInterface::Sleep
{
public:
    virtual void invoke (int ms) const
    {
        uint32_t ticks = (ms * 1000u) / osKernelGetTickFreq();
        osDelay(ticks);
        return;
    }

    virtual ~Sleep(void)
    {
        return;
    };
};

static Sleep sleepObj;

class SelectOverdriveSkipRom
{
public:
    typedef MaximInterface::SelectRom::argument_type argument_type;
    typedef MaximInterface::SelectRom::result_type result_type;

    explicit SelectOverdriveSkipRom(MaximInterface::RomId::const_span romId)
    {
        setRomId(romId);
    }

    MaximInterface::RomId::const_span romId() const
    {
        return romId_;
    }

    void setRomId(MaximInterface::RomId::const_span romId)
    {
        MaximInterface::copy(romId, MaximInterface::make_span(romId_));
    }

    MaximInterface_EXPORT MaximInterface::error_code operator()(MaximInterface::OneWireMaster & master) const
    {
#if 0
        return MaximInterface::skipRom(master);
#else
        return MaximInterface::overdriveSkipRom(master);
#endif
    }

private:
    MaximInterface::RomId::array romId_;
};



int main()
{
    MaximInterface::GpioOneWireMaster *p_GPIO_OW_Master = new (std::nothrow) MaximInterface::GpioOneWireMaster(CONFIG_OW_PIN_NAME);
    MaximInterface::OneWireMaster &OW_Master(*p_GPIO_OW_Master);
    MaximInterface::error_code err = p_GPIO_OW_Master->initialize();

    MaximInterface::SearchRomState State;

    /* ... Fallback to standard speed after ID-chip has been powered off */
    OW_Master.setSpeed(MaximInterface::OneWireMaster::StandardSpeed);

    err = MaximInterface::searchRom(OW_Master, State);

    if (!err) {
        if (familyCode(State.romId) == MaximInterface::DS28EC20::familyCode) {
            /* ... wait for 50 ms */
            uint32_t Ticks = (50u * 1000u) / osKernelGetTickFreq();
            osDelay(Ticks);

            SelectOverdriveSkipRom RomSelectorObject(State.romId);

            MaximInterface::DS28EC20 *p_EEPROM = new (std::nothrow) MaximInterface::DS28EC20(sleepObj, OW_Master, MaximInterface::SelectRom(RomSelectorObject), RomSelectorObject.romId());

            if (NULL != p_EEPROM) {
                size_t Size = MaximInterface::DS28EC20::memoryPages * MaximInterface::DS28EC20::pageSizeBytes;
                MaximInterface::DS28EC20::Address Addr = static_cast<MaximInterface::DS28EC20::Address>(0);
                size_t ActualLength = 32u;
                uint8_t Buffer[32u] = {0};
                err = p_EEPROM->readMemoryExt(Addr, &Buffer[0], ActualLength);
                err = MaximInterface::writeMemory(*p_EEPROM, Addr, &Buffer[0], ActualLength);
            }
        }
    }


    while(1) {
        myled = 1;
        wait_us(2000);
        myled = 0;
        wait_us(2000);
    }
}