spi_asynch test passed

pull/1626/head
mtkrtk 2016-03-30 20:29:46 +09:00
parent 2a0b00008b
commit 9ef1d7b2f4
1 changed files with 23 additions and 16 deletions

View File

@ -321,11 +321,10 @@ static void spi_rx_irq(IRQn_Type irq_num, uint32_t index)
spi_async_read(obj); spi_async_read(obj);
} else { } else {
if (obj->rx_buff.buffer && obj->tx_buff.buffer && obj->tx_buff.pos < obj->tx_buff.length) { if (obj->rx_buff.buffer && obj->tx_buff.buffer && obj->tx_buff.pos < obj->tx_buff.length) {
spi_data[obj->spi.index].event = SPI_EVENT_ERROR | SPI_EVENT_RX_OVERFLOW; spi_data[obj->spi.index].event = SPI_EVENT_COMPLETE;
spi_abort_asynch(obj); spi_irqs_set(obj, 0);
if (spi_data[obj->spi.index].wanted_events & (SPI_EVENT_ERROR | SPI_EVENT_RX_OVERFLOW)) { spi_data[obj->spi.index].async_obj = NULL;
((void (*)())spi_data[obj->spi.index].async_callback)(); ((void (*)())spi_data[obj->spi.index].async_callback)();
}
return; return;
} }
spi_read(obj); spi_read(obj);
@ -335,9 +334,7 @@ static void spi_rx_irq(IRQn_Type irq_num, uint32_t index)
spi_data[obj->spi.index].event = SPI_EVENT_COMPLETE; spi_data[obj->spi.index].event = SPI_EVENT_COMPLETE;
spi_irqs_set(obj, 0); spi_irqs_set(obj, 0);
spi_data[obj->spi.index].async_obj = NULL; spi_data[obj->spi.index].async_obj = NULL;
if (spi_data[obj->spi.index].wanted_events & SPI_EVENT_COMPLETE) { ((void (*)())spi_data[obj->spi.index].async_callback)();
((void (*)())spi_data[obj->spi.index].async_callback)();
}
} else { } else {
spi_async_write(obj); spi_async_write(obj);
} }
@ -346,9 +343,7 @@ static void spi_rx_irq(IRQn_Type irq_num, uint32_t index)
spi_data[obj->spi.index].event = SPI_EVENT_COMPLETE; spi_data[obj->spi.index].event = SPI_EVENT_COMPLETE;
spi_irqs_set(obj, 0); spi_irqs_set(obj, 0);
spi_data[obj->spi.index].async_obj = NULL; spi_data[obj->spi.index].async_obj = NULL;
if (spi_data[obj->spi.index].wanted_events & SPI_EVENT_COMPLETE) { ((void (*)())spi_data[obj->spi.index].async_callback)();
((void (*)())spi_data[obj->spi.index].async_callback)();
}
} else { } else {
spi_async_write(obj); spi_async_write(obj);
} }
@ -470,7 +465,7 @@ static void spi_async_write(spi_t *obj)
break; break;
} }
} else { } else {
spi_write(obj, 0); spi_write(obj, SPI_FILL_WORD);
} }
} }
@ -514,21 +509,33 @@ static void spi_async_read(spi_t *obj)
void spi_master_transfer(spi_t *obj, const void *tx, size_t tx_length, void *rx, size_t rx_length, uint8_t bit_width, uint32_t handler, uint32_t event, DMAUsage hint) void spi_master_transfer(spi_t *obj, const void *tx, size_t tx_length, void *rx, size_t rx_length, uint8_t bit_width, uint32_t handler, uint32_t event, DMAUsage hint)
{ {
int i;
MBED_ASSERT(obj); MBED_ASSERT(obj);
MBED_ASSERT(tx || rx); MBED_ASSERT(tx || rx);
MBED_ASSERT(tx ? tx_length : 1); MBED_ASSERT(tx && ! rx ? tx_length : 1);
MBED_ASSERT(rx ? rx_length : 1); MBED_ASSERT(rx && ! tx ? rx_length : 1);
MBED_ASSERT(obj->spi.spi->SPCR & (1 << 3)); /* Slave mode */ MBED_ASSERT(obj->spi.spi->SPCR & (1 << 3)); /* Slave mode */
MBED_ASSERT(bit_width == 8 || bit_width == 16 || bit_width == 32); MBED_ASSERT(bit_width == 8 || bit_width == 16 || bit_width == 32);
obj->tx_buff.buffer = (void *)tx; if (tx_length) {
obj->tx_buff.buffer = (void *)tx;
} else {
obj->tx_buff.buffer = NULL;
}
obj->tx_buff.length = tx_length * bit_width / 8; obj->tx_buff.length = tx_length * bit_width / 8;
obj->tx_buff.pos = 0; obj->tx_buff.pos = 0;
obj->tx_buff.width = bit_width; obj->tx_buff.width = bit_width;
obj->rx_buff.buffer = rx; if (rx_length) {
obj->rx_buff.buffer = rx;
} else {
obj->rx_buff.buffer = NULL;
}
obj->rx_buff.length = rx_length * bit_width / 8; obj->rx_buff.length = rx_length * bit_width / 8;
obj->rx_buff.pos = 0; obj->rx_buff.pos = 0;
obj->rx_buff.width = bit_width; obj->rx_buff.width = bit_width;
for (i = 0; i < obj->rx_buff.length; i++) {
((uint8_t *)obj->rx_buff.buffer)[i] = SPI_FILL_WORD;
}
spi_data[obj->spi.index].async_callback = handler; spi_data[obj->spi.index].async_callback = handler;
spi_data[obj->spi.index].async_obj = obj; spi_data[obj->spi.index].async_obj = obj;