#include #include //Define Base Registers #define W5500_COMMON_BASE 0x0000 #define W5500_SOCKET0_BASE 0x4000 #define W5500_TXBUF_BASE 0x8000 //W5500 Commands #define W5500_WRITE 0x04 #define W5500_READ 0x00 //Function Definition void spi_init(void); void spi_write(uint8_t data); uint8_t spi_read(void); uint8_t w5500_read(uint16_t addr, uint8_t ctrl_byte); void w5500_write(uint16_t addr, uint8_t ctrl_byte, uint8_t data); //Variable Definitions int counter = 0; uint8_t data[] = "XYZ"; uint16_t len = sizeof(data) - 1; void main(void) { WDTCTL = WDTPW + WDTHOLD; spi_init(); spi_write(5); //W5500: Software Reset w5500_write(0x0000, 0x04, 0x80); //Software Reset for(counter=0; counter<1000; counter++); //W5500: MAC Address-00.08.DC.AB.CD.EF w5500_write(0x0009, 0x04, 0x00); w5500_write(0x000A, 0x04, 0x08); w5500_write(0x000B, 0x04, 0xDC); w5500_write(0x000C, 0x04, 0xAB); w5500_write(0x000D, 0x04, 0xCD); w5500_write(0x000E, 0x04, 0xEF); //W5500: IP Address-192.168.0.10 w5500_write(0x000F, 0x04, 192); w5500_write(0x0010, 0x04, 168); w5500_write(0x0011, 0x04, 0); w5500_write(0x0012, 0x04, 10); //W5500: Subnetzmask-255.255.255.0 w5500_write(0x0005, 0x04, 255); w5500_write(0x0006, 0x04, 255); w5500_write(0x0007, 0x04, 255); w5500_write(0x0008, 0x04, 0); //W5500: Gateway-192.168.0.1 w5500_write(0x0001, 0x04, 192); w5500_write(0x0002, 0x04, 168); w5500_write(0x0003, 0x04, 0); w5500_write(0x0004, 0x04, 1); //W5500: Socket UDP w5500_write(0x4000, 0x0C, 0x02); //W5500: PORT 5000 w5500_write(0x4004, 0x0C, 0x13); w5500_write(0x4005, 0x0C, 0x88); //W5500: OPEN Socket w5500_write(0x4001, 0x0C, 0x01); //W5500: Data Pointer uint8_t tx_wr0 = w5500_read(0x0024, 0x0C); uint8_t tx_wr1 = w5500_read(0x0025, 0x0C); //W5500: Transfer Data for (uint16_t i = 0; i < len; i++) { w5500_write(W5500_TXBUF_BASE + i, 0x14, data[i]); } //W5500: Data length w5500_write(W5500_SOCKET0_BASE + 0x20, 0x0C, (len >> 8) & 0xFF); w5500_write(W5500_SOCKET0_BASE + 0x21, 0x0C, len & 0xFF); //W5500: Send Command w5500_write(W5500_SOCKET0_BASE + 0x01, 0x0C, 0x20); //W5500: Wait while (!(w5500_read(W5500_SOCKET0_BASE + 0x02, 0x0C) & 0x10)); //W5500: Clear w5500_write(W5500_SOCKET0_BASE + 0x02, 0x0C, 0x10); //I/O PIN P1OUT |= BIT0; P1DIR |= BIT0; while (1) { P1OUT ^= BIT0; } } //Function Declarations //----------------------------------------------spi_init void spi_init(void) { BCSCTL1 = CALBC1_1MHZ; DCOCTL = CALDCO_1MHZ; P1SEL |= BIT5 + BIT6 + BIT7; P1SEL2 |= BIT5 + BIT6 + BIT7; UCB0CTL1 = UCSWRST; UCB0CTL0 = UCCKPH | UCMSB | UCMST | UCSYNC; UCB0CTL1 = UCSSEL_2 | UCSWRST; UCB0BR0 = 2; UCB0BR1 = 0; UCB0CTL1 &= ~UCSWRST; } //----------------------------------------------END //----------------------------------------------spi_write void spi_write(uint8_t data) { while (!(IFG2 & UCB0TXIFG)); UCB0TXBUF = data; while (!(IFG2 & UCB0RXIFG)); volatile uint8_t dummy = UCB0RXBUF; } //----------------------------------------------END //----------------------------------------------spi_read uint8_t spi_read(void) { while (!(IFG2 & UCB0TXIFG)); UCB0TXBUF = 0x00; while (!(IFG2 & UCB0RXIFG)); return UCB0RXBUF; } //----------------------------------------------END //----------------------------------------------w5500_write void w5500_write(uint16_t addr, uint8_t ctrl_byte, uint8_t data) { spi_write((addr >> 8) & 0xFF); // Address high byte spi_write(addr & 0xFF); // Address low byte spi_write(ctrl_byte | W5500_WRITE); spi_write(data); } //----------------------------------------------END //----------------------------------------------w5500_read uint8_t w5500_read(uint16_t addr, uint8_t ctrl_byte) { spi_write((addr >> 8) & 0xFF); spi_write(addr & 0xFF); spi_write(ctrl_byte | W5500_READ); return spi_read(); } //----------------------------------------------END