STATIC void wiznet5k_init(void) { // SPI configuration SPI_InitTypeDef *init = &wiznet5k_obj.spi->spi->Init; init->Mode = SPI_MODE_MASTER; init->Direction = SPI_DIRECTION_2LINES; init->DataSize = SPI_DATASIZE_8BIT; init->CLKPolarity = SPI_POLARITY_LOW; // clock is low when idle init->CLKPhase = SPI_PHASE_1EDGE; // data latched on first edge, which is rising edge for low-idle init->NSS = SPI_NSS_SOFT; init->BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2; // clock freq = f_PCLK / this_prescale_value; Wiz820i can do up to 80MHz init->FirstBit = SPI_FIRSTBIT_MSB; init->TIMode = SPI_TIMODE_DISABLED; init->CRCCalculation = SPI_CRCCALCULATION_DISABLED; init->CRCPolynomial = 7; // unused spi_init(wiznet5k_obj.spi, false); mp_hal_pin_output(wiznet5k_obj.cs); mp_hal_pin_output(wiznet5k_obj.rst); // Reset the chip mp_hal_pin_low(wiznet5k_obj.rst); mp_hal_delay_ms(1); // datasheet says 2us mp_hal_pin_high(wiznet5k_obj.rst); mp_hal_delay_ms(150); // datasheet says 150ms // Set physical interface callbacks reg_wizchip_cris_cbfunc(wiz_cris_enter, wiz_cris_exit); reg_wizchip_cs_cbfunc(wiz_cs_select, wiz_cs_deselect); reg_wizchip_spi_cbfunc(wiz_spi_read, wiz_spi_write); // Configure 16k buffers for fast MACRAW uint8_t sn_size[16] = {16, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0}; ctlwizchip(CW_INIT_WIZCHIP, sn_size); // Seems we need a small delay after init mp_hal_delay_ms(250); // Hook the Wiznet into lwIP wiznet5k_lwip_init(&wiznet5k_obj); }
/* *System initialize */ uint8_t wizSystemInit(void) { uint8_t W5500SockBufSize[2][8] = {{2,2,2,2,2,2,2,2,},{2,2,2,2,2,2,2,2}}; uint32_t tickStart; /* spi function register */ reg_wizchip_spi_cbfunc(W5500ReadByte, W5500WriteByte); /* CS function register */ reg_wizchip_cs_cbfunc(W5500Select, W5500DeSelect); /* Critical section */ reg_wizchip_cris_cbfunc(spiMutexEnter,spiMutexExit); //W5500Select(); if(ctlwizchip(CW_INIT_WIZCHIP,(void*)W5500SockBufSize) == -1) { #if WIZSYSTEM_DEBUG == 1 printf("W5500 initialized fail.\r\n"); #endif return -1; } /*Set network information by default*/ wizchip_setnetinfo(&NetInfo); tickStart = HAL_GetTick(); do{//check phy status. randomKey++; if((HAL_GetTick() - tickStart) > NETINFO_LINK_TIMEOUT) { #if WIZSYSTEM_DEBUG == 1 printf("Ethernet Link timeout.\r\n"); #endif return -1; } }while(!isLinked()); return 1; }