MCU

コンテンツ

WIZNet W5300 その参 w5300.c


Pingまで通ったので、次にファームウェアを書いていきましょう。
最初は、 W5300をアクセスするために、一皮かぶせるものです。

00001 /************************************************************************/
00002 /*                                                                      */
00003 /*  FILE        : W5300.C                                               */
00004 /*  DATE        : 2010.01.12                                            */
00005 /*  DESCRIPTION : TYPE DEFINE                                           */
00006 /*  CPU TYPE    : NO ARCH                                               */
00007 /*                                                                      */
00008 /*                                         CopyRight(C) by MCM Co.,Ltd. */
00009 /************************************************************************/
00010 #ifndef USE_ROM_BIOS
00011 
00012 #include "typedef.h"
00013 #include "w5300.h"
00014 #include "global.h"
00015 #include "h8delay.h"
00016 
00017 #pragma section ROMDATA
00018 static const ushort ir_bit[] = { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 };
00019 
00020 static const uchar *sock_adr_tbl[] = {
00021     W5300_SOCKET_BASE + 0x000,
00022     W5300_SOCKET_BASE + 0x040,
00023     W5300_SOCKET_BASE + 0x080,
00024     W5300_SOCKET_BASE + 0x0c0,
00025     W5300_SOCKET_BASE + 0x100,
00026     W5300_SOCKET_BASE + 0x140,
00027     W5300_SOCKET_BASE + 0x180,
00028     W5300_SOCKET_BASE + 0x1c0
00029 };
00030 
00031 /************************************************************************/
00032 /*                                                                      */
00033 /* ソフトリセット                                                       */
00034 /*                                                                      */
00035 /************************************************************************/
00036 void w5300_soft_reset(void)
00037 {
00038     write_data16(MODE_REGISTER, MODE_INITIAL_DATA|MODE_SW_RESET);
00039     delay_1mS();
00040     while((read_data16(MODE_REGISTER) & MODE_SW_RESET)) ;
00041 }
00042 
00043 
00044 /************************************************************************/
00045 /*                                                                      */
00046 /* SOCKETの通信状態を取得                                               */
00047 /*                                                                      */
00048 /************************************************************************/
00049 ushort get_nic_status(short sock)
00050 {
00051     return read_data16(sock_adr_tbl[sock] + SOCK_STATUS) & 0xff;
00052 }
00053 
00054 
00055 /************************************************************************/
00056 /*                                                                      */
00057 /* コマンドの発行                                                       */
00058 /*                                                                      */
00059 /************************************************************************/
00060 void nic_command(short sock, ushort cmd)
00061 {
00062     write_data16((sock_adr_tbl[sock] + SOCK_COMMAND), cmd);
00063 }
00064 
00065 
00066 /************************************************************************/
00067 /*                                                                      */
00068 /* 指定ソケットの割り込みマスクセット                                   */
00069 /*                                                                      */
00070 /************************************************************************/
00071 void set_sock_ir_mask(ushort sockno, uchar flag)
00072 {
00073     if(flag) { sockno = read_data16(CMN_REG_IR) | ir_bit[sockno];    }  /* Set   */
00074     else     { sockno = read_data16(CMN_REG_IR) & (~ir_bit[sockno]); }  /* Clear */
00075 
00076     write_data16(CMN_REG_IR, sockno);
00077 }
00078 
00079 
00080 /************************************************************************/
00081 /*                                                                      */
00082 /* マスター割り込みのクリア                                             */
00083 /*                                                                      */
00084 /************************************************************************/
00085 void clear_master_ir(ushort sockno)
00086 {
00087     write_data16(CMN_REG_IR, ir_bit[sockno]);
00088 }
00089 
00090 
00091 /************************************************************************/
00092 /*                                                                      */
00093 /* 指定したソケットの割り込み状態取得                                   */
00094 /*                                                                      */
00095 /************************************************************************/
00096 ushort get_sock_ir(short socket)
00097 {
00098     return read_data16(sock_adr_tbl[socket] + SOCK_IR) & 0xff;
00099 }
00100 
00101 
00102 /************************************************************************/
00103 /*                                                                      */
00104 /* 指定したソケットの指定割り込みをクリア                               */
00105 /*                                                                      */
00106 /************************************************************************/
00107 void clear_sock_ir(short socket, ushort bit)
00108 {
00109     write_data16((sock_adr_tbl[socket] + SOCK_IR), bit);
00110 }
00111 
00112 
00113 /************************************************************************/
00114 /*                                                                      */
00115 /* 現在のソケット動作モード取得                                         */
00116 /*                                                                      */
00117 /************************************************************************/
00118 ushort get_socket_mode(short socket)
00119 {
00120     return read_data16(sock_adr_tbl[socket] + SOCK_MODE) & 0x3fff;
00121 }
00122 
00123 
00124 /************************************************************************/
00125 /*                                                                      */
00126 /* 指定ソケットのモードを設定                                           */
00127 /*                                                                      */
00128 /************************************************************************/
00129 void set_socket_mode(short socket, ushort mode)
00130 {
00131     write_data16((sock_adr_tbl[socket] + SOCK_MODE), mode);
00132 }
00133 
00134 
00135 /************************************************************************/
00136 /*                                                                      */
00137 /* 指定のソケットにMSSをセット                                       */
00138 /*                                                                      */
00139 /************************************************************************/
00140 void set_socket_mss(short socket, ushort mss)
00141 {
00142     write_data16((sock_adr_tbl[socket] + SOCK_MSSR), mss);
00143 }
00144 
00145 
00146 /************************************************************************/
00147 /*                                                                      */
00148 /* MAC Address をセット                                                 */
00149 /*                                                                      */
00150 /************************************************************************/
00151 void set_mac_adrs(void *mac_adr)
00152 {
00153     write_data16((CMN_MAC_ADDRESS + 0), *((short *)mac_adr + 0));
00154     write_data16((CMN_MAC_ADDRESS + 2), *((short *)mac_adr + 1));
00155     write_data16((CMN_MAC_ADDRESS + 4), *((short *)mac_adr + 2));
00156 }
00157 
00158 
00159 /************************************************************************/
00160 /*                                                                      */
00161 /* 指定のソケットの dest_macadr 設定                                    */
00162 /*                                                                      */
00163 /************************************************************************/
00164 void set_dest_macadr(short sock, void *mac_adr)
00165 {
00166 uchar *base;
00167 
00168     base = sock_adr_tbl[sock] + SOCK_DHADR;
00169     write_data16((base + 0), *((short *)mac_adr + 0));
00170     write_data16((base + 2), *((short *)mac_adr + 1));
00171     write_data16((base + 4), *((short *)mac_adr + 2));
00172 }
00173 
00174 
00175 /************************************************************************/
00176 /*                                                                      */
00177 /* 指定のアドレスにIPアドレスを設定                                   */
00178 /*                                                                      */
00179 /************************************************************************/
00180 void set_ip_data(void *to, void *data)
00181 {
00182     write_data16(((ubyte *)to + 0), *((ushort *)data + 0));
00183     write_data16(((ubyte *)to + 2), *((ushort *)data + 1));
00184 }
00185 
00186 
00187 /************************************************************************/
00188 /*                                                                      */
00189 /* 指定のソケットの dest_ip を取得                                      */
00190 /*                                                                      */
00191 /************************************************************************/
00192 ulong get_dest_ip_data(short sock)
00193 {
00194 uchar *base;
00195 
00196     base = sock_adr_tbl[sock] + SOCK_DIPR;
00197     return (read_data16(base) << 16) | read_data16(base + 2);
00198 }
00199 
00200 
00201 /************************************************************************/
00202 /*                                                                      */
00203 /* 指定のソケットに dest_ip をセット                                    */
00204 /*                                                                      */
00205 /************************************************************************/
00206 void set_dest_ip_data(short sock, ulong data)
00207 {
00208     set_ip_data((sock_adr_tbl[sock] + SOCK_DIPR), &data);
00209 }
00210 
00211 
00212 /************************************************************************/
00213 /*                                                                      */
00214 /* 指定ソケットに自ポート番号をセット                                   */
00215 /*                                                                      */
00216 /************************************************************************/
00217 void set_my_port_data(short sock, ushort port)
00218 {
00219     write_data16((sock_adr_tbl[sock] + SOCK_PORTR), port);
00220 }
00221 
00222 
00223 /************************************************************************/
00224 /*                                                                      */
00225 /* 指定のソケットに dest_port を設定                                    */
00226 /*                                                                      */
00227 /************************************************************************/
00228 void set_dest_port_data(short sock, ushort port)
00229 {
00230     write_data16((sock_adr_tbl[sock] + SOCK_DPORTR), port);
00231 }
00232 
00233 
00234 /************************************************************************/
00235 /*                                                                      */
00236 /* 指定ソケットの受信バッファFIFOアドレスを取得                     */
00237 /*                                                                      */
00238 /************************************************************************/
00239 void * get_rxfifo_adr(short sock)
00240 {
00241     return (sock_adr_tbl[sock] + SOCK_RX_FIFOR);
00242 }
00243 
00244 
00245 /************************************************************************/
00246 /*                                                                      */
00247 /* 指定ソケットへ送信データバイト数をセット                             */
00248 /*                                                                      */
00249 /************************************************************************/
00250 void set_tx_data_size(short sock, long len)
00251 {
00252     write_data16((sock_adr_tbl[sock] + SOCK_TX_WRSIZE + 0), (len >> 16));
00253     write_data16((sock_adr_tbl[sock] + SOCK_TX_WRSIZE + 2),         len);
00254 }
00255 
00256 
00257 /************************************************************************/
00258 /*                                                                      */
00259 /* 指定ソケットの送信バッファFIFOアドレスを取得                     */
00260 /*                                                                      */
00261 /************************************************************************/
00262 void * get_txfifo_adr(short sock)
00263 {
00264     return (sock_adr_tbl[sock] + SOCK_TX_FIFOR);
00265 }
00266 
00267 
00268 /************************************************************************/
00269 /*                                                                      */
00270 /* 指定ソケットの受信済みデータ数を取得                                 */
00271 /*                                                                      */
00272 /************************************************************************/
00273 long get_rx_recv_size(short sock)
00274 {
00275 uchar  *base;
00276 
00277     /* W5300のソケットレジスタのベースアドレスを取得 */
00278     base = sock_adr_tbl[sock] + SOCK_RX_RECVSIZE;
00279 
00280     return ((read_data16(base) << 16) | read_data16(base + 2)) & 0x1ffffL;
00281 }
00282 
00283 
00284 /************************************************************************/
00285 /*                                                                      */
00286 /* 指定ソケットの空き送信バッファバイト数を取得                         */
00287 /*                                                                      */
00288 /************************************************************************/
00289 long get_tx_free_size(short sock)
00290 {
00291 uchar  *base;
00292 
00293     /* W5300のソケットレジスタのベースアドレスを取得 */
00294     base = sock_adr_tbl[sock] + SOCK_TX_FREESIZE;
00295 
00296     return ((read_data16(base) << 16) | read_data16(base + 2)) & 0x1ffffL;
00297 }
00298 
00299 /************************************************************************/
00300 /*                                                                      */
00301 /* KeepAliveTimeの取得                                                  */
00302 /*                                                                      */
00303 /************************************************************************/
00304 ushort get_kpalvtimer(ushort sock)
00305 {
00306     return read_data16(sock_adr_tbl[sock] + SOCK_KPALVTR) & 0xff;
00307 }
00308 
00309 /************************************************************************/
00310 /*                                                                      */
00311 /* KeepAliveTimeの設定                                                  */
00312 /*                                                                      */
00313 /************************************************************************/
00314 void set_kpalvtimer(ushort sock, ushort time)
00315 {
00316     write_data16((sock_adr_tbl[sock] + SOCK_KPALVTR), time);
00317     return ;
00318 }
00319 #endif /* nodef(USE_ROM_BIOS) */

※40行目、レジスタの指定が間違っていた為に修正(2011.12.09)

100%デバッグ完了していませんので、上記ソースは変更されるかもしれません。
次は、簡単にUDP・TCP通信を行う為のAPI群を書きます。
WIZNet W5300/4

最終更新のRSS
Last-modified: 2011-12-09 (金) 14:16:05 2389日前
HTML convert time: 0.034 sec.