Skip to content

Commit 68eccad

Browse files
committed
Allow SPI transmit when receive buffer is full, fix struct layout on MSVC
1 parent 5c81f61 commit 68eccad

File tree

2 files changed

+20
-16
lines changed

2 files changed

+20
-16
lines changed

core/arm/armmem.c

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -142,8 +142,8 @@ uint8_t arm_mem_spi_peek(arm_t *arm, uint8_t pin, uint32_t *res) {
142142
spi->CTRLA.bit.MODE !=
143143
SERCOM_SPI_CTRLA_MODE_SPI_SLAVE_Val ||
144144
!spi->CTRLB.bit.RXEN)) {
145-
*res = 1 << 15;
146-
return 16;
145+
*res = 0;
146+
return 1;
147147
}
148148
uint8_t bits = 8 | (spi->CTRLB.bit.CHSIZE & 1);
149149
*res = spi->BUFFER[1].bit.DATA;
@@ -177,24 +177,28 @@ void arm_mem_spi_xfer(arm_t *arm, uint8_t pin, uint32_t val) {
177177
} else {
178178
spi->BUFFER[2].bit.OVF = true;
179179
}
180-
spi->BUFFER[1].bit.VLD = true;
180+
//spi->BUFFER[1].bit.VLD = true;
181181
} else {
182-
spi->INTFLAG.bit.DRE = true;
183182
spi->INTFLAG.bit.RXC = true;
184-
if (likely(spi->INTEN.bit.DRE || spi->INTEN.bit.RXC)) {
183+
if (likely(spi->INTEN.bit.RXC)) {
185184
arm_mem_set_pending(arm, SERCOM0_IRQn + pin, true);
186185
}
187186
spi->BUFFER[3].reg = spi->BUFFER[2].reg;
188187
spi->BUFFER[2].reg = spi->BUFFER[1].reg;
189-
if (likely(spi->BUFFER[1].bit.VLD = spi->BUFFER[0].bit.VLD)) {
190-
spi->BUFFER[1].bit.DATA = spi->BUFFER[0].bit.DATA;
191-
spi->BUFFER[0].reg = 0;
192-
} else if (unlikely(spi->CTRLA.bit.MODE ==
193-
SERCOM_SPI_CTRLA_MODE_SPI_MASTER_Val)) {
194-
spi->INTFLAG.bit.TXC = true;
195-
if (likely(spi->INTEN.bit.TXC)) {
196-
arm_mem_set_pending(arm, SERCOM0_IRQn + pin, true);
197-
}
188+
spi->BUFFER[2].bit.VLD = true;
189+
}
190+
spi->INTFLAG.bit.DRE = true;
191+
if (likely(spi->INTEN.bit.DRE)) {
192+
arm_mem_set_pending(arm, SERCOM0_IRQn + pin, true);
193+
}
194+
if (likely(spi->BUFFER[1].bit.VLD = spi->BUFFER[0].bit.VLD)) {
195+
spi->BUFFER[1].bit.DATA = spi->BUFFER[0].bit.DATA;
196+
spi->BUFFER[0].reg = 0;
197+
} else if (unlikely(spi->CTRLA.bit.MODE ==
198+
SERCOM_SPI_CTRLA_MODE_SPI_MASTER_Val)) {
199+
spi->INTFLAG.bit.TXC = true;
200+
if (likely(spi->INTEN.bit.TXC)) {
201+
arm_mem_set_pending(arm, SERCOM0_IRQn + pin, true);
198202
}
199203
}
200204
}

core/arm/armmem.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,8 @@ typedef struct {
5757
typedef union {
5858
struct {
5959
uint16_t DATA:9; /*!< bit: 0.. 8 Data Value */
60-
bool VLD:1; /*!< bit: 9 Valid Flag */
61-
bool OVF:1; /*!< bit: 10 Overflow Flag */
60+
uint16_t VLD:1; /*!< bit: 9 Valid Flag */
61+
uint16_t OVF:1; /*!< bit: 10 Overflow Flag */
6262
} bit; /*!< Structure used for bit access */
6363
uint16_t reg; /*!< Type used for register access */
6464
} SERCOM_BUFFER_Type;

0 commit comments

Comments
 (0)