// Maxim/Dallas 1-Wire EPROM & EEPROM library for Arduino // Copyright (C) 2011-2014 Eric Hokanson // https://github.com/pceric // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. /** @mainpage Quick Start Guide * * @section req_sec Requirements * Arduino v1.0.0+ and OneWire Library v2.2 * * @section install_sec Installation * Extract the DallasEPROM directory into the arduino/libraries directory. * * @section usage_sec Usage * Click here to see a * simple example of how to use this library. * * You can also find this example by selecting File->Examples->DallasEPROM * from the Arduino software menu. */ #ifndef DallasEPROM_h #define DallasEPROM_h #define DALLASEPROMVERSION "1.2.0" #include #include // OneWire commands #define READSTATUS 0xAA // Read the status fields [EPROM] or the Scratchpad [EEPROM] #define WRITESTATUS 0x55 // Write to the status fields [EPROM] or commit Scratchpad [EEPROM] #define READMEMORY 0xF0 // Read memory #define READMEMORYCRC 0xC3 // Read memory w CRC #define WRITEMEMORY 0x0F // Write to EPROM or the Scratchpad /** * @defgroup ERROR_GROUP Returned Error Codes * * @{ */ #define CRC_MISMATCH -1 //!< CRC mismatch #define INVALID_PAGE -2 //!< Requested page is invalid #define PAGE_LOCKED -3 //!< Page is currently locked #define BAD_INTEGRITY -4 //!< Failed scratchpad integrity check #define COPY_FAILURE -5 //!< Copy scratchpad to memory has failed #define UNSUPPORTED_DEVICE -64 //!< Chip is unsupported #define DEVICE_DISCONNECTED -127 //!< Device has disconnected /** @} */ /** * Stores our supported chip types. * * @param id 1 byte chip id. * @param name Name/model number of chip. * @param pages Total number of 32 byte pages supported by chip. * @param isEPROM Is this device an EPROM and not an EEPROM. */ typedef struct { const uint8_t id; const char* name; const int pages; const bool isEPROM; } model_type; /** * A class that reads and writes to Dallas/Maxim EPROM and EEPROM devices. * * @author Eric Hokanson */ class DallasEPROM { public: /** * Creates a new DallasEPROM instance using the first EPROM/EEPROM * device found on the bus. * * @param rWire Reference to a OneWire v2.2 instance. */ DallasEPROM(OneWire* rWire); /** * Creates a new DallasEPROM instance using the first EPROM/EEPROM * device found on the bus. In addition it will trigger a 500us * pulse on the provided Arduino pin for EPROM programming. * * @param rWire Reference to a OneWire v2.2 instance. * @param progPin Arduino pin number to pulse if writing EPROMs */ DallasEPROM(OneWire* rWire, int progPin); /** * Static helper function to check if an address has a valid checksum. * * @param pAddress Pointer to an 8 byte 1-Wire address. * @return True if the address has a valid checksum. */ static bool validAddress(uint8_t* pAddress); /** * Static helper function to check if the supplied address is from * a chip that the library supports. * * @param pAddress Pointer to an 8 byte 1-Wire address. * @return True if the chip is supported. */ static bool isSupported(uint8_t* pAddress); /** * Finds the first supported device on the bus and returns true on success */ bool search(); /** * Gets the device address of the current instance. * * @return Pointer to the currently configured address. */ uint8_t* getAddress(); /** * Sets the address of the current instance. * * @param pAddress Pointer to an 8 byte 1-Wire address. */ void setAddress(uint8_t* pAddress); /** * Gets the device name based on the current address. * * @return Pointer to the current device string. */ const char* getDeviceName(); /** * Scans the bus and checks if the device is still connected. * * @return True if the device is still connected. */ bool isConnected(); /** * Reads a page from the device's memory. * * @param pData Pointer to a 32 byte buffer to store the data. * @param page Page number to read (0-indexed). * @return 0 on success or @ref ERROR_GROUP. */ int readPage(uint8_t* pData, int page); /** * Writes a page to the device's memory. * * @param pData Pointer to a 32 byte buffer containing the data to store. * @param page Page number to write (0-indexed). * @return 0 on success or @ref ERROR_GROUP. */ int writePage(uint8_t* pData, int page); /** * Lock a page and prevent further writes. * * @param page Page to lock (0-indexed). * @return 0 on success or @ref ERROR_GROUP. */ int lockPage(int page); /** * Checks to see if a page is locked. * * @param page Page to lock (0-indexed). * @return True if locked. */ bool isPageLocked(int page); private: OneWire* _wire; // Pointer to OneWire v2.2 instance uint8_t _addr[8]; // 1-Wire address of memory device stored LSB first int _progPin; // Arduino pin number to pulse when programming EPROMs char _curModelIndex; // Currently selected device from device table /** * EEPROMs must use a scratch space to write data */ int scratchWrite(uint8_t* pdata, int length, unsigned int address); /** * Checks to see if the provided page is valid. */ bool isPageValid(int page); /** * Returns true if the current device is an EPROM and not an EEPROM. */ bool isEPROMDevice(); }; #endif /** @file */