これは、弊社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 }