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) 反転させることにより、疑似リセットクロックを生成します。

その後は、通常の起動手順に復帰し、以降はこれまでと同様の動作をします。

af_utils/af_mgr.cpp

Committer:
gaku_miyagawa
Date:
2018-06-18
Revision:
2:de22987be9ba
Parent:
0:d895cd1cd897

File content as of revision 2:de22987be9ba:

#include "mbed.h"
#include "string.h"
#include "vt100.h"
#include "edge_time.h"
#include "edge_pin.h"
#include "edge_reset_mgr.h"
#include "afLib.h"
#include "pending.h"
#include "msg_types.h"
#include "mbedSPI.h"
#include "af_mgr.h"

afLib           *afero = 0 ;
pending_class   *pending = 0 ;
InterruptIn     *afero_int = 0 ;
mbedSPI         *afero_spi = 0 ;
DigitalOut      *afero_reset ;
bool            gLinked = false ;
bool            gConnected = false ;

void afero_isr(void)
{
    afero->mcuISR() ;
}

void init_aflib(void)
{
    afero_reset = new DigitalOut(PIN_ASR_RESET, 1) ; /* create as deasserted */
    afero_spi = new mbedSPI(PIN_MOSI, PIN_MISO, PIN_SCK, PIN_CS) ;

reset_watch_dog() ;
    afero = new afLib(
        PIN_INTR,
        afero_isr,
        attributeChangeRequest,
        attributeUpdatedReport,
        afero_spi ) ;
reset_watch_dog() ;
    wait(0.1) ;
    *afero_reset = 0 ;
    wait(0.5) ; /* required 250ms ~ time for reset */
    *afero_reset = 1 ; 
reset_watch_dog() ;      
    wait(0.5) ;
reset_watch_dog() ;
}