• メインページ
  • データ構造
  • ファイル
  • ファイル一覧
  • グローバル

OpenSSM/libeeprom.c

説明を見る。
00001 /**************************************************************************************************
00002     Title           : I2C Bus Serial EEPROM Driver
00003     Programer       : Yosuke FURUSAWA.
00004     Copyright       : Copyright (C) 2003-2008 Yosuke FURUSAWA.
00005     License         : 4-clause BSD License
00006     Since           : 2003/08/13 ?
00007 
00008     Filename        : libeeprom.c
00009     Last up date    : 2010/05/27
00010     Kanji-Code      : Shift-JIS
00011     TAB Space       : 4
00012 **************************************************************************************************/
00013 
00014 
00015 /*
00016 TODO :
00017 1. 高速化. Block read / write
00018 */
00019 
00020 
00021 /*=================================================================================================
00022 ヘッダファイルをインクルード
00023 =================================================================================================*/
00024 #include <p24FJ64GA002.h>
00025 
00026 #include "types.h"
00027 
00028 #include "librtc.h"
00029 #include "libeeprom.h"
00030 
00031 
00032 /*=================================================================================================
00033 マクロ定義
00034 =================================================================================================*/
00035 /* ポート */
00036 #define EEPROM_TX_SET()         TRISBbits.TRISB3 = 0; TRISBbits.TRISB2 = 0;
00037 #define EEPROM_RX_SET()         TRISBbits.TRISB3 = 0; TRISBbits.TRISB2 = 1;
00038 #define EEPROM_SCL              LATBbits.LATB3
00039 #define EEPROM_SDA_READ         PORTBbits.RB2
00040 #define EEPROM_SDA_WRITE        LATBbits.LATB2
00041 #define EEPROM_AD_PIN           LATAbits.LATA3
00042 #define EEPROM_AE_PIN           LATAbits.LATA2
00043 //#define EEPROM_AF_PIN         0
00044 
00045 /* 論理レベル */
00046 #define EEPROM_HIGH             1
00047 #define EEPROM_LOW              0
00048 
00049 /* ビットパターン と マスク */
00050 #define EEPROM_A0           0x0001          /* 0000 0000 0000 0000 0001 */
00051 #define EEPROM_A1           0x0002          /* 0000 0000 0000 0000 0010 */
00052 #define EEPROM_A2           0x0004          /* 0000 0000 0000 0000 0100 */
00053 #define EEPROM_A3           0x0008          /* 0000 0000 0000 0000 1000 */
00054 #define EEPROM_A4           0x0010          /* 0000 0000 0000 0001 0000 */
00055 #define EEPROM_A5           0x0020          /* 0000 0000 0000 0010 0000 */
00056 #define EEPROM_A6           0x0040          /* 0000 0000 0000 0100 0000 */
00057 #define EEPROM_A7           0x0080          /* 0000 0000 0000 1000 0000 */
00058 #define EEPROM_A8           0x0100          /* 0000 0000 0001 0000 0000 */
00059 #define EEPROM_A9           0x0200          /* 0000 0000 0010 0000 0000 */
00060 #define EEPROM_AA           0x0400          /* 0000 0000 0100 0000 0000 */
00061 #define EEPROM_AB           0x0800          /* 0000 0000 1000 0000 0000 */
00062 #define EEPROM_AC           0x1000          /* 0000 0001 0000 0000 0000 */
00063 #define EEPROM_AD           0x2000          /* 0000 0010 0000 0000 0000 */
00064 #define EEPROM_AE           0x4000          /* 0000 0100 0000 0000 0000 */
00065 #define EEPROM_AF           0x8000          /* 0000 1000 0000 0000 0000 */
00066 
00067 #define EEPROM_MASK(x,y)    ((x & y) ? EEPROM_HIGH : EEPROM_LOW)
00068 
00069 
00070 /*=================================================================================================
00071 プロトタイプ宣言
00072 =================================================================================================*/
00073 static void EEPROM_start(void);
00074 static void EEPROM_stop(void);
00075 static void EEPROM_TX_pulse(unsigned char sda);
00076 static unsigned char EEPROM_RX_pulse(void);
00077 static void EEPROM_wait(void);
00078 
00079 
00080 /**************************************************************************************************
00081 初期化
00082 いまのところ必要ないが、他の関数との互換のために残しておく
00083 **************************************************************************************************/
00084 void EEPROM_init(void)
00085 {
00086     EEPROM_RX_SET();
00087     EEPROM_SCL = EEPROM_HIGH;
00088 
00089     /* Bank */
00090     EEPROM_AD_PIN = EEPROM_LOW;
00091     EEPROM_AE_PIN = EEPROM_LOW;
00092     //EEPROM_AF_PIN = EEPROM_LOW;
00093 
00094     return;
00095 }
00096 
00097 
00098 /**************************************************************************************************
00099 読み込み
00100 ---------------------------------------------------------------------------------------------------
00101 Arguments :
00102 unsigned char   ptr     読み込みアドレス  A7 A6 A5 A4 A3 A2 A1 A0
00103 ---------------------------------------------------------------------------------------------------
00104 Returns :
00105 int                     読み込んだデータ
00106 **************************************************************************************************/
00107 int EEPROM_read(unsigned int ptr)
00108 {
00109     unsigned char data;
00110 
00111 //  EEPROM_AF_PIN = EEPROM_MASK(ptr, EEPROM_AF);
00112     EEPROM_AE_PIN = EEPROM_MASK(ptr, EEPROM_AE);
00113     EEPROM_AD_PIN = EEPROM_MASK(ptr, EEPROM_AD);
00114 
00115     EEPROM_start();
00116 
00117     /* コントロール : 1010 AF AE AD R/W */
00118     EEPROM_TX_pulse(EEPROM_HIGH);
00119     EEPROM_TX_pulse(EEPROM_LOW);
00120     EEPROM_TX_pulse(EEPROM_HIGH);
00121     EEPROM_TX_pulse(EEPROM_LOW);
00122 //  EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_AF));
00123     EEPROM_TX_pulse(EEPROM_LOW);
00124     EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_AE));
00125     EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_AD));
00126     EEPROM_TX_pulse(EEPROM_LOW);
00127     if(EEPROM_RX_pulse() == EEPROM_HIGH) goto READ_ERROR;       /* Acknowledge */
00128 
00129     /* アドレス : * * * AC AB AA A9 A8 */
00130     EEPROM_TX_pulse(EEPROM_LOW);
00131     EEPROM_TX_pulse(EEPROM_LOW);
00132     EEPROM_TX_pulse(EEPROM_LOW);
00133     EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_AC));
00134     EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_AB));
00135     EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_AA));
00136     EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_A9));
00137     EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_A8));
00138     if(EEPROM_RX_pulse() == EEPROM_HIGH) goto READ_ERROR;       /* Acknowledge */
00139 
00140     /* アドレス : A7 A6 A5 A4 A3 A2 A1 A0 */
00141     EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_A7));
00142     EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_A6));
00143     EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_A5));
00144     EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_A4));
00145     EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_A3));
00146     EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_A2));
00147     EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_A1));
00148     EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_A0));
00149     if(EEPROM_RX_pulse() == EEPROM_HIGH) goto READ_ERROR;       /* Acknowledge */
00150 
00151     /* ここから読み込み処理 */
00152     EEPROM_start();
00153 
00154     /* デバイスアドレス 1010 AF AE AD R/W */
00155     EEPROM_TX_pulse(EEPROM_HIGH);
00156     EEPROM_TX_pulse(EEPROM_LOW);
00157     EEPROM_TX_pulse(EEPROM_HIGH);
00158     EEPROM_TX_pulse(EEPROM_LOW);
00159 //  EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_AF));
00160     EEPROM_TX_pulse(EEPROM_LOW);
00161     EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_AE));
00162     EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_AD));
00163     EEPROM_TX_pulse(EEPROM_HIGH);
00164     if(EEPROM_RX_pulse() == EEPROM_HIGH) goto READ_ERROR;       /* Acknowledge */
00165 
00166     /* データ読み出し */
00167     data = 0;
00168     data +=  EEPROM_RX_pulse() << 7;
00169     data +=  EEPROM_RX_pulse() << 6;
00170     data +=  EEPROM_RX_pulse() << 5;
00171     data +=  EEPROM_RX_pulse() << 4;
00172     data +=  EEPROM_RX_pulse() << 3;
00173     data +=  EEPROM_RX_pulse() << 2;
00174     data +=  EEPROM_RX_pulse() << 1;
00175     data +=  EEPROM_RX_pulse();
00176     EEPROM_TX_pulse(EEPROM_HIGH);                               /* No Acknowledge */
00177 
00178     EEPROM_stop();
00179     return(data);
00180 
00181 
00182 READ_ERROR:
00183     EEPROM_stop();
00184     return(-1);
00185 
00186 }
00187 
00188 
00189 
00190 /**************************************************************************************************
00191 書き込み
00192 ---------------------------------------------------------------------------------------------------
00193 Arguments :
00194 unsigned int    ptr     書き込みアドレス A10 A9 A8 A7 A6 A5 A4 A3 A2 A1 A0
00195 unsigned char   buf     書き込むデータ
00196 ---------------------------------------------------------------------------------------------------
00197 Returns :
00198 unsigned char           TRUE or FALSE
00199 **************************************************************************************************/
00200 BOOL EEPROM_write(unsigned int ptr, unsigned char buf)
00201 {
00202     unsigned int wait;
00203 
00204 //  EEPROM_AF_PIN = EEPROM_MASK(ptr, EEPROM_AF);
00205     EEPROM_AE_PIN = EEPROM_MASK(ptr, EEPROM_AE);
00206     EEPROM_AD_PIN = EEPROM_MASK(ptr, EEPROM_AD);
00207 
00208     EEPROM_start();
00209 
00210     /* コントロール : 1010 AF AE AD R/W */
00211     EEPROM_TX_pulse(EEPROM_HIGH);
00212     EEPROM_TX_pulse(EEPROM_LOW);
00213     EEPROM_TX_pulse(EEPROM_HIGH);
00214     EEPROM_TX_pulse(EEPROM_LOW);
00215 //  EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_AF));
00216     EEPROM_TX_pulse(EEPROM_LOW);
00217     EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_AE));
00218     EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_AD));
00219     EEPROM_TX_pulse(EEPROM_LOW);
00220     if(EEPROM_RX_pulse() == EEPROM_HIGH) goto WRITE_ERROR;      /* Acknowledge */
00221 
00222     /* アドレス : * * * AC AB AA A9 A8 */
00223     EEPROM_TX_pulse(EEPROM_LOW);
00224     EEPROM_TX_pulse(EEPROM_LOW);
00225     EEPROM_TX_pulse(EEPROM_LOW);
00226     EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_AC));
00227     EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_AB));
00228     EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_AA));
00229     EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_A9));
00230     EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_A8));
00231     if(EEPROM_RX_pulse() == EEPROM_HIGH) goto WRITE_ERROR;      /* Acknowledge */
00232 
00233     /* アドレス : A7 A6 A5 A4 A3 A2 A1 A0 */
00234     EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_A7));
00235     EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_A6));
00236     EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_A5));
00237     EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_A4));
00238     EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_A3));
00239     EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_A2));
00240     EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_A1));
00241     EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_A0));
00242     if(EEPROM_RX_pulse() == EEPROM_HIGH) goto WRITE_ERROR;      /* Acknowledge */
00243 
00244     /* データ書き込み */
00245     EEPROM_TX_pulse(EEPROM_MASK(buf, EEPROM_A7));
00246     EEPROM_TX_pulse(EEPROM_MASK(buf, EEPROM_A6));
00247     EEPROM_TX_pulse(EEPROM_MASK(buf, EEPROM_A5));
00248     EEPROM_TX_pulse(EEPROM_MASK(buf, EEPROM_A4));
00249     EEPROM_TX_pulse(EEPROM_MASK(buf, EEPROM_A3));
00250     EEPROM_TX_pulse(EEPROM_MASK(buf, EEPROM_A2));
00251     EEPROM_TX_pulse(EEPROM_MASK(buf, EEPROM_A1));
00252     EEPROM_TX_pulse(EEPROM_MASK(buf, EEPROM_A0));
00253     if(EEPROM_RX_pulse() == EEPROM_HIGH) goto WRITE_ERROR;      /* Acknowledge */
00254 
00255     EEPROM_stop();
00256 
00257     /* Write Cycle Time */
00258     wait = rtc.tick;
00259     while(RTC_get_ticks(wait, rtc.tick) < 100);
00260 
00261     return(TRUE);
00262 
00263 WRITE_ERROR:
00264     EEPROM_stop();
00265     return(FALSE);
00266 }
00267 
00268 
00269 /*-------------------------------------------------------------------------------------------------
00270 スタートビット
00271 -------------------------------------------------------------------------------------------------*/
00272 static void EEPROM_start(void)
00273 {
00274     EEPROM_TX_SET();
00275 
00276     EEPROM_SDA_WRITE = EEPROM_HIGH;
00277     EEPROM_SCL = EEPROM_HIGH;
00278     EEPROM_wait();
00279     EEPROM_SDA_WRITE = EEPROM_LOW;
00280     EEPROM_SCL = EEPROM_LOW;
00281     EEPROM_wait();
00282 
00283     EEPROM_RX_SET();
00284     return;
00285 }
00286 
00287 
00288 /*-------------------------------------------------------------------------------------------------
00289 ストップビット
00290 -------------------------------------------------------------------------------------------------*/
00291 static void EEPROM_stop(void)
00292 {
00293     EEPROM_TX_SET();
00294 
00295     EEPROM_SCL = EEPROM_LOW;
00296     EEPROM_SDA_WRITE = EEPROM_LOW;
00297     EEPROM_wait();
00298     EEPROM_SCL = EEPROM_HIGH;
00299     EEPROM_SDA_WRITE = EEPROM_HIGH;
00300     EEPROM_wait();
00301 
00302     EEPROM_RX_SET();
00303     return;
00304 }
00305 
00306 
00307 /*-------------------------------------------------------------------------------------------------
00308 シリアルクロック出力、データ出力
00309 ---------------------------------------------------------------------------------------------------
00310 Arguments :
00311 unsigned char   sda      SDA の bit
00312 -------------------------------------------------------------------------------------------------*/
00313 static void EEPROM_TX_pulse(unsigned char sda)
00314 {
00315     EEPROM_TX_SET();
00316 
00317     EEPROM_SDA_WRITE = sda;
00318     EEPROM_SCL = EEPROM_HIGH;
00319     EEPROM_wait();
00320     EEPROM_SCL = EEPROM_LOW;
00321     EEPROM_wait();
00322 
00323     EEPROM_RX_SET();
00324     return;
00325 }
00326 
00327 
00328 /*-------------------------------------------------------------------------------------------------
00329 シリアルクロック出力、データ入力
00330 ---------------------------------------------------------------------------------------------------
00331 Arguments :
00332 unsigned char   sda      SDA の bit
00333 -------------------------------------------------------------------------------------------------*/
00334 static unsigned char EEPROM_RX_pulse(void)
00335 {
00336     unsigned char buf;
00337 
00338     EEPROM_RX_SET();
00339 
00340     EEPROM_SCL = EEPROM_HIGH;
00341     EEPROM_wait();
00342     buf = EEPROM_SDA_READ;
00343     EEPROM_SCL = EEPROM_LOW;
00344     EEPROM_wait();
00345 
00346     return(buf);
00347 }
00348 
00349 
00350 /*-------------------------------------------------------------------------------------------------
00351 ウェイト
00352 -------------------------------------------------------------------------------------------------*/
00353 static void EEPROM_wait(void)
00354 {
00355     Nop();
00356     Nop();
00357     Nop();
00358     Nop();
00359     Nop();
00360     Nop();
00361     Nop();
00362     Nop();
00363     Nop();
00364     Nop();
00365     Nop();
00366     Nop();
00367     Nop();
00368     Nop();
00369     Nop();
00370     Nop();
00371     Nop();
00372     Nop();
00373     return;
00374 }

OpenSSMに対してSat Aug 14 2010 03:23:43に生成されました。  doxygen 1.7.1