Fork to see if I can get working
Dependencies: BufferedSerial OneWire WinbondSPIFlash libxDot-dev-mbed5-deprecated
Fork of xDotBridge_update_test20180823 by
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 }
Generated on Fri Jul 15 2022 14:36:45 by 1.7.2