From 199237ec6ef8240bf9f6f8bbb9e43f2a5ef1d0a5 Mon Sep 17 00:00:00 2001 From: lilian Date: Wed, 30 Nov 2016 08:19:25 +0100 Subject: [PATCH 1/4] Fixes Bug(s) --- core/include/esp/spi.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/include/esp/spi.h b/core/include/esp/spi.h index 4b31144..ca11720 100644 --- a/core/include/esp/spi.h +++ b/core/include/esp/spi.h @@ -317,9 +317,9 @@ static inline void spi_set_command(uint8_t bus,uint8_t bits, uint16_t data) static inline void spi_set_address(uint8_t bus,uint8_t bits, uint32_t data) { if(!bits) return ; - SPI(bus).USER1 = SET_FIELD(SPI(bus).USER1, SPI_USER1_ADDR_BITLEN, --bits); SPI(bus).USER0 |= SPI_USER0_ADDR ; //enable ADDRess function in SPI module SPI(bus).ADDR = data<<(32-bits) ; //align address data to high bits + SPI(bus).USER1 = SET_FIELD(SPI(bus).USER1, SPI_USER1_ADDR_BITLEN, --bits); } /** From 762f73515bb1c181a57c1e60fe41a452fd2508ae Mon Sep 17 00:00:00 2001 From: lilian Date: Mon, 5 Dec 2016 09:03:02 +0100 Subject: [PATCH 2/4] Second bug. fix attempt. --- core/esp_spi.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/core/esp_spi.c b/core/esp_spi.c index 720da18..4bbe541 100644 --- a/core/esp_spi.c +++ b/core/esp_spi.c @@ -221,6 +221,26 @@ uint32_t spi_transfer_32(uint8_t bus, uint32_t data) return res; } +static void _rearm_extras_bit(uint8_t bus, bool arm) { + + if(!_minimal_pins[bus]) return ; + static uint8_t status = 0 ; + + if (arm) + { + if (status & 0x01) SPI(bus).USER0 |= (SPI_USER0_ADDR) ; + if (status & 0x02) SPI(bus).USER0 |= (SPI_USER0_COMMAND) ; + if (status & 0x04) SPI(bus).USER0 |= (SPI_USER0_DUMMY | SPI_USER0_MISO); + status = 0 ; + } + else + { + if (SPI(bus).USER0 & SPI_USER0_ADDR) { SPI(bus).USER0 &= ~(SPI_USER0_ADDR) ; status |= 1 ; } + if (SPI(bus).USER0 & SPI_USER0_COMMAND) { SPI(bus).USER0 &= ~(SPI_USER0_COMMAND) ; status |= 2 ; } + if (SPI(bus).USER0 & SPI_USER0_DUMMY) { SPI(bus).USER0 &= ~(SPI_USER0_DUMMY | SPI_USER0_MISO); status |= 4 ; } + } +} + size_t spi_transfer(uint8_t bus, const void *out_data, void *in_data, size_t len, spi_word_size_t word_size) { if (!out_data || !len) return 0; @@ -234,6 +254,7 @@ size_t spi_transfer(uint8_t bus, const void *out_data, void *in_data, size_t len size_t offset = i * _SPI_BUF_SIZE; _spi_buf_transfer(bus, (const uint8_t *)out_data + offset, in_data ? (uint8_t *)in_data + offset : NULL, buf_size, e, word_size); + if (blocks) _rearm_extras_bit(bus, false) ; } uint8_t tail = len % buf_size; @@ -243,6 +264,7 @@ size_t spi_transfer(uint8_t bus, const void *out_data, void *in_data, size_t len in_data ? (uint8_t *)in_data + blocks * _SPI_BUF_SIZE : NULL, tail, e, word_size); } + if (blocks) _rearm_extras_bit(bus, true) ; return len; } @@ -253,6 +275,7 @@ static void _repeat_send(uint8_t bus, uint32_t* dword,int32_t* repeats,spi_word_ { uint16_t bytes_to_transfer = __min(*repeats * size , _SPI_BUF_SIZE); _wait(bus); + if (i) _rearm_extras_bit(bus, false) ; _set_size(bus,bytes_to_transfer); for(i = 0; i < (bytes_to_transfer + 3) / 4;i++) SPI(bus).W[i] = *dword; //need test with memcpy ! @@ -260,6 +283,7 @@ static void _repeat_send(uint8_t bus, uint32_t* dword,int32_t* repeats,spi_word_ *repeats -= (bytes_to_transfer / size ) ; } _wait(bus); + _rearm_extras_bit(bus, true) ; } void spi_repeat_send_8(uint8_t bus, uint8_t data,int32_t repeats) From 47cd73ae028ef1613fe543de3ab217b73a5f4abd Mon Sep 17 00:00:00 2001 From: lilian Date: Mon, 5 Dec 2016 12:05:18 +0100 Subject: [PATCH 3/4] Fix status with bus. --- core/esp_spi.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/core/esp_spi.c b/core/esp_spi.c index 4bbe541..878b574 100644 --- a/core/esp_spi.c +++ b/core/esp_spi.c @@ -228,16 +228,16 @@ static void _rearm_extras_bit(uint8_t bus, bool arm) { if (arm) { - if (status & 0x01) SPI(bus).USER0 |= (SPI_USER0_ADDR) ; - if (status & 0x02) SPI(bus).USER0 |= (SPI_USER0_COMMAND) ; - if (status & 0x04) SPI(bus).USER0 |= (SPI_USER0_DUMMY | SPI_USER0_MISO); - status = 0 ; + if (status & (0x01<<(4*bus))) SPI(bus).USER0 |= (SPI_USER0_ADDR) ; + if (status & (0x02<<(4*bus))) SPI(bus).USER0 |= (SPI_USER0_COMMAND) ; + if (status & (0x04<<(4*bus))) SPI(bus).USER0 |= (SPI_USER0_DUMMY | SPI_USER0_MISO); + status &= ~(0x0F<<(4*bus)); } else { - if (SPI(bus).USER0 & SPI_USER0_ADDR) { SPI(bus).USER0 &= ~(SPI_USER0_ADDR) ; status |= 1 ; } - if (SPI(bus).USER0 & SPI_USER0_COMMAND) { SPI(bus).USER0 &= ~(SPI_USER0_COMMAND) ; status |= 2 ; } - if (SPI(bus).USER0 & SPI_USER0_DUMMY) { SPI(bus).USER0 &= ~(SPI_USER0_DUMMY | SPI_USER0_MISO); status |= 4 ; } + if (SPI(bus).USER0 & SPI_USER0_ADDR) { SPI(bus).USER0 &= ~(SPI_USER0_ADDR) ; status |= 0x01<<(4*bus) ; } + if (SPI(bus).USER0 & SPI_USER0_COMMAND) { SPI(bus).USER0 &= ~(SPI_USER0_COMMAND) ; status |= 0x02<<(4*bus) ; } + if (SPI(bus).USER0 & SPI_USER0_DUMMY) { SPI(bus).USER0 &= ~(SPI_USER0_DUMMY | SPI_USER0_MISO); status |= 0x04<<(4*bus) ; } } } From 8767a8a0a987c7d181530a7fb0afd9b2cf2d001c Mon Sep 17 00:00:00 2001 From: lilian Date: Mon, 5 Dec 2016 12:45:40 +0100 Subject: [PATCH 4/4] Readable option --- core/esp_spi.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/core/esp_spi.c b/core/esp_spi.c index 878b574..0bda9d2 100644 --- a/core/esp_spi.c +++ b/core/esp_spi.c @@ -224,20 +224,20 @@ uint32_t spi_transfer_32(uint8_t bus, uint32_t data) static void _rearm_extras_bit(uint8_t bus, bool arm) { if(!_minimal_pins[bus]) return ; - static uint8_t status = 0 ; + static uint8_t status[2] ; if (arm) { - if (status & (0x01<<(4*bus))) SPI(bus).USER0 |= (SPI_USER0_ADDR) ; - if (status & (0x02<<(4*bus))) SPI(bus).USER0 |= (SPI_USER0_COMMAND) ; - if (status & (0x04<<(4*bus))) SPI(bus).USER0 |= (SPI_USER0_DUMMY | SPI_USER0_MISO); - status &= ~(0x0F<<(4*bus)); + if (status[bus] & 0x01) SPI(bus).USER0 |= (SPI_USER0_ADDR) ; + if (status[bus] & 0x02) SPI(bus).USER0 |= (SPI_USER0_COMMAND) ; + if (status[bus] & 0x04) SPI(bus).USER0 |= (SPI_USER0_DUMMY | SPI_USER0_MISO); + status[bus] = 0; } else { - if (SPI(bus).USER0 & SPI_USER0_ADDR) { SPI(bus).USER0 &= ~(SPI_USER0_ADDR) ; status |= 0x01<<(4*bus) ; } - if (SPI(bus).USER0 & SPI_USER0_COMMAND) { SPI(bus).USER0 &= ~(SPI_USER0_COMMAND) ; status |= 0x02<<(4*bus) ; } - if (SPI(bus).USER0 & SPI_USER0_DUMMY) { SPI(bus).USER0 &= ~(SPI_USER0_DUMMY | SPI_USER0_MISO); status |= 0x04<<(4*bus) ; } + if (SPI(bus).USER0 & SPI_USER0_ADDR) { SPI(bus).USER0 &= ~(SPI_USER0_ADDR) ; status[bus] |= 0x01 ; } + if (SPI(bus).USER0 & SPI_USER0_COMMAND) { SPI(bus).USER0 &= ~(SPI_USER0_COMMAND) ; status[bus] |= 0x02 ; } + if (SPI(bus).USER0 & SPI_USER0_DUMMY) { SPI(bus).USER0 &= ~(SPI_USER0_DUMMY | SPI_USER0_MISO); status[bus] |= 0x04 ; } } }