Fork to see if I can get working

Dependencies:   BufferedSerial OneWire WinbondSPIFlash libxDot-dev-mbed5-deprecated

Fork of xDotBridge_update_test20180823 by Matt Briggs

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers DS2408.cpp Source File

DS2408.cpp

00001 #include "DS2408.h"
00002 
00003 enum DS2408Cmd {
00004     registerReadCmd        = 0xF0,
00005     channelAccessReadCmd   = 0xF5,
00006     channelAccessWriteCmd  = 0x5A
00007 };
00008 
00009 DS2408::DS2408(OneWire *owMaster, uint8_t romAddr[8])
00010 {
00011     mMaster = owMaster;
00012     std::memcpy(mRomAddr, romAddr, sizeof(mRomAddr));
00013     disableTestMode();
00014 }
00015 
00016 CmdResult DS2408::registerReadReliable(uint8_t addr, uint8_t &val)
00017 {
00018     uint8_t result = 0;
00019     uint8_t result1 = 0xFF;
00020     uint8_t cmdResult;
00021     cmdResult = registerRead(addr, result);
00022     for (int i=0; i < DS2408_NRETRIES; i++) {
00023         cmdResult = registerRead(addr, result1);
00024         if (cmdResult != cmdSuccess) {
00025             continue;
00026         }
00027         // Check they match
00028         if (result == result1) {
00029             val = result;
00030             return cmdSuccess;
00031         }
00032         else {
00033             result = result1;
00034         }
00035     }
00036     return cmdTimeout;
00037 }
00038 
00039 CmdResult DS2408::registerRead(uint8_t addr, uint8_t &val)
00040 {
00041     uint8_t addrArray[] = {0x00, 0x00};
00042     addrArray[0] = addr;
00043     mMaster->reset();
00044     mMaster->select(mRomAddr);
00045     mMaster->write(registerReadCmd); // Read Register Command
00046     mMaster->write_bytes(addrArray, 2); // Write 2 byte addr
00047     val = mMaster->read();
00048 //    logDebug("Reg Value: %02x\n", result);
00049     return cmdSuccess;
00050 }
00051 
00052 CmdResult DS2408::pioLogicRead(uint8_t &val)
00053 {
00054     return registerRead(pioLogicStateReg, val);
00055 }
00056 
00057 CmdResult DS2408::pioLogicReliableRead(uint8_t &val)
00058 {
00059     return registerReadReliable(pioLogicStateReg, val);
00060 }
00061 
00062 CmdResult DS2408::pioLogicWrite(uint8_t val)
00063 {
00064     mMaster->reset();
00065     mMaster->select(mRomAddr);
00066     mMaster->write(channelAccessWriteCmd);
00067     mMaster->write(val);
00068     mMaster->write(~val);  // Need to write complement to ensure no bit errors
00069     uint8_t result = mMaster->read();
00070     if (result == 0xAA) {
00071         return cmdSuccess;
00072     }
00073     else {
00074         return cmdError;
00075     }
00076 }
00077 
00078 CmdResult DS2408::pioLogicReliableWrite(uint8_t val)
00079 {
00080     uint8_t result;
00081     for (int i=0; i < DS2408_NRETRIES; i++) {
00082         result = pioLogicWrite(val);
00083         if (result == cmdSuccess) {
00084             return cmdSuccess;
00085         }
00086     }
00087     return cmdTimeout;
00088 }
00089 
00090 CmdResult DS2408::disableTestMode()
00091 {
00092     mMaster->reset();
00093     mMaster->write(0x96);
00094 
00095     for (uint8_t i = 0; i < 8; i++) mMaster->write(mRomAddr[i]);
00096 
00097     mMaster->write(0x3C);
00098     mMaster->reset();
00099     return cmdSuccess;
00100 }