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

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

Committer:
Rhyme
Date:
Tue Apr 03 08:30:29 2018 +0000
Revision:
0:d895cd1cd897
Initial I2C Pin force reset function added

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Rhyme 0:d895cd1cd897 1 #include "mbed.h"
Rhyme 0:d895cd1cd897 2 #include "edge_mgr.h"
Rhyme 0:d895cd1cd897 3 #include "edge_reset_mgr.h"
Rhyme 0:d895cd1cd897 4 #include "edge_chart.h"
Rhyme 0:d895cd1cd897 5 #if 0
Rhyme 0:d895cd1cd897 6 typedef struct _edge_chart_st {
Rhyme 0:d895cd1cd897 7 char *name ;
Rhyme 0:d895cd1cd897 8 int left ;
Rhyme 0:d895cd1cd897 9 int top ;
Rhyme 0:d895cd1cd897 10 int width ;
Rhyme 0:d895cd1cd897 11 int height ;
Rhyme 0:d895cd1cd897 12 int index ;
Rhyme 0:d895cd1cd897 13 int min ;
Rhyme 0:d895cd1cd897 14 int max ;
Rhyme 0:d895cd1cd897 15 } edge_chart_type ;
Rhyme 0:d895cd1cd897 16
Rhyme 0:d895cd1cd897 17 extern edge_chart_type edge_chart[] ;
Rhyme 0:d895cd1cd897 18 #endif
Rhyme 0:d895cd1cd897 19
Rhyme 0:d895cd1cd897 20 edge_chart_type edge_chart[] = {
Rhyme 0:d895cd1cd897 21 /* name, left, top, width, height, index, min, max */
Rhyme 0:d895cd1cd897 22 { "Accel", 0, 0, 160, 60, 0, -0.2, 0.2 },
Rhyme 0:d895cd1cd897 23 { "Color", 160, 0, 160, 120, 0, 0.0, 10000.0 },
Rhyme 0:d895cd1cd897 24 { "Color2", 160, 120, 160, 120, 0, 0.0, 10000.0 },
Rhyme 0:d895cd1cd897 25 { "Temp", 0, 120, 160, 120, 0, -10.0, 50.0 },
Rhyme 0:d895cd1cd897 26 { "Press", 0, 60, 160, 60, 0, -1.0, 5.0 },
Rhyme 0:d895cd1cd897 27 { 0, 0, 0, 0, 0, 0, 0.0, 0.0 }
Rhyme 0:d895cd1cd897 28 } ;
Rhyme 0:d895cd1cd897 29
Rhyme 0:d895cd1cd897 30 void draw_chart_frame(edge_chart_type *p)
Rhyme 0:d895cd1cd897 31 {
Rhyme 0:d895cd1cd897 32 if (display) {
Rhyme 0:d895cd1cd897 33 display->fillrect(p->left+1, p->top+1,
Rhyme 0:d895cd1cd897 34 p->left + p->width - 2, p->top + p->height - 2, Black) ;
Rhyme 0:d895cd1cd897 35 display->rect(p->left, p->top,
Rhyme 0:d895cd1cd897 36 p->left + p->width - 1,
Rhyme 0:d895cd1cd897 37 p->top + p->height -1, Blue) ;
Rhyme 0:d895cd1cd897 38 display->set_font((unsigned char*) Arial12x12);
Rhyme 0:d895cd1cd897 39 display->foreground(White) ;
Rhyme 0:d895cd1cd897 40 display->locate(p->left + 5, p->top + 5) ;
Rhyme 0:d895cd1cd897 41 display->printf(p->name) ;
Rhyme 0:d895cd1cd897 42 }
Rhyme 0:d895cd1cd897 43 }
Rhyme 0:d895cd1cd897 44
Rhyme 0:d895cd1cd897 45 void draw_all_chart_frame(void)
Rhyme 0:d895cd1cd897 46 {
Rhyme 0:d895cd1cd897 47 edge_chart_type *p ;
Rhyme 0:d895cd1cd897 48 if (display) {
Rhyme 0:d895cd1cd897 49 reset_watch_dog() ;
Rhyme 0:d895cd1cd897 50 display->BusEnable(true) ;
Rhyme 0:d895cd1cd897 51 for(p = edge_chart ; p->name ; p++ ) {
Rhyme 0:d895cd1cd897 52 draw_chart_frame(p) ;
Rhyme 0:d895cd1cd897 53 }
Rhyme 0:d895cd1cd897 54 display->BusEnable(false) ;
Rhyme 0:d895cd1cd897 55 }
Rhyme 0:d895cd1cd897 56 }