Implementation of 1-Wire with added Alarm Search Functionality
Dependents: Max32630_One_Wire_Interface
OneWire_Masters/DS2465/DS2465.hpp@27:d5aaefa252f1, 2016-03-25 (annotated)
- 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?
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 "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 |