From edccf1d1dc8b4358cae57440593305b7c283af8f Mon Sep 17 00:00:00 2001 From: Oliver Schmidt Date: Sat, 25 Apr 2020 23:11:30 +0200 Subject: [PATCH] Fixed physical address calculation. The address mask to use is of course dependent on the actual socket memory size. --- apps/w5100.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/apps/w5100.c b/apps/w5100.c index 1c9afa6..e69a4f1 100644 --- a/apps/w5100.c +++ b/apps/w5100.c @@ -44,6 +44,7 @@ static volatile uint8_t* w5100_addr_lo; static uint16_t addr_basis[2]; static uint16_t addr_limit[2]; +static uint16_t addr_mask [2]; static void set_addr(uint16_t addr) { @@ -148,6 +149,7 @@ void w5100_config(uint8_t eth_init) addr_basis[do_send] = addr [do_send] + size[sizes & 3]; addr_limit[do_send] = addr_basis[do_send] + size[sizes >> 2 & 3]; + addr_mask [do_send] = size[sizes >> 2 & 3] - 1; } } } @@ -255,7 +257,8 @@ uint16_t w5100_data_request(bool do_send) 0x0524}; // Socket 1 TX Write Pointer Register // Calculate and set physical address - uint16_t addr = get_word(reg[do_send]) & 0x0FFF | addr_basis[do_send]; + uint16_t addr = get_word(reg[do_send]) & addr_mask [do_send] + | addr_basis[do_send]; set_addr(addr); // Access to *w5100_data is limited both by ...