mbedに
組み込み用イーサネットモジュールWIZ820io(W5200)を繋げてみた。
WIZ820io mbed
J2P1 GND ----- p1 GND
J1P3 MOSI ---- p11 SPI(mosi)
J2P6 MISO ---- p12 SPI(miso)
J1P4 SCK ----- p13 SPI(sck)
J1P5 nSS ----- p14
J2P5 nRESET -- p15
J2P3 3V3D ---- p40 VOUT
J2P4 PWDN ---- GND
とりあえずmbedのハンドブックのようにイーサーネットのパケットを読み取れるまでは出来た。
しかし、なぜかmbedに比べてパケットサイズが極端に大きい。何か使い方を勘違いしてるのだろう。
#include "mbed.h"
#include "w5100.h"
Serial pc(USBTX, USBRX);
extern W5100Class W5100;
class MyEthernet {
bool _init_flag;
void _init() {
W5100.init();
W5100.writeSnMR(0, 0x40|SnMR::MACRAW); // S0_MR_MACRAW(0x04) and MAC filter
W5100.execCmdSn(0, Sock_OPEN);
}
public:
MyEthernet() {
_init_flag = false;
}
int receive() {
if (!_init_flag) {
_init_flag = true;
_init();
}
return W5100.readSnRX_RSR(0);
}
int read(char* data, int size) {
int size2 = W5100.getRXReceivedSize(0);
unsigned char *p = new unsigned char[size2];
W5100.recv_data_processing(0, p, size2);
W5100.execCmdSn(0, Sock_RECV);
int size3 = (int)(*p)<<8 | *(p+1);
delete p;
if (size3 > size) {
size3 = size;
}
memcpy(data, p+2, size3);
return size3;
}
};
MyEthernet eth2;
int main() {
pc.baud(460800);
char buf[0x600];
while(1) {
int size = eth2.receive();
if(size > 0) {
printf("WIZ820io ethernet packet size: %d\n", size);
eth2.read(buf, size);
printf("Destination: %02X:%02X:%02X:%02X:%02X:%02X\n",
buf[0], buf[1], buf[2], buf[3], buf[4], buf[5]);
printf("Source: %02X:%02X:%02X:%02X:%02X:%02X\n",
buf[6], buf[7], buf[8], buf[9], buf[10], buf[11]);
}
wait(1);
printf("S0_RX_RSR:%d, S0_RX_RD:%d, S0_RX_WR:%d\n",
W5100.readSnRX_RSR(0), W5100.readSnRX_RD(0), W5100.readSnRX_WR(0));
}
}
---