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.
OneWire_Masters/DS2465/DS2465.hpp@21:00c94aeb533e, 2016-03-21 (annotated)
- Committer:
- IanBenzMaxim
- Date:
- Mon Mar 21 14:12:28 2016 -0500
- Revision:
- 21:00c94aeb533e
- Child:
- 24:8942d8478d68
Added class for DS2465. Added a ReadBytePower operation to OneWireMaster since this is required by the authenticators including the DS28E15. Tweaked member data of OneWireMaster. Added path to header file includes to reduce compiler setup required.
Who changed what in which revision?
User | Revision | Line number | New 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 "mbed.h" |
IanBenzMaxim | 21:00c94aeb533e | 5 | #include "OneWire_Masters/OneWireMaster.h" |
IanBenzMaxim | 21:00c94aeb533e | 6 | #include "OneWire_Masters/ISha256MacCoprocessor.hpp" |
IanBenzMaxim | 21:00c94aeb533e | 7 | |
IanBenzMaxim | 21:00c94aeb533e | 8 | class DS2465 : public OneWireMaster, public ISha256MacCoprocessor |
IanBenzMaxim | 21:00c94aeb533e | 9 | { |
IanBenzMaxim | 21:00c94aeb533e | 10 | public: |
IanBenzMaxim | 21:00c94aeb533e | 11 | enum Direction |
IanBenzMaxim | 21:00c94aeb533e | 12 | { |
IanBenzMaxim | 21:00c94aeb533e | 13 | DIRECTION_WRITE_ZERO = 0, |
IanBenzMaxim | 21:00c94aeb533e | 14 | DIRECTION_WRITE_ONE = 1 |
IanBenzMaxim | 21:00c94aeb533e | 15 | }; |
IanBenzMaxim | 21:00c94aeb533e | 16 | |
IanBenzMaxim | 21:00c94aeb533e | 17 | enum PageRegion |
IanBenzMaxim | 21:00c94aeb533e | 18 | { |
IanBenzMaxim | 21:00c94aeb533e | 19 | REGION_FULL_PAGE = 0x03, |
IanBenzMaxim | 21:00c94aeb533e | 20 | REGION_FIRST_HALF = 0x01, |
IanBenzMaxim | 21:00c94aeb533e | 21 | REGION_SECOND_HALF = 0x02 |
IanBenzMaxim | 21:00c94aeb533e | 22 | }; |
IanBenzMaxim | 21:00c94aeb533e | 23 | |
IanBenzMaxim | 21:00c94aeb533e | 24 | enum OWConfigAddr |
IanBenzMaxim | 21:00c94aeb533e | 25 | { |
IanBenzMaxim | 21:00c94aeb533e | 26 | ADDR_TRSTL_REG = 0x68, |
IanBenzMaxim | 21:00c94aeb533e | 27 | ADDR_TMSP_REG = 0x69, |
IanBenzMaxim | 21:00c94aeb533e | 28 | ADDR_TW0L_REG = 0x6A, |
IanBenzMaxim | 21:00c94aeb533e | 29 | ADDR_TREC0_REG = 0x6B, |
IanBenzMaxim | 21:00c94aeb533e | 30 | ADDR_RWPU_REG = 0x6C, |
IanBenzMaxim | 21:00c94aeb533e | 31 | ADDR_TW1L_REG = 0x6D |
IanBenzMaxim | 21:00c94aeb533e | 32 | }; |
IanBenzMaxim | 21:00c94aeb533e | 33 | |
IanBenzMaxim | 21:00c94aeb533e | 34 | // DS2465 addresses |
IanBenzMaxim | 21:00c94aeb533e | 35 | enum MemoryAddr |
IanBenzMaxim | 21:00c94aeb533e | 36 | { |
IanBenzMaxim | 21:00c94aeb533e | 37 | ADDR_SPAD = 0x00, |
IanBenzMaxim | 21:00c94aeb533e | 38 | ADDR_CMD_REG = 0x60, |
IanBenzMaxim | 21:00c94aeb533e | 39 | ADDR_STATUS_REG = 0x61, |
IanBenzMaxim | 21:00c94aeb533e | 40 | ADDR_DATA_REG = 0x62, |
IanBenzMaxim | 21:00c94aeb533e | 41 | ADDR_MAC_READ = 0x63, |
IanBenzMaxim | 21:00c94aeb533e | 42 | ADDR_SHA_SELECT_REG = 0x66, |
IanBenzMaxim | 21:00c94aeb533e | 43 | ADDR_WCFG_REG = 0x67, |
IanBenzMaxim | 21:00c94aeb533e | 44 | ADDR_USER_MEM_PAGE_0 = 0x80, |
IanBenzMaxim | 21:00c94aeb533e | 45 | ADDR_USER_MEM_PAGE_1 = 0xA0 |
IanBenzMaxim | 21:00c94aeb533e | 46 | }; |
IanBenzMaxim | 21:00c94aeb533e | 47 | |
IanBenzMaxim | 21:00c94aeb533e | 48 | DS2465(I2C & I2C_interface, std::uint8_t I2C_address); |
IanBenzMaxim | 21:00c94aeb533e | 49 | |
IanBenzMaxim | 21:00c94aeb533e | 50 | // Const member functions should not change the settings of the DS2465 or affect the state of the 1-Wire bus. |
IanBenzMaxim | 21:00c94aeb533e | 51 | // Read pointer, scratchpad, MAC output register, and command register on the DS2465 are considered mutable. |
IanBenzMaxim | 21:00c94aeb533e | 52 | |
IanBenzMaxim | 21:00c94aeb533e | 53 | //Misc. Functions |
IanBenzMaxim | 21:00c94aeb533e | 54 | OneWireMaster::CmdResult Detect(void); |
IanBenzMaxim | 21:00c94aeb533e | 55 | OneWireMaster::CmdResult Reset(void); // Resets DS2465 (NOTE: This is NOT a 1-Wire Reset) |
IanBenzMaxim | 21:00c94aeb533e | 56 | |
IanBenzMaxim | 21:00c94aeb533e | 57 | // DS2465 Memory Commands |
IanBenzMaxim | 21:00c94aeb533e | 58 | OneWireMaster::CmdResult ReadMemory(std::uint8_t addr, std::uint8_t * buf, size_t bufLen, bool skip_set_pointer = false) const; |
IanBenzMaxim | 21:00c94aeb533e | 59 | OneWireMaster::CmdResult WriteScratchpad(std::uint8_t addr, const std::uint8_t * buf, size_t bufLen) const; |
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 | // DS2465 Configuration Commands |
IanBenzMaxim | 21:00c94aeb533e | 63 | OneWireMaster::CmdResult ReadOneWireConfig(OWConfigAddr addr, std::uint8_t & config) const; |
IanBenzMaxim | 21:00c94aeb533e | 64 | OneWireMaster::CmdResult WriteOneWireConfig(OWConfigAddr addr, unsigned int ovr, unsigned int std); |
IanBenzMaxim | 21:00c94aeb533e | 65 | |
IanBenzMaxim | 21:00c94aeb533e | 66 | // 1-Wire Master Commands |
IanBenzMaxim | 21:00c94aeb533e | 67 | virtual OneWireMaster::CmdResult OWInitMaster(void); |
IanBenzMaxim | 21:00c94aeb533e | 68 | virtual OneWireMaster::CmdResult OWReset(void); // Issues a 1-Wire Reset Pulse |
IanBenzMaxim | 21:00c94aeb533e | 69 | virtual OneWireMaster::CmdResult OWWriteByte(uint8_t sendbyte); |
IanBenzMaxim | 21:00c94aeb533e | 70 | virtual OneWireMaster::CmdResult OWReadByte(uint8_t & recvbyte); |
IanBenzMaxim | 21:00c94aeb533e | 71 | virtual OneWireMaster::CmdResult OWTouchByte(uint8_t & sendrecvbyte); |
IanBenzMaxim | 21:00c94aeb533e | 72 | virtual OneWireMaster::CmdResult OWTouchBit(uint8_t & sendrecvbit); |
IanBenzMaxim | 21:00c94aeb533e | 73 | virtual OneWireMaster::CmdResult OWWriteBit(uint8_t sendbit); |
IanBenzMaxim | 21:00c94aeb533e | 74 | virtual OneWireMaster::CmdResult OWReadBit(uint8_t & recvbit); |
IanBenzMaxim | 21:00c94aeb533e | 75 | virtual OneWireMaster::CmdResult OWBlock(uint8_t *tran_buf, uint8_t tran_len); |
IanBenzMaxim | 21:00c94aeb533e | 76 | virtual OneWireMaster::CmdResult OWFirst(RomId & romId); |
IanBenzMaxim | 21:00c94aeb533e | 77 | virtual OneWireMaster::CmdResult OWNext(RomId & romId); |
IanBenzMaxim | 21:00c94aeb533e | 78 | virtual OneWireMaster::CmdResult OWVerify(const RomId & romId); |
IanBenzMaxim | 21:00c94aeb533e | 79 | virtual void OWTargetSetup(RomId & romId); |
IanBenzMaxim | 21:00c94aeb533e | 80 | virtual void OWFamilySkipSetup(void); |
IanBenzMaxim | 21:00c94aeb533e | 81 | virtual OneWireMaster::CmdResult OWSearch(RomId & romId); |
IanBenzMaxim | 21:00c94aeb533e | 82 | virtual OneWireMaster::CmdResult OWReadROM(RomId & romId); |
IanBenzMaxim | 21:00c94aeb533e | 83 | virtual OneWireMaster::CmdResult OWSkipROM(void); |
IanBenzMaxim | 21:00c94aeb533e | 84 | virtual OneWireMaster::CmdResult OWMatchROM(const RomId & romId); |
IanBenzMaxim | 21:00c94aeb533e | 85 | virtual OneWireMaster::CmdResult OWOverdriveSkipROM(void); |
IanBenzMaxim | 21:00c94aeb533e | 86 | virtual OneWireMaster::CmdResult OWResume(void); |
IanBenzMaxim | 21:00c94aeb533e | 87 | virtual OneWireMaster::CmdResult OWOverdriveMatchROM(const RomId & romId); |
IanBenzMaxim | 21:00c94aeb533e | 88 | |
IanBenzMaxim | 21:00c94aeb533e | 89 | // Extended 1-Wire functions |
IanBenzMaxim | 21:00c94aeb533e | 90 | virtual OneWireMaster::CmdResult OWSpeed(OW_SPEED new_speed); |
IanBenzMaxim | 21:00c94aeb533e | 91 | virtual OneWireMaster::CmdResult OWLevel(OW_LEVEL new_level); |
IanBenzMaxim | 21:00c94aeb533e | 92 | virtual OneWireMaster::CmdResult OWWriteBytePower(uint8_t sendbyte); |
IanBenzMaxim | 21:00c94aeb533e | 93 | virtual OneWireMaster::CmdResult OWReadBytePower(uint8_t & recvbyte); |
IanBenzMaxim | 21:00c94aeb533e | 94 | virtual OneWireMaster::CmdResult OWReadBitPower(uint8_t applyPowerResponse); |
IanBenzMaxim | 21:00c94aeb533e | 95 | virtual OneWireMaster::CmdResult OWWriteBlock(const uint8_t *tran_buf, uint8_t tran_len); |
IanBenzMaxim | 21:00c94aeb533e | 96 | OneWireMaster::CmdResult OWWriteBlock(bool tx_mac, const uint8_t *tran_buf, uint8_t tran_len); |
IanBenzMaxim | 21:00c94aeb533e | 97 | virtual OneWireMaster::CmdResult OWReadBlock(uint8_t *rx_buf, uint8_t rx_len); |
IanBenzMaxim | 21:00c94aeb533e | 98 | OneWireMaster::CmdResult OWPowerDown(void); |
IanBenzMaxim | 21:00c94aeb533e | 99 | OneWireMaster::CmdResult OWPowerUp(void); |
IanBenzMaxim | 21:00c94aeb533e | 100 | OneWireMaster::CmdResult ConfigureAPU(bool apu_enable); |
IanBenzMaxim | 21:00c94aeb533e | 101 | |
IanBenzMaxim | 21:00c94aeb533e | 102 | OneWireMaster::CmdResult Triplet(Direction search_direction, uint8_t & status); |
IanBenzMaxim | 21:00c94aeb533e | 103 | |
IanBenzMaxim | 21:00c94aeb533e | 104 | //DS2465 Coprocessor Commands |
IanBenzMaxim | 21:00c94aeb533e | 105 | OneWireMaster::CmdResult Compute_NextMasterSecret(bool swap, unsigned int pageNum, PageRegion region); |
IanBenzMaxim | 21:00c94aeb533e | 106 | OneWireMaster::CmdResult Compute_WriteMAC(bool regwrite, bool swap, unsigned int pageNum, unsigned int segmentNum) const; |
IanBenzMaxim | 21:00c94aeb533e | 107 | OneWireMaster::CmdResult Compute_SSecret(bool swap, unsigned int pageNum, PageRegion region); |
IanBenzMaxim | 21:00c94aeb533e | 108 | OneWireMaster::CmdResult Compute_AuthMAC(bool swap, unsigned int pageNum, PageRegion region) const; |
IanBenzMaxim | 21:00c94aeb533e | 109 | |
IanBenzMaxim | 21:00c94aeb533e | 110 | virtual ISha256MacCoprocessor::CmdResult setMasterSecret(const std::uint8_t (&secret)[ISha256MacCoprocessor::secret_len]); |
IanBenzMaxim | 21:00c94aeb533e | 111 | virtual ISha256MacCoprocessor::CmdResult ComputeAndRead_WriteMAC(const std::uint8_t (&WriteMAC_data)[WriteMAC_data_len], std::uint8_t (&mac)[mac_len]) const; |
IanBenzMaxim | 21:00c94aeb533e | 112 | virtual ISha256MacCoprocessor::CmdResult ComputeAndRead_AuthMAC(const std::uint8_t (&devicePage)[devicePage_len], const std::uint8_t (&challenge)[deviceScratchpad_len], |
IanBenzMaxim | 21:00c94aeb533e | 113 | const std::uint8_t (&AuthMAC_data)[AuthMAC_data_len], std::uint8_t (&mac)[mac_len]) const; |
IanBenzMaxim | 21:00c94aeb533e | 114 | virtual ISha256MacCoprocessor::CmdResult Compute_SSecret(const std::uint8_t (&devicePage)[devicePage_len], |
IanBenzMaxim | 21:00c94aeb533e | 115 | const std::uint8_t (&deviceScratchpad)[deviceScratchpad_len], const std::uint8_t (&SSecret_data)[SSecret_data_len]); |
IanBenzMaxim | 21:00c94aeb533e | 116 | |
IanBenzMaxim | 21:00c94aeb533e | 117 | private: |
IanBenzMaxim | 21:00c94aeb533e | 118 | static const int POLL_LIMIT = 200; |
IanBenzMaxim | 21:00c94aeb533e | 119 | |
IanBenzMaxim | 21:00c94aeb533e | 120 | I2C & m_I2C_interface; |
IanBenzMaxim | 21:00c94aeb533e | 121 | std::uint8_t m_I2C_address; |
IanBenzMaxim | 21:00c94aeb533e | 122 | |
IanBenzMaxim | 21:00c94aeb533e | 123 | std::uint8_t c1WS, cSPU, cPDN, cAPU; |
IanBenzMaxim | 21:00c94aeb533e | 124 | bool short_detected; |
IanBenzMaxim | 21:00c94aeb533e | 125 | |
IanBenzMaxim | 21:00c94aeb533e | 126 | // Search state |
IanBenzMaxim | 21:00c94aeb533e | 127 | std::uint8_t m_lastDiscrepancy; |
IanBenzMaxim | 21:00c94aeb533e | 128 | std::uint8_t m_lastFamilyDiscrepancy; |
IanBenzMaxim | 21:00c94aeb533e | 129 | std::uint8_t m_lastDeviceFlag; |
IanBenzMaxim | 21:00c94aeb533e | 130 | |
IanBenzMaxim | 21:00c94aeb533e | 131 | //DS2465 Configuration Commands |
IanBenzMaxim | 21:00c94aeb533e | 132 | OneWireMaster::CmdResult Write_Config(uint8_t config); |
IanBenzMaxim | 21:00c94aeb533e | 133 | OneWireMaster::CmdResult Write_Command_Reg(uint8_t cmd, uint8_t par, bool poll) const; |
IanBenzMaxim | 21:00c94aeb533e | 134 | }; |
IanBenzMaxim | 21:00c94aeb533e | 135 | |
IanBenzMaxim | 21:00c94aeb533e | 136 | #endif |