1-Wire® library for mbed. Complete 1-Wire library that supports our silicon masters along with a bit-bang master on the MAX32600MBED platform with one common interface for mbed. Slave support has also been included and more slaves will be added as time permits.

Dependents:   MAXREFDES131_Qt_Demo MAX32630FTHR_iButton_uSD_Logger MAX32630FTHR_DS18B20_uSD_Logger MAXREFDES130_131_Demo ... more

Superseded by MaximInterface.

Committer:
IanBenzMaxim
Date:
Fri Mar 25 11:11:59 2016 -0500
Revision:
27:d5aaefa252f1
Parent:
26:a361e3f42ba5
Child:
32:bce180b544ed
Do not reconfigure DS2465 if requested speed or level is already set. Use forward declarations to speed up compilation.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
IanBenzMaxim 21:00c94aeb533e 1 #ifndef DS2465_H
IanBenzMaxim 21:00c94aeb533e 2 #define DS2465_H
IanBenzMaxim 21:00c94aeb533e 3
IanBenzMaxim 21:00c94aeb533e 4 #include "OneWire_Masters/OneWireMaster.h"
IanBenzMaxim 21:00c94aeb533e 5 #include "OneWire_Masters/ISha256MacCoprocessor.hpp"
IanBenzMaxim 21:00c94aeb533e 6
IanBenzMaxim 27:d5aaefa252f1 7 namespace mbed
IanBenzMaxim 27:d5aaefa252f1 8 {
IanBenzMaxim 27:d5aaefa252f1 9 class I2C;
IanBenzMaxim 27:d5aaefa252f1 10 }
IanBenzMaxim 27:d5aaefa252f1 11
IanBenzMaxim 21:00c94aeb533e 12 class DS2465 : public OneWireMaster, public ISha256MacCoprocessor
IanBenzMaxim 21:00c94aeb533e 13 {
IanBenzMaxim 21:00c94aeb533e 14 public:
IanBenzMaxim 21:00c94aeb533e 15 enum Direction
IanBenzMaxim 21:00c94aeb533e 16 {
IanBenzMaxim 21:00c94aeb533e 17 DIRECTION_WRITE_ZERO = 0,
IanBenzMaxim 21:00c94aeb533e 18 DIRECTION_WRITE_ONE = 1
IanBenzMaxim 21:00c94aeb533e 19 };
IanBenzMaxim 21:00c94aeb533e 20
IanBenzMaxim 21:00c94aeb533e 21 enum PageRegion
IanBenzMaxim 21:00c94aeb533e 22 {
IanBenzMaxim 21:00c94aeb533e 23 REGION_FULL_PAGE = 0x03,
IanBenzMaxim 21:00c94aeb533e 24 REGION_FIRST_HALF = 0x01,
IanBenzMaxim 21:00c94aeb533e 25 REGION_SECOND_HALF = 0x02
IanBenzMaxim 21:00c94aeb533e 26 };
IanBenzMaxim 21:00c94aeb533e 27
IanBenzMaxim 21:00c94aeb533e 28 enum MemoryAddr
IanBenzMaxim 21:00c94aeb533e 29 {
IanBenzMaxim 21:00c94aeb533e 30 ADDR_SPAD = 0x00,
IanBenzMaxim 21:00c94aeb533e 31 ADDR_CMD_REG = 0x60,
IanBenzMaxim 21:00c94aeb533e 32 ADDR_STATUS_REG = 0x61,
IanBenzMaxim 21:00c94aeb533e 33 ADDR_DATA_REG = 0x62,
IanBenzMaxim 21:00c94aeb533e 34 ADDR_MAC_READ = 0x63,
IanBenzMaxim 21:00c94aeb533e 35 ADDR_SHA_SELECT_REG = 0x66,
IanBenzMaxim 21:00c94aeb533e 36 ADDR_WCFG_REG = 0x67,
IanBenzMaxim 24:8942d8478d68 37 ADDR_TRSTL_REG = 0x68,
IanBenzMaxim 24:8942d8478d68 38 ADDR_TMSP_REG = 0x69,
IanBenzMaxim 24:8942d8478d68 39 ADDR_TW0L_REG = 0x6A,
IanBenzMaxim 24:8942d8478d68 40 ADDR_TREC0_REG = 0x6B,
IanBenzMaxim 24:8942d8478d68 41 ADDR_RWPU_REG = 0x6C,
IanBenzMaxim 24:8942d8478d68 42 ADDR_TW1L_REG = 0x6D,
IanBenzMaxim 21:00c94aeb533e 43 ADDR_USER_MEM_PAGE_0 = 0x80,
IanBenzMaxim 21:00c94aeb533e 44 ADDR_USER_MEM_PAGE_1 = 0xA0
IanBenzMaxim 21:00c94aeb533e 45 };
IanBenzMaxim 21:00c94aeb533e 46
IanBenzMaxim 27:d5aaefa252f1 47 DS2465(mbed::I2C & I2C_interface, std::uint8_t I2C_address);
IanBenzMaxim 21:00c94aeb533e 48
IanBenzMaxim 21:00c94aeb533e 49 // Const member functions should not change the settings of the DS2465 or affect the state of the 1-Wire bus.
IanBenzMaxim 21:00c94aeb533e 50 // Read pointer, scratchpad, MAC output register, and command register on the DS2465 are considered mutable.
IanBenzMaxim 21:00c94aeb533e 51
IanBenzMaxim 21:00c94aeb533e 52 //Misc. Functions
IanBenzMaxim 21:00c94aeb533e 53 OneWireMaster::CmdResult Detect(void);
IanBenzMaxim 21:00c94aeb533e 54 OneWireMaster::CmdResult Reset(void); // Resets DS2465 (NOTE: This is NOT a 1-Wire Reset)
IanBenzMaxim 21:00c94aeb533e 55
IanBenzMaxim 21:00c94aeb533e 56 // DS2465 Memory Commands
IanBenzMaxim 27:d5aaefa252f1 57 OneWireMaster::CmdResult ReadMemory(std::uint8_t addr, std::uint8_t * buf, std::size_t bufLen, bool skip_set_pointer = false) const;
IanBenzMaxim 24:8942d8478d68 58 OneWireMaster::CmdResult WriteMemory(std::uint8_t addr, const std::uint8_t * buf, std::size_t bufLen) { return CWriteMemory(addr, buf, bufLen); }
IanBenzMaxim 24:8942d8478d68 59 OneWireMaster::CmdResult WriteScratchpad(const std::uint8_t * buf, std::size_t bufLen) const { return CWriteMemory(ADDR_SPAD, buf, bufLen); }
IanBenzMaxim 21:00c94aeb533e 60 OneWireMaster::CmdResult CopyScratchpad(bool dest_secret, unsigned int pageNum, bool notFull, unsigned int segmentNum);
IanBenzMaxim 21:00c94aeb533e 61
IanBenzMaxim 21:00c94aeb533e 62 // 1-Wire Master Commands
IanBenzMaxim 21:00c94aeb533e 63 virtual OneWireMaster::CmdResult OWInitMaster(void);
IanBenzMaxim 21:00c94aeb533e 64 virtual OneWireMaster::CmdResult OWReset(void); // Issues a 1-Wire Reset Pulse
IanBenzMaxim 27:d5aaefa252f1 65 virtual OneWireMaster::CmdResult OWTouchBit(std::uint8_t & sendrecvbit, OW_LEVEL after_level);
IanBenzMaxim 27:d5aaefa252f1 66 virtual OneWireMaster::CmdResult OWReadByte(std::uint8_t & recvbyte, OW_LEVEL after_level);
IanBenzMaxim 27:d5aaefa252f1 67 virtual OneWireMaster::CmdResult OWWriteByte(std::uint8_t sendbyte, OW_LEVEL after_level);
IanBenzMaxim 27:d5aaefa252f1 68 virtual OneWireMaster::CmdResult OWReadBlock(std::uint8_t *rx_buf, std::uint8_t rx_len);
IanBenzMaxim 27:d5aaefa252f1 69 virtual OneWireMaster::CmdResult OWWriteBlock(const std::uint8_t *tran_buf, std::uint8_t tran_len);
IanBenzMaxim 27:d5aaefa252f1 70 OneWireMaster::CmdResult OWWriteBlock(bool tx_mac, const std::uint8_t *tran_buf, std::uint8_t tran_len);
IanBenzMaxim 26:a361e3f42ba5 71 virtual OneWireMaster::CmdResult OWSpeed(OW_SPEED new_speed);
IanBenzMaxim 26:a361e3f42ba5 72 virtual OneWireMaster::CmdResult OWLevel(OW_LEVEL new_level);
IanBenzMaxim 26:a361e3f42ba5 73 virtual OneWireMaster::CmdResult OWSearch(RomId & romId);
IanBenzMaxim 24:8942d8478d68 74
IanBenzMaxim 26:a361e3f42ba5 75 OneWireMaster::CmdResult ConfigurePowerDown(bool pdn_enable);
IanBenzMaxim 26:a361e3f42ba5 76 OneWireMaster::CmdResult ConfigureAPU(bool apu_enable);
IanBenzMaxim 26:a361e3f42ba5 77 OneWireMaster::CmdResult ConfigureSPU(bool spu_enable);
IanBenzMaxim 27:d5aaefa252f1 78 OneWireMaster::CmdResult Triplet(Direction search_direction, std::uint8_t & status);
IanBenzMaxim 21:00c94aeb533e 79
IanBenzMaxim 21:00c94aeb533e 80 //DS2465 Coprocessor Commands
IanBenzMaxim 21:00c94aeb533e 81 OneWireMaster::CmdResult Compute_NextMasterSecret(bool swap, unsigned int pageNum, PageRegion region);
IanBenzMaxim 21:00c94aeb533e 82 OneWireMaster::CmdResult Compute_WriteMAC(bool regwrite, bool swap, unsigned int pageNum, unsigned int segmentNum) const;
IanBenzMaxim 21:00c94aeb533e 83 OneWireMaster::CmdResult Compute_SSecret(bool swap, unsigned int pageNum, PageRegion region);
IanBenzMaxim 21:00c94aeb533e 84 OneWireMaster::CmdResult Compute_AuthMAC(bool swap, unsigned int pageNum, PageRegion region) const;
IanBenzMaxim 21:00c94aeb533e 85
IanBenzMaxim 21:00c94aeb533e 86 virtual ISha256MacCoprocessor::CmdResult setMasterSecret(const std::uint8_t (&secret)[ISha256MacCoprocessor::secret_len]);
IanBenzMaxim 21:00c94aeb533e 87 virtual ISha256MacCoprocessor::CmdResult ComputeAndRead_WriteMAC(const std::uint8_t (&WriteMAC_data)[WriteMAC_data_len], std::uint8_t (&mac)[mac_len]) const;
IanBenzMaxim 21:00c94aeb533e 88 virtual ISha256MacCoprocessor::CmdResult ComputeAndRead_AuthMAC(const std::uint8_t (&devicePage)[devicePage_len], const std::uint8_t (&challenge)[deviceScratchpad_len],
IanBenzMaxim 21:00c94aeb533e 89 const std::uint8_t (&AuthMAC_data)[AuthMAC_data_len], std::uint8_t (&mac)[mac_len]) const;
IanBenzMaxim 21:00c94aeb533e 90 virtual ISha256MacCoprocessor::CmdResult Compute_SSecret(const std::uint8_t (&devicePage)[devicePage_len],
IanBenzMaxim 21:00c94aeb533e 91 const std::uint8_t (&deviceScratchpad)[deviceScratchpad_len], const std::uint8_t (&SSecret_data)[SSecret_data_len]);
IanBenzMaxim 21:00c94aeb533e 92
IanBenzMaxim 21:00c94aeb533e 93 private:
IanBenzMaxim 24:8942d8478d68 94 struct Config
IanBenzMaxim 24:8942d8478d68 95 {
IanBenzMaxim 24:8942d8478d68 96 bool c1WS, cSPU, cPDN, cAPU;
IanBenzMaxim 24:8942d8478d68 97
IanBenzMaxim 24:8942d8478d68 98 std::uint8_t readByte() const;
IanBenzMaxim 24:8942d8478d68 99 std::uint8_t writeByte() const;
IanBenzMaxim 24:8942d8478d68 100
IanBenzMaxim 24:8942d8478d68 101 void reset();
IanBenzMaxim 24:8942d8478d68 102 Config() { reset(); }
IanBenzMaxim 24:8942d8478d68 103 };
IanBenzMaxim 21:00c94aeb533e 104
IanBenzMaxim 27:d5aaefa252f1 105 mbed::I2C & m_I2C_interface;
IanBenzMaxim 21:00c94aeb533e 106 std::uint8_t m_I2C_address;
IanBenzMaxim 24:8942d8478d68 107 Config m_curConfig;
IanBenzMaxim 21:00c94aeb533e 108
IanBenzMaxim 24:8942d8478d68 109 OneWireMaster::CmdResult CWriteMemory(std::uint8_t addr, const std::uint8_t * buf, std::size_t bufLen) const;
IanBenzMaxim 24:8942d8478d68 110 OneWireMaster::CmdResult WriteConfig(const Config & config);
IanBenzMaxim 27:d5aaefa252f1 111 OneWireMaster::CmdResult PollBusy(std::uint8_t * pStatus = NULL);
IanBenzMaxim 21:00c94aeb533e 112 };
IanBenzMaxim 21:00c94aeb533e 113
IanBenzMaxim 21:00c94aeb533e 114 #endif