I2C hang recover function added
Dependencies: UniGraphic mbed vt100
In this version, check_i2c_pins function was added in edge_mgr.cpp.
プログラムの起動時、I2Cモジュールを初期化する前に、I2Cに使用するピンの電位を確認し
もし一方でも Low に張り付いていた場合、SCL を GPIO 出力に設定して
所定回数 (I2C_UNLOCK_TRIAL_CYCLE) 反転させることにより、疑似リセットクロックを生成します。
その後は、通常の起動手順に復帰し、以降はこれまでと同様の動作をします。
afLib/StatusCommand.cpp
- Committer:
- gaku_miyagawa
- Date:
- 2018-06-18
- Revision:
- 2:de22987be9ba
- Parent:
- 0:d895cd1cd897
File content as of revision 2:de22987be9ba:
/** * Copyright 2015 Afero, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "StatusCommand.h" #define SERIAL_PRINT_DBG_ASR_ON 0 StatusCommand::StatusCommand(uint16_t bytesToSend) { _cmd = 0x30; _bytesToSend = bytesToSend; _bytesToRecv = 0; } StatusCommand::StatusCommand() { _cmd = 0x30; _bytesToSend = 0; _bytesToRecv = 0; } StatusCommand::~StatusCommand() { } uint16_t StatusCommand::getSize() { return sizeof(_cmd) + sizeof(_bytesToSend) + sizeof(_bytesToRecv); } uint16_t StatusCommand::getBytes(int *bytes) { int index = 0; bytes[index++] = (_cmd); bytes[index++] = (_bytesToSend & 0xff); bytes[index++] = ((_bytesToSend >> 8) & 0xff); bytes[index++] = (_bytesToRecv & 0xff); bytes[index++] = ((_bytesToRecv >> 8) & 0xff); return index; } uint8_t StatusCommand::calcChecksum() { uint8_t result = 0; result += (_cmd); result += (_bytesToSend & 0xff); result += ((_bytesToSend >> 8) & 0xff); result += (_bytesToRecv & 0xff); result += ((_bytesToRecv >> 8) & 0xff); return result; } void StatusCommand::setChecksum(uint8_t checksum) { _checksum = checksum; } uint8_t StatusCommand::getChecksum() { uint8_t result = 0; result += (_cmd); result += (_bytesToSend & 0xff); result += ((_bytesToSend >> 8) & 0xff); result += (_bytesToRecv & 0xff); result += ((_bytesToRecv >> 8) & 0xff); return result; } void StatusCommand::setAck(bool ack) { _cmd = ack ? 0x31 : 0x30; } void StatusCommand::setBytesToSend(uint16_t bytesToSend) { _bytesToSend = bytesToSend; } uint16_t StatusCommand::getBytesToSend() { return _bytesToSend; } void StatusCommand::setBytesToRecv(uint16_t bytesToRecv) { _bytesToRecv = bytesToRecv; } uint16_t StatusCommand::getBytesToRecv() { return _bytesToRecv; } bool StatusCommand::equals(StatusCommand *statusCommand) { return (_cmd == statusCommand->_cmd && _bytesToSend == statusCommand->_bytesToSend && _bytesToRecv == statusCommand->_bytesToRecv); } bool StatusCommand::isValid() { return (_checksum == calcChecksum()) && (_cmd == 0x30 || _cmd == 0x31); } void StatusCommand::dumpBytes() { #if SERIAL_PRINT_DBG_ASR_ON int len = getSize(); int bytes[len]; getBytes(bytes); printf("len : %d\n",len); printf("data : "); for (int i = 0; i < len; i++) { if (i > 0) { printf(", "); } int b = bytes[i] & 0xff; printf("0x%02x", b) ; } printf("\n") ; #endif } void StatusCommand::dump() { #if SERIAL_PRINT_DBG_ASR_ON printf("cmd : %s\n",_cmd == 0x30 ? "STATUS" : "STATUS_ACK"); printf("bytes to send : %d\n",_bytesToSend); printf("bytes to receive : %d\n",_bytesToRecv); #endif }