#include #include //////////////////////////////////////////////////////////////////////////////// // ATmega8: // начальное: RC - 1 МHz: Low E1; Higt D9; // RC - 8 МHz: Low E4; Higt D9; // кварц - 8 МHz: Low EF; Higt C9 (CKOPT -on); XTAL2 – выход--V // кварц - 8 МHz: Low EF; Higt D9 (CKOPT -off); // XTAL1 – вход: Low E0; Higt D9 //////////////////////////////////////////////////////////////////////////////// // ATmega328: // начальное: RC -1 МHz: Higt D9; Ext 07; Lok 3F; Low 62 // RC -8 МHz: Higt D9; Ext 07; Lok 3F; Low E2 // кварц - 20 МHz: Higt D9; Ext 07; Lok 3F; Low E7(CKOUT -off); XTAL2 – выход--V // кварц - 20 МHz: Higt D9; Ext 07; Lok 3F; Low E7(CKOUT -on); CKOUT – выход //////////////////////////////////////////////////////////////////////////////// // W5500: // 3,3 V - 80 mA. - 10 МБит/c // 3,3 V - 135 mA. - 100 МБит/c // Socket_0 - MACRAW // Socket_1 - UDP // Socket_2 - TCP //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////// счёт: unsigned char x; // x - счёт unsigned char x1; // x1 - счёт unsigned char x2; // x2 - счёт //////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// SPI: unsigned char tx; // tx - SPI unsigned char rx; // rx - SPI ////////////////////////////////// SPI: void SPI(void) { SPDR=tx; while(!(SPSR & (1<<7))); rx=SPDR; } //////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// W5500: unsigned int add; // add - адрес данных W5500 (RX/TX) unsigned int len; // len - длина данных W5500 (RX/TX) //////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////// Socket_2 - TCP: unsigned int tm_SOCKET; // таймаут SOCKET. /////////////////////////////////////////////// RX Data HTTP: //GET / HTTP/1.1 unsigned char bufer_RX_W5500[10]={ 0,0,0,0,0,0,0,0,0,0 }; /////////////////////////////////////////////// TX Data HTTP: //GET / HTTP/1.1 unsigned char bufer_TX_W5500_HTTP[]={ "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n Привет !|" }; //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// void main(void) { /////////////////////////////////////////////// SPI (мастер) DDRB.5=1; // выход SCK PORTB.5=0; // выход SCK DDRB.4=0; // вход MISO PORTB.4=0; // вход MISO DDRB.3=1; // выход MOSI PORTB.3=0; // выход MOSI DDRB.2=1; // выход SS (! SS настроен на выход) PORTB.2=1; // выход SS (! SS настроен на выход) /////////////////////////////////////////////// W5500 DDRD.0=0; // вход INT W5500 PORTD.0=1; // вход INT W5500 + DDRD.5=1; // выход RESET W5500 PORTD.5=1; // выход RESET W5500 DDRB.0=1; // выход SS W5500 PORTB.0=1; // выход SS W5500 //////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// SPI: SPCR=0x50; // 8 МГц/4 = 2 МГц -режим мастер //////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////// инициализация W5500: // 00000000 - Address Registers (автоматическая инкрементная адресация +1). // 00000000 - Address Registers (автоматическая инкрементная адресация +1). /////////////////////////////////////////////// // Control Registers: // 0000 0... - BSB [4:0] блок // .... .0.. - R/W - 0 чтение/1 запись // .... ..00 - OP Mode (VDM)- данные переменной длины (Длина данных контролируется SS). /////////////////////////////////////////////// RESET W5500: PORTD.5=0; // delay_ms(100); // PORTD.5=1; // delay_ms(100); // //////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////// W5500 PHY: // перед настройкой PHY сделать программный Cброс PHY: PORTB.0=0; // SS W5500 tx=0x00; SPI(); tx=0x2E; SPI(); tx=0x04; SPI(); // Address Registers + Control Registers tx=0x00; SPI(); // Data -0x00 tx=0x00; SPI(); // Data -0x00 PORTB.0=1; // SS W5500 // пишем режим PHY: // 1... .... RST - 1. // .1.. .... программная настройка режима - 1 // ..0. .... 10BT Full-duplex, Auto-negotiation disabled / Power Down mode // ...0 .... 10BT Full-duplex, Auto-negotiation disabled / Power Down mode // .... 1... 10BT Full-duplex, Auto-negotiation disabled / Power Down mode // .... .1.. Duplex Status // .... ..0. Speed Status // .... ...1 Link Status PORTB.0=0; // SS W5500 tx=0x00; SPI(); tx=0x2E; SPI(); tx=0x04; SPI(); // Address Registers + Control Registers tx=0xC8; SPI(); // Data -0xC8 (10 Мбит/с, Full-duplex) tx=0x00; SPI(); // Data -0x00 PORTB.0=1; // SS W5500 //////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////// настройка W5500: PORTB.0=0; // SS W5500 tx=0x00; SPI(); tx=0x01; SPI(); tx=0x04; SPI(); // Address Registers + Control Registers // -шлюз tx=192; SPI(); // Gateway Address (GAR0) (0x0001 - Address) tx=168; SPI(); // Gateway Address (GAR1) (0x0002 - Address) tx=0; SPI(); // Gateway Address (GAR2) (0x0003 - Address) tx=1; SPI(); // Gateway Address (GAR3) (0x0004 - Address) // -маска tx=255; SPI(); // Subnet Mask Address (SUBR0) (0x0005 - Address) tx=255; SPI(); // Subnet Mask Address (SUBR1) (0x0006 - Address) tx=255; SPI(); // Subnet Mask Address (SUBR2) (0x0007 - Address) tx=0; SPI(); // Subnet Mask Address (SUBR3) (0x0008 - Address) // -MAC (Wiznet_01:02:03) tx=0x00; SPI(); // Source Hardware Address (SHAR0) (0x0009 - Address) tx=0x08; SPI(); // Source Hardware Address (SHAR1) (0x000A - Address) tx=0xDC; SPI(); // Source Hardware Address (SHAR2) (0x000B - Address) tx=0x01; SPI(); // Source Hardware Address (SHAR3) (0x000C - Address) tx=0x02; SPI(); // Source Hardware Address (SHAR4) (0x000D - Address) tx=0x03; SPI(); // Source Hardware Address (SHAR5) (0x000E - Address) // -IP tx=192; SPI(); // Source IP Address (SIPR0) (0x000F - Address) tx=168; SPI(); // Source IP Address (SIPR1) (0x0010 - Address) tx=0; SPI(); // Source IP Address (SIPR2) (0x0011 - Address) tx=3; SPI(); // Source IP Address (SIPR3) (0x0012 - Address) PORTB.0=1; // SS W5500 //////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////// Socket_2 - TCP: // Протокол: пишем протокол TCP Socket_2: PORTB.0=0; // SS W5500 tx=0x00; SPI(); tx=0x00; SPI(); tx=0x4C; SPI(); // Address Registers + Control Registers tx=0x01; SPI(); // Data -0x01 (protocol TCP). PORTB.0=1; // SS W5500 // Порт: пишем Socket_2 Source Port: PORTB.0=0; // SS W5500 tx=0x00; SPI(); tx=0x04; SPI(); tx=0x4C; SPI(); // Address Registers + Control Registers tx=0x00; SPI(); // Data -0x00 (порт 00) tx=0x50; SPI(); // Data -0x50 (порт 80) PORTB.0=1; // SS W5500 //////////////////////////////////////////////////////////////////////////////// Socket_2_OPEN: //////////////////////////////////////////////////////////////////////////////// // пишем команду OPEN Socket_2: PORTB.0=0; // SS W5500 tx=0x00; SPI(); tx=0x01; SPI(); tx=0x4C; SPI(); // Address Registers + Control Registers tx=0x01; SPI(); // Data -0x01 (OPEN) PORTB.0=1; // SS W5500 //////////////////////////////////////////////////////////////////////////////// // пишем команду LISTEN Socket_2: PORTB.0=0; // SS W5500 tx=0x00; SPI(); tx=0x01; SPI(); tx=0x4C; SPI(); // Address Registers + Control Registers tx=0x02; SPI(); // Data -0x02 (LISTEN) PORTB.0=1; // SS W5500 //////////////////////////////////////////////////////////////////////////////// Socket_2_LISTEN: //////////////////////////////////////////////////////////////////////////////// // читаем статус Socket_2: PORTB.0=0; // SS W5500 tx=0x00; SPI(); tx=0x03; SPI(); tx=0x48; SPI(); // Address Registers + Control Registers tx=0x00; SPI(); x1 = rx; // Data -0x14 (SOCK_LISTEN) PORTB.0=1; // SS W5500 ///////////////////////////////////////////////////////// Socket_2_LISTEN: (Ждём SYN): //0x14-LISTEN, 0x16-SYN, 0x17-ESTABLISHED, 0x11-DISCON, //0x1C-CLOSE_WAIT, 0x18-FIN_WAIT, 0x00-FIN/ACK. if (x1 != 0x14) goto Socket_2_ESTABLISHED; // > Socket_2_ESTABLISHED goto Socket_2_LISTEN; // > Socket_2_LISTEN //////////////////////////////////////////////////////////////////////////////// Socket_2_ESTABLISHED: delay_ms(1); //////////////////////////////////////////////////////////////////////////////// // Читаем размер принятых данных Socket_2: PORTB.0=0; // SS W5500 tx=0x00; SPI(); tx=0x26; SPI(); tx=0x48; SPI(); // Address Registers + Control Registers tx=0x00; SPI(); x1 = rx; // Data -Sn_RX_RSR0 -размер принятых данных tx=0x00; SPI(); x2 = rx; // Data -Sn_RX_RSR1 -размер принятых данных PORTB.0=1; // SS W5500 //////////////////////////////////////////////////////////// таймаут FIFO_RX Socket_2: tm_SOCKET++; if (tm_SOCKET > 1000) { // цикл - 1c ждём Data goto Socket_2_DISCON; // FIFO_RX пуст > Socket_2_DISCON //goto TX_Socket_2; // > TX, FIN }; //////////////////////////////////////////////////////////////////////////////// // проверка FIFO_RX: len = x1; len = (len<<8)|x2; // размер принятых данных // 0x0000 if (len == 0x00) goto Socket_2_ESTABLISHED; // FIFO_RX пуст > ждём Data //////////////////////////////////////////////////////////////////////////////// // Читаем начальный адрес принятых данных Socket_2: PORTB.0=0; // SS W5500 tx=0x00; SPI(); tx=0x28; SPI(); tx=0x48; SPI(); // Address Registers + Control Registers tx=0x00; SPI(); x1 = rx; // Data -Sn_RX_RD0 -начальный адрес принятых данных tx=0x00; SPI(); x2 = rx; // Data -Sn_RX_RD1 -начальный адрес принятых данных PORTB.0=1; // SS W5500 // начальный адрес принятых данных Socket_2: add = x1; add = (add<<8)|x2; // 0x0000 //////////////////////////////////////////////////////////////////////////////// // Читаем данные с начального адреса Socket_2: x1 = (add>>8); x2 = add; PORTB.0=0; // SS W5500 tx=x1; SPI(); tx=x2; SPI(); tx=0x58; SPI(); // Address Registers + Control Registers ////////////////////////////////////////// Data RX W5500: //GET / HTTP/1.1 for (x=0; x<8; x++) { tx=0; SPI(); bufer_RX_W5500[x] = rx; }; PORTB.0=1; // SS W5500 //////////////////////////////////////////////////////////////////////////////// // Пишем указатель RX Socket_2 до увеличенного значения: add = add + len; //add - начальный адрес принятых данных // 0x0000 //len - размер принятых данных // 0x0000 x1 = (add>>8); x2 = add; PORTB.0=0; // SS W5500 tx=0x00; SPI(); tx=0x28; SPI(); tx=0x4C; SPI(); // Address Registers + Control Registers tx=x1; SPI(); // Data -Sn_RX_RD0 -конечный адрес принятых данных tx=x2; SPI(); // Data -Sn_RX_RD1 -конечный адрес принятых данных PORTB.0=1; // SS W5500 //////////////////////////////////////////////////////////////////////////////// // Пишем команду завершение приема Socket_2: PORTB.0=0; // SS W5500 tx=0x00; SPI(); tx=0x01; SPI(); tx=0x4C; SPI(); // Address Registers + Control Registers tx=0x40; SPI(); // Data -0x40 (RECV) PORTB.0=1; // SS W5500 //////////////////////////////////////////////////////////////////////////////// //TX_Socket_2: //////////////////////////////////////////////////////////////////////////////// // Читаем начальный адрес для записи данных Socket_2: PORTB.0=0; // SS W5500 tx=0x00; SPI(); tx=0x24; SPI(); tx=0x48; SPI(); // Address Registers + Control Registers tx=0x00; SPI(); x1 = rx; // Data -Sn_TX_WR0 -начальный адрес для записи данных tx=0x00; SPI(); x2 = rx; // Data -Sn_TX_WR1 -начальный адрес для записи данных PORTB.0=1; // SS W5500 // начальный адрес для записи данных: add = x1; add = (add<<8)|x2; // 0x0000 //////////////////////////////////////////////////////////////////////////////// // начальный адрес для записи данных: x1 = (add>>8); x2 = add; // Пишем данные Socket_2 с начального адреса: PORTB.0=0; // SS W5500 tx=x1; SPI(); tx=x2; SPI(); tx=0x54; SPI(); // Address Registers + Control Registers // сброс len len = 0; // 0x0000 ////////////////////////////////////////// Data TX W5500 HTTP: //GET / HTTP/1.1 //unsigned char bufer_TX_W5500_HTTP[]={ //"HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n Привет !|" //}; //bufer_TX_W5500_HTTP for (x=0; bufer_TX_W5500_HTTP[x] != '|' ; x++) { tx=bufer_TX_W5500_HTTP[x]; SPI(); len++; }; PORTB.0=1; // SS W5500 //////////////////////////////////////////////////////////////////////////////// // Пишем указатель TX Socket_2 до увеличенного значения: add = add + len; // add - конечный адрес переданных данных // 0x0000 // len - размер переданных данных // 0x0000 x1 = (add>>8); x2 = add; PORTB.0=0; // SS W5500 tx=0x00; SPI(); tx=0x24; SPI(); tx=0x4C; SPI(); // Address Registers + Control Registers tx=x1; SPI(); // Data -Sn_TX_WR0 -конечный адрес передачи данных tx=x2; SPI(); // Data -Sn_TX_WR1 -конечный адрес передачи данных PORTB.0=1; // SS W5500 //////////////////////////////////////////////////////////////////////////////// // Пишем команду передачи Socket_2: PORTB.0=0; // SS W5500 tx=0x00; SPI(); tx=0x01; SPI(); tx=0x4C; SPI(); // Address Registers + Control Registers tx=0x20; SPI(); // Data -0x20 (SEND) PORTB.0=1; // SS W5500 //////////////////////////////////////////////////////////////////////////////// //if (Sn_CR == 0x00); // окончание передачи -Sn_CR = 0x00. Socket_2_DISCON: //////////////////////////////////////////////////////////////////////////////// // передаем FIN: PORTB.0=0; // SS W5500 tx=0x00; SPI(); tx=0x01; SPI(); tx=0x4C; SPI(); // Address Registers + Control Registers tx=0x08; SPI(); // Data -0x08 (DISCON) PORTB.0=1; // SS W5500 //////////////////////////////////////////////////////////////////////////////// tm_SOCKET = 0; // сброс таймаут Socket_2 (FIN) Socket_2_FIN: //////////////////////////////////////////////////////////////////////////////// // читаем статус Socket_2: PORTB.0=0; // SS W5500 tx=0x00; SPI(); tx=0x03; SPI(); tx=0x48; SPI(); // Address Registers + Control Registers tx=0x00; SPI(); x1 = rx; // Data -0x00 (FIN/ACK получен) PORTB.0=1; // SS W5500 ///////////////////////////////////////////////////////////////////////////////// DISCON: // -0x18 SOCK_FIN_WAIT -сокет закрывается > -0x00 FIN/ACK получен if (x1 == 0x00) goto Socket_2_CLOSE;// FIN/ACK получен > Socket_2_CLOSE ////////////////////////////////////////////// таймаут SOCKET_1_DISCON: tm_SOCKET++; // таймаут Socket_2 (FIN) if (tm_SOCKET > 1000) { // цикл - 1c ждём FIN/ACK goto Socket_2_CLOSE; // нет FIN/ACK > Socket_2_CLOSE }; //////////////////////////////////////////////////////////////////////////////// delay_ms(1); goto Socket_2_FIN; // > Socket_2_FIN (Ждём FIN/ACK) Socket_2_CLOSE: tm_SOCKET = 0; // сброс таймаут SOCKET (FIN) //////////////////////////////////////////////////////////////////////////////// // закрываем Socket_2: PORTB.0=0; // SS W5500 tx=0x00; SPI(); tx=0x01; SPI(); tx=0x4C; SPI(); // Address Registers + Control Registers tx=0x10; SPI(); // Data -0x10 (CLOSE) PORTB.0=1; // SS W5500 //////////////////////////////////////////////////////////////////////////////// goto Socket_2_OPEN; // > Socket_2_OPEN }