MCU

コンテンツ

WIZNet W5300 その七 EEPROMにアクセスする

これは、弊社W5300ボードについているEEPROMにアクセスする関数です。
直接的に W5300には関係ありませんし、当該ボード以外で W5300を使う場合にも関係ありません。

00001 /************************************************************************/
00002 /*                                                                      */
00003 /*  FILE        : EEPROM.H (AT93C56)                                    */
00004 /*                                                                      */
00005 /*  DESCRIPTION : AT93C56 Read/Write Process                            */
00006 /*  CPU TYPE    : NO ARCH                                               */
00007 /*                                                                      */
00008 /*                                         CopyRight(C) by MCM Co.,Ltd. */
00009 /************************************************************************/
00010 #ifndef _EEPROM_H_
00011 #define _EEPROM_H_
00012 
00013 ushort  eeprom_rd_word(ubyte adr);
00014 void    eeprom_wr_word(ubyte adr, ushort data);
00015 void    eeprom_wr_enable(void);
00016 void    eeprom_wr_disable(void);
00017 
00018 #endif /* undef( _EEPROM_H_) */



00001 /************************************************************************/
00002 /*                                                                      */
00003 /*  FILE        : EEPROM.C (AT93C56)                                    */
00004 /*                                                                      */
00005 /*  DESCRIPTION : AT93C56 Read/Write Process                            */
00006 /*  CPU TYPE    : NO ARCH                                               */
00007 /*                                                                      */
00008 /*                                         CopyRight(C) by MCM Co.,Ltd. */
00009 /************************************************************************/
00010 #include "3048fone.h"
00011 #include "typedef.h"
00012 
00013 
00014 /************************************************************************/
00015 /*                                                                      */
00016 /* 使用するポートの定義                                                 */
00017 /*                                                                      */
00018 /************************************************************************/
00019 #define EEPROM_SK       PB.DR.BIT.B0    /* Bit 0 - OUT  */
00020 #define EEPROM_CS       PB.DR.BIT.B1    /* Bit 1 - OUT  */
00021 #define EEPROM_DO       PB.DR.BIT.B2    /* Bit 2 - INP  */
00022 #define EEPROM_DI       PB.DR.BIT.B3    /* Bit 3 - OUT  */
00023 
00024 
00025 /************************************************************************/
00026 /*                                                                      */
00027 /* EEPROMのコマンド(MSBから)                                            */
00028 /*                                                                      */
00029 /************************************************************************/
00030 #define CMD_READ        (0xc0)
00031 #define CMD_EWEN        (0x80)
00032 #define CMD_ERASE       (0xe0)
00033 #define CMD_WRITE       (0xa0)
00034 #define CMD_ERAL        (0x80)
00035 #define CMD_WRAL        (0x80)
00036 #define CMD_EWDS        (0x80)
00037 
00038 
00039 /************************************************************************/
00040 /*                                                                      */
00041 /* 時間待ちソフト・ループ                                               */
00042 /*                                                                      */
00043 /* Ugh! 正確には考えていない                                            */
00044 /************************************************************************/
00045 static void eeprom_dly(void) { short t; for(t = 0 ; t < 10 ; ++t); }
00046 
00047 
00048 /************************************************************************/
00049 /*                                                                      */
00050 /* CS ON                                                                */
00051 /*                                                                      */
00052 /************************************************************************/
00053 static void eeprom_cs_enable(void)
00054 {
00055     /* DI を "0"にしてから CS を "1" にする */
00056     EEPROM_DI = 0;
00057     /* CS ENABLE */
00058     EEPROM_CS = 1;
00059 }
00060 
00061 
00062 /************************************************************************/
00063 /*                                                                      */
00064 /* CS OFF                                                               */
00065 /*                                                                      */
00066 /************************************************************************/
00067 static void eeprom_cs_disable(void)
00068 {
00069     /* CS ENABLE */
00070     EEPROM_CS = 0;
00071     /* 次のアクションまでの待ち */
00072     eeprom_dly();
00073 }
00074 
00075 
00076 /************************************************************************/
00077 /*                                                                      */
00078 /* 1クロックの送出                                                     */
00079 /*                                                                      */
00080 /* |~~~|___ までを出力                                                  */
00081 /*                                                                      */
00082 /************************************************************************/
00083 static void eeprom_send_clock(void)
00084 {
00085     EEPROM_SK = 1;
00086     eeprom_dly();           /* tSKH         */
00087     EEPROM_SK = 0;
00088     eeprom_dly();           /* tSKL         */
00089 }
00090 
00091 
00092 /************************************************************************/
00093 /*                                                                      */
00094 /* コマンド or アドレス or データの出力                                 */
00095 /*                                                                      */
00096 /************************************************************************/
00097 static void eeprom_bit_set(ubyte dat, ubyte len)
00098 {
00099     /* コマンド3バイトを出力 (CSはENABLEになっている事) */
00100     while(len--) {
00101         if((dat & 0x80) != 0) EEPROM_DI = 1;
00102         else                  EEPROM_DI = 0;
00103         eeprom_send_clock();
00104         dat <<= 1;
00105     }
00106 }
00107 
00108 
00109 /************************************************************************/
00110 /*                                                                      */
00111 /* StartBit + CMD + Adrs の出力                                         */
00112 /*                                                                      */
00113 /************************************************************************/
00114 static void eeprom_begin_act(ubyte cmd, ubyte adr)
00115 {
00116     eeprom_bit_set(cmd, 3);
00117     eeprom_bit_set(adr, 8);
00118 }
00119 
00120 
00121 /************************************************************************/
00122 /*                                                                      */
00123 /* 1WORDの読み込み                                                     */
00124 /*                                                                      */
00125 /************************************************************************/
00126 ushort eeprom_rd_word(ubyte adr)
00127 {
00128 ushort dt;
00129 short  ii;
00130 
00131     /* 初期化 */
00132     dt = 0;
00133 
00134     /* CS ENABLE */
00135     eeprom_cs_enable();
00136 
00137     /* コマンド出力 */
00138     eeprom_begin_act(CMD_READ, adr);
00139 
00140     /* 16Bits分、データを読み込む */
00141     for(ii = 0 ; ii < 16 ; ++ii) {
00142         dt <<= 1;
00143         eeprom_send_clock();
00144         if(EEPROM_DO) dt |= 1;
00145     }
00146 
00147     /* CS DISENABLE */
00148     eeprom_cs_disable();
00149 
00150     return dt;
00151 }
00152 
00153 
00154 /************************************************************************/
00155 /*                                                                      */
00156 /* 1WORDの書き込み                                                     */
00157 /*                                                                      */
00158 /************************************************************************/
00159 void eeprom_wr_word(ubyte adr, ushort data)
00160 {
00161 short ii;
00162 
00163     /* CS ENABLE */
00164     eeprom_cs_enable();
00165 
00166     /* コマンド出力 */
00167     eeprom_begin_act(CMD_WRITE, adr);
00168 
00169     /* 16Bits分、データを書き込む */
00170     eeprom_bit_set((data >> 8), 8);
00171     eeprom_bit_set(data,        8);
00172 
00173     /* CS DISENABLE */
00174     eeprom_cs_disable();        /* EEPROM内部書き込み開始   */
00175 
00176     /* ベリファイ・モード移行   */
00177     eeprom_cs_enable();
00178 
00179     /* DO が "1" になるのを待つ(無限ループはしない) */
00180 #if  0
00181     for(ii = 0 ; ii < 200 ; ++ii) {
00182         if(EEPROM_DO) break;
00183     }
00184 #else
00185     /* 書き終わるまで、充分な時間待ってあげる */
00186     for(ii = 0 ; ii < 500 ; ++ii) eeprom_dly();
00187 #endif
00188     eeprom_cs_disable();        /* 待機状態…           */
00189 }
00190 
00191 
00192 /************************************************************************/
00193 /*                                                                      */
00194 /* 書き込み許可                                                         */
00195 /*                                                                      */
00196 /************************************************************************/
00197 void eeprom_wr_enable(void)
00198 {
00199 short ii;
00200 
00201     /* CS ENABLE */
00202     eeprom_cs_enable();
00203 
00204     /* コマンド出力 */
00205     eeprom_begin_act(CMD_EWEN, 0xc0);
00206 
00207     /* CS DISABLE */
00208     eeprom_cs_disable();
00209 }
00210 
00211 
00212 /************************************************************************/
00213 /*                                                                      */
00214 /* 書き込み禁止                                                         */
00215 /*                                                                      */
00216 /************************************************************************/
00217 void eeprom_wr_disable(void)
00218 {
00219 short ii;
00220 
00221     /* CS ENABLE */
00222     eeprom_cs_enable();
00223 
00224     /* コマンド出力 */
00225     eeprom_begin_act(CMD_EWDS, 0x00);
00226 
00227     /* CS DISABLE */
00228     eeprom_cs_disable();
00229 }
最終更新のRSS
Last-modified: 2010-03-27 (土) 14:29:40 5106日前
HTML convert time: 0.007 sec.