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

C:/PIC/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 void EEPROM_init(void)
00084 {
00085     EEPROM_RX_SET();
00086     EEPROM_SCL = EEPROM_HIGH;
00087 
00088     /* Bank */
00089     EEPROM_AD_PIN = EEPROM_LOW;
00090     EEPROM_AE_PIN = EEPROM_LOW;
00091     //EEPROM_AF_PIN = EEPROM_LOW;
00092 
00093     return;
00094 }
00095 
00096 
00097 /**************************************************************************************************
00098 読み込み
00099 ---------------------------------------------------------------------------------------------------
00100 Arguments :
00101 unsigned char   ptr     読み込みアドレス  A7 A6 A5 A4 A3 A2 A1 A0
00102 ---------------------------------------------------------------------------------------------------
00103 Returns :
00104 int                     読み込んだデータ
00105 **************************************************************************************************/
00106 int EEPROM_read(unsigned int ptr)
00107 {
00108     unsigned char data;
00109 
00110 //  EEPROM_AF_PIN = EEPROM_MASK(ptr, EEPROM_AF);
00111     EEPROM_AE_PIN = EEPROM_MASK(ptr, EEPROM_AE);
00112     EEPROM_AD_PIN = EEPROM_MASK(ptr, EEPROM_AD);
00113 
00114     EEPROM_start();
00115 
00116     /* コントロール : 1010 AF AE AD R/W */
00117     EEPROM_TX_pulse(EEPROM_HIGH);
00118     EEPROM_TX_pulse(EEPROM_LOW);
00119     EEPROM_TX_pulse(EEPROM_HIGH);
00120     EEPROM_TX_pulse(EEPROM_LOW);
00121 //  EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_AF));
00122     EEPROM_TX_pulse(EEPROM_LOW);
00123     EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_AE));
00124     EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_AD));
00125     EEPROM_TX_pulse(EEPROM_LOW);
00126     if(EEPROM_RX_pulse() == EEPROM_HIGH) goto READ_ERROR;       /* Acknowledge */
00127 
00128     /* アドレス : * * * AC AB AA A9 A8 */
00129     EEPROM_TX_pulse(EEPROM_LOW);
00130     EEPROM_TX_pulse(EEPROM_LOW);
00131     EEPROM_TX_pulse(EEPROM_LOW);
00132     EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_AC));
00133     EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_AB));
00134     EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_AA));
00135     EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_A9));
00136     EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_A8));
00137     if(EEPROM_RX_pulse() == EEPROM_HIGH) goto READ_ERROR;       /* Acknowledge */
00138 
00139     /* アドレス : A7 A6 A5 A4 A3 A2 A1 A0 */
00140     EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_A7));
00141     EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_A6));
00142     EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_A5));
00143     EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_A4));
00144     EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_A3));
00145     EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_A2));
00146     EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_A1));
00147     EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_A0));
00148     if(EEPROM_RX_pulse() == EEPROM_HIGH) goto READ_ERROR;       /* Acknowledge */
00149 
00150     /* ここから読み込み処理 */
00151     EEPROM_start();
00152 
00153     /* デバイスアドレス 1010 AF AE AD R/W */
00154     EEPROM_TX_pulse(EEPROM_HIGH);
00155     EEPROM_TX_pulse(EEPROM_LOW);
00156     EEPROM_TX_pulse(EEPROM_HIGH);
00157     EEPROM_TX_pulse(EEPROM_LOW);
00158 //  EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_AF));
00159     EEPROM_TX_pulse(EEPROM_LOW);
00160     EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_AE));
00161     EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_AD));
00162     EEPROM_TX_pulse(EEPROM_HIGH);
00163     if(EEPROM_RX_pulse() == EEPROM_HIGH) goto READ_ERROR;       /* Acknowledge */
00164 
00165     /* データ読み出し */
00166     data = 0;
00167     data +=  EEPROM_RX_pulse() << 7;
00168     data +=  EEPROM_RX_pulse() << 6;
00169     data +=  EEPROM_RX_pulse() << 5;
00170     data +=  EEPROM_RX_pulse() << 4;
00171     data +=  EEPROM_RX_pulse() << 3;
00172     data +=  EEPROM_RX_pulse() << 2;
00173     data +=  EEPROM_RX_pulse() << 1;
00174     data +=  EEPROM_RX_pulse();
00175     EEPROM_TX_pulse(EEPROM_HIGH);                               /* No Acknowledge */
00176 
00177     EEPROM_stop();
00178     return(data);
00179 
00180 
00181 READ_ERROR:
00182     EEPROM_stop();
00183     return(-1);
00184 
00185 }
00186 
00187 
00188 
00189 /**************************************************************************************************
00190 書き込み
00191 ---------------------------------------------------------------------------------------------------
00192 Arguments :
00193 unsigned int    ptr     書き込みアドレス A10 A9 A8 A7 A6 A5 A4 A3 A2 A1 A0
00194 unsigned char   buf     書き込むデータ
00195 ---------------------------------------------------------------------------------------------------
00196 Returns :
00197 unsigned char           TRUE or FALSE
00198 **************************************************************************************************/
00199 BOOL EEPROM_write(unsigned int ptr, unsigned char buf)
00200 {
00201     unsigned int wait;
00202 
00203 //  EEPROM_AF_PIN = EEPROM_MASK(ptr, EEPROM_AF);
00204     EEPROM_AE_PIN = EEPROM_MASK(ptr, EEPROM_AE);
00205     EEPROM_AD_PIN = EEPROM_MASK(ptr, EEPROM_AD);
00206 
00207     EEPROM_start();
00208 
00209     /* コントロール : 1010 AF AE AD R/W */
00210     EEPROM_TX_pulse(EEPROM_HIGH);
00211     EEPROM_TX_pulse(EEPROM_LOW);
00212     EEPROM_TX_pulse(EEPROM_HIGH);
00213     EEPROM_TX_pulse(EEPROM_LOW);
00214 //  EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_AF));
00215     EEPROM_TX_pulse(EEPROM_LOW);
00216     EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_AE));
00217     EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_AD));
00218     EEPROM_TX_pulse(EEPROM_LOW);
00219     if(EEPROM_RX_pulse() == EEPROM_HIGH) goto WRITE_ERROR;      /* Acknowledge */
00220 
00221     /* アドレス : * * * AC AB AA A9 A8 */
00222     EEPROM_TX_pulse(EEPROM_LOW);
00223     EEPROM_TX_pulse(EEPROM_LOW);
00224     EEPROM_TX_pulse(EEPROM_LOW);
00225     EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_AC));
00226     EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_AB));
00227     EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_AA));
00228     EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_A9));
00229     EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_A8));
00230     if(EEPROM_RX_pulse() == EEPROM_HIGH) goto WRITE_ERROR;      /* Acknowledge */
00231 
00232     /* アドレス : A7 A6 A5 A4 A3 A2 A1 A0 */
00233     EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_A7));
00234     EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_A6));
00235     EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_A5));
00236     EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_A4));
00237     EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_A3));
00238     EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_A2));
00239     EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_A1));
00240     EEPROM_TX_pulse(EEPROM_MASK(ptr, EEPROM_A0));
00241     if(EEPROM_RX_pulse() == EEPROM_HIGH) goto WRITE_ERROR;      /* Acknowledge */
00242 
00243     /* データ書き込み */
00244     EEPROM_TX_pulse(EEPROM_MASK(buf, EEPROM_A7));
00245     EEPROM_TX_pulse(EEPROM_MASK(buf, EEPROM_A6));
00246     EEPROM_TX_pulse(EEPROM_MASK(buf, EEPROM_A5));
00247     EEPROM_TX_pulse(EEPROM_MASK(buf, EEPROM_A4));
00248     EEPROM_TX_pulse(EEPROM_MASK(buf, EEPROM_A3));
00249     EEPROM_TX_pulse(EEPROM_MASK(buf, EEPROM_A2));
00250     EEPROM_TX_pulse(EEPROM_MASK(buf, EEPROM_A1));
00251     EEPROM_TX_pulse(EEPROM_MASK(buf, EEPROM_A0));
00252     if(EEPROM_RX_pulse() == EEPROM_HIGH) goto WRITE_ERROR;      /* Acknowledge */
00253 
00254     EEPROM_stop();
00255 
00256     /* Write Cycle Time */
00257     wait = rtc.tick;
00258     while(RTC_get_ticks(wait, rtc.tick) < 100);
00259 
00260     return(TRUE);
00261 
00262 WRITE_ERROR:
00263     EEPROM_stop();
00264     return(FALSE);
00265 }
00266 
00267 
00268 /*-------------------------------------------------------------------------------------------------
00269 スタートビット
00270 -------------------------------------------------------------------------------------------------*/
00271 static void EEPROM_start(void)
00272 {
00273     EEPROM_TX_SET();
00274 
00275     EEPROM_SDA_WRITE = EEPROM_HIGH;
00276     EEPROM_SCL = EEPROM_HIGH;
00277     EEPROM_wait();
00278     EEPROM_SDA_WRITE = EEPROM_LOW;
00279     EEPROM_SCL = EEPROM_LOW;
00280     EEPROM_wait();
00281 
00282     EEPROM_RX_SET();
00283     return;
00284 }
00285 
00286 
00287 /*-------------------------------------------------------------------------------------------------
00288 ストップビット
00289 -------------------------------------------------------------------------------------------------*/
00290 static void EEPROM_stop(void)
00291 {
00292     EEPROM_TX_SET();
00293 
00294     EEPROM_SCL = EEPROM_LOW;
00295     EEPROM_SDA_WRITE = EEPROM_LOW;
00296     EEPROM_wait();
00297     EEPROM_SCL = EEPROM_HIGH;
00298     EEPROM_SDA_WRITE = EEPROM_HIGH;
00299     EEPROM_wait();
00300 
00301     EEPROM_RX_SET();
00302     return;
00303 }
00304 
00305 
00306 /*-------------------------------------------------------------------------------------------------
00307 シリアルクロック出力、データ出力
00308 ---------------------------------------------------------------------------------------------------
00309 Arguments :
00310 unsigned char   sda      SDA の bit
00311 -------------------------------------------------------------------------------------------------*/
00312 static void EEPROM_TX_pulse(unsigned char sda)
00313 {
00314     EEPROM_TX_SET();
00315 
00316     EEPROM_SDA_WRITE = sda;
00317     EEPROM_SCL = EEPROM_HIGH;
00318     EEPROM_wait();
00319     EEPROM_SCL = EEPROM_LOW;
00320     EEPROM_wait();
00321 
00322     EEPROM_RX_SET();
00323     return;
00324 }
00325 
00326 
00327 /*-------------------------------------------------------------------------------------------------
00328 シリアルクロック出力、データ入力
00329 ---------------------------------------------------------------------------------------------------
00330 Arguments :
00331 unsigned char   sda      SDA の bit
00332 -------------------------------------------------------------------------------------------------*/
00333 static unsigned char EEPROM_RX_pulse(void)
00334 {
00335     unsigned char buf;
00336 
00337     EEPROM_RX_SET();
00338 
00339     EEPROM_SCL = EEPROM_HIGH;
00340     EEPROM_wait();
00341     buf = EEPROM_SDA_READ;
00342     EEPROM_SCL = EEPROM_LOW;
00343     EEPROM_wait();
00344 
00345     return(buf);
00346 }
00347 
00348 
00349 /*-------------------------------------------------------------------------------------------------
00350 ウェイト
00351 -------------------------------------------------------------------------------------------------*/
00352 static void EEPROM_wait(void)
00353 {
00354     Nop();
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     return;
00373 }

OpenSSMに対してSun Nov 21 2010 13:53:16に生成されました。  doxygen 1.7.1