#include "w6300.h" #include "wizchip_qspi_pio.h" static uint8_t make_opcode(uint32_t addr, uint8_t rw) { return static_cast((addr & 0xFF) | rw | _WIZCHIP_QSPI_MODE_); } static uint16_t make_addr(uint32_t addr) { return static_cast((addr & 0x00FFFF00) >> 8); } void WIZCHIP_WRITE(uint32_t AddrSel, uint8_t wb) { WIZCHIP_CRITICAL_ENTER(); wizchip_pio_frame_start(); wizchip_pio_write(make_opcode(AddrSel, W6300_SPI_WRITE), make_addr(AddrSel), &wb, 1); wizchip_pio_frame_end(); WIZCHIP_CRITICAL_EXIT(); } uint8_t WIZCHIP_READ(uint32_t AddrSel) { uint8_t ret[2] = {0}; WIZCHIP_CRITICAL_ENTER(); wizchip_pio_frame_start(); wizchip_pio_read(make_opcode(AddrSel, W6300_SPI_READ), make_addr(AddrSel), ret, 1); wizchip_pio_frame_end(); WIZCHIP_CRITICAL_EXIT(); return ret[0]; } void WIZCHIP_WRITE_BUF(uint32_t AddrSel, uint8_t* pBuf, datasize_t len) { WIZCHIP_CRITICAL_ENTER(); wizchip_pio_frame_start(); wizchip_pio_write(make_opcode(AddrSel, W6300_SPI_WRITE), make_addr(AddrSel), pBuf, len); wizchip_pio_frame_end(); WIZCHIP_CRITICAL_EXIT(); } void WIZCHIP_READ_BUF(uint32_t AddrSel, uint8_t* pBuf, datasize_t len) { WIZCHIP_CRITICAL_ENTER(); wizchip_pio_frame_start(); wizchip_pio_read(make_opcode(AddrSel, W6300_SPI_READ), make_addr(AddrSel), pBuf, len); wizchip_pio_frame_end(); WIZCHIP_CRITICAL_EXIT(); } uint16_t getSn_TX_FSR(uint8_t sn) { uint16_t prev_val = -1, val = 0; do { prev_val = val; val = WIZCHIP_READ(_Sn_TX_FSR_(sn)); val = (val << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(_Sn_TX_FSR_(sn), 1)); } while (val != prev_val); return val; } uint16_t getSn_RX_RSR(uint8_t sn) { uint16_t prev_val = -1, val = 0; do { prev_val = val; val = WIZCHIP_READ(_Sn_RX_RSR_(sn)); val = (val << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(_Sn_RX_RSR_(sn), 1)); } while (val != prev_val); return val; } void wiz_send_data(uint8_t sn, uint8_t *wizdata, uint16_t len) { uint16_t ptr = getSn_TX_WR(sn); uint32_t addrsel = ((uint32_t)ptr << 8) + WIZCHIP_TXBUF_BLOCK(sn); WIZCHIP_WRITE_BUF(addrsel, wizdata, len); ptr += len; setSn_TX_WR(sn, ptr); } void wiz_recv_data(uint8_t sn, uint8_t *wizdata, uint16_t len) { if (len == 0) return; uint16_t ptr = getSn_RX_RD(sn); uint32_t addrsel = ((uint32_t)ptr << 8) + WIZCHIP_RXBUF_BLOCK(sn); WIZCHIP_READ_BUF(addrsel, wizdata, len); ptr += len; setSn_RX_RD(sn, ptr); } void wiz_recv_ignore(uint8_t sn, uint16_t len) { setSn_RX_RD(sn, getSn_RX_RD(sn) + len); } void wiz_delay_ms(uint32_t milliseconds) { for (uint32_t i = 0; i < milliseconds; i++) { setTCNTRCLR(0xff); while (getTCNTR() < 0x0a) {} } } #if (_PHY_IO_MODE_ == _PHY_IO_MODE_MII_) void wiz_mdio_write(uint8_t phyregaddr, uint16_t var) { setPHYRAR(phyregaddr); setPHYDIR(var); setPHYACR(PHYACR_WRITE); while (getPHYACR()); } uint16_t wiz_mdio_read(uint8_t phyregaddr) { setPHYRAR(phyregaddr); setPHYACR(PHYACR_READ); while (getPHYACR()); return getPHYDOR(); } #endif