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 "vt100.h"
Rhyme 0:d895cd1cd897 3 #include "afSPI.h"
Rhyme 0:d895cd1cd897 4 #include "mbedSPI.h"
Rhyme 0:d895cd1cd897 5
Rhyme 0:d895cd1cd897 6 #if defined (TARGET_KL25Z) || defined (TARGET_TEENSY3_1)
Rhyme 0:d895cd1cd897 7 #ifndef SPI0_C1
Rhyme 0:d895cd1cd897 8 #define SPI0_C1 (*(uint8_t *)0x40076000)
Rhyme 0:d895cd1cd897 9 #endif
Rhyme 0:d895cd1cd897 10 #endif
Rhyme 0:d895cd1cd897 11 /*
Rhyme 0:d895cd1cd897 12 class mbedSPI : public afSPI {
Rhyme 0:d895cd1cd897 13 public:
Rhyme 0:d895cd1cd897 14 mbedSPI(PinName mosi, PinName miso, PinName sckl, PinName cs) ;
Rhyme 0:d895cd1cd897 15 virtual void begin() ;
Rhyme 0:d895cd1cd897 16 virtual void beginSPI() ;
Rhyme 0:d895cd1cd897 17 virtual void endSPI() ;
Rhyme 0:d895cd1cd897 18 virtual void transfer(char *bytes,int len) ;
Rhyme 0:d895cd1cd897 19 private:
Rhyme 0:d895cd1cd897 20 SPI _spi ;
Rhyme 0:d895cd1cd897 21 DigitalOut _cs ;
Rhyme 0:d895cd1cd897 22 } ;
Rhyme 0:d895cd1cd897 23 */
Rhyme 0:d895cd1cd897 24
Rhyme 0:d895cd1cd897 25 mbedSPI::mbedSPI(PinName mosi, PinName miso, PinName sckl, PinName cs) :
Rhyme 0:d895cd1cd897 26 _spi(mosi, miso, sckl), _cs(cs, 1)
Rhyme 0:d895cd1cd897 27 {
Rhyme 0:d895cd1cd897 28 _spi.format(8, 0) ;
Rhyme 0:d895cd1cd897 29 _spi.frequency(1000000) ; /* 1MHz */
Rhyme 0:d895cd1cd897 30
Rhyme 0:d895cd1cd897 31 #if defined (TARGET_KL25Z) || defined (TARGET_TEENSY3_1)
Rhyme 0:d895cd1cd897 32 #ifndef SPI0_C1
Rhyme 0:d895cd1cd897 33 #define SPI0_C1 (*(uint8_t *)0x40076000)
Rhyme 0:d895cd1cd897 34 #endif
Rhyme 0:d895cd1cd897 35 // SPI0_C1 |= 0x01 ; /* LSB First */
Rhyme 0:d895cd1cd897 36 // SPI0_C1 &= 0xFE ; /* MSB First */
Rhyme 0:d895cd1cd897 37 #endif
Rhyme 0:d895cd1cd897 38
Rhyme 0:d895cd1cd897 39 }
Rhyme 0:d895cd1cd897 40
Rhyme 0:d895cd1cd897 41 void mbedSPI::begin(void)
Rhyme 0:d895cd1cd897 42 {
Rhyme 0:d895cd1cd897 43 }
Rhyme 0:d895cd1cd897 44
Rhyme 0:d895cd1cd897 45 void mbedSPI::beginSPI()
Rhyme 0:d895cd1cd897 46 {
Rhyme 0:d895cd1cd897 47 // printf("+") ; fflush(stdout) ;
Rhyme 0:d895cd1cd897 48 _cs = 0 ;
Rhyme 0:d895cd1cd897 49 SPI0_C1 |= 0x01 ; /* LSB First */
Rhyme 0:d895cd1cd897 50 wait_us(1) ;
Rhyme 0:d895cd1cd897 51 }
Rhyme 0:d895cd1cd897 52
Rhyme 0:d895cd1cd897 53 void mbedSPI::endSPI()
Rhyme 0:d895cd1cd897 54 {
Rhyme 0:d895cd1cd897 55 _cs = 1 ;
Rhyme 0:d895cd1cd897 56 SPI0_C1 &= 0xFE ; /* MSB First */
Rhyme 0:d895cd1cd897 57 wait_us(1) ;
Rhyme 0:d895cd1cd897 58 // printf("-") ; fflush(stdout) ;
Rhyme 0:d895cd1cd897 59 }
Rhyme 0:d895cd1cd897 60
Rhyme 0:d895cd1cd897 61 /**
Rhyme 0:d895cd1cd897 62 * on 17-Jan-2018 disable/enable irq added
Rhyme 0:d895cd1cd897 63 * before and after of each _spi.writes
Rhyme 0:d895cd1cd897 64 */
Rhyme 0:d895cd1cd897 65 void mbedSPI::transfer(char *bytes, int len)
Rhyme 0:d895cd1cd897 66 {
Rhyme 0:d895cd1cd897 67 int i ;
Rhyme 0:d895cd1cd897 68 for (i = 0 ; i < len ; i++ ) {
Rhyme 0:d895cd1cd897 69 __disable_irq() ; // Disable Interrupts
Rhyme 0:d895cd1cd897 70 bytes[i] = _spi.write(bytes[i]) ;
Rhyme 0:d895cd1cd897 71 __enable_irq() ; // Enable Interrupts
Rhyme 0:d895cd1cd897 72 }
Rhyme 0:d895cd1cd897 73 }
Rhyme 0:d895cd1cd897 74