mirror of
https://github.com/RIOT-OS/RIOT.git
synced 2026-01-01 01:41:18 +01:00
cpu/cc2538: spi: unify spi_transfer_bytes()
Use a common helper function to read/write the data register.
This commit is contained in:
parent
68b2c57d2d
commit
80392dc644
@ -121,6 +121,14 @@ void spi_release(spi_t bus)
|
||||
mutex_unlock(&locks[bus]);
|
||||
}
|
||||
|
||||
static uint8_t _trx(cc2538_ssi_t *dev, uint8_t in)
|
||||
{
|
||||
while (!(dev->SR & SSI_SR_TNF)) {}
|
||||
dev->DR = in;
|
||||
while (!(dev->SR & SSI_SR_RNE)) {}
|
||||
return dev->DR;
|
||||
}
|
||||
|
||||
void spi_transfer_bytes(spi_t bus, spi_cs_t cs, bool cont,
|
||||
const void *out, void *in, size_t len)
|
||||
{
|
||||
@ -136,35 +144,19 @@ void spi_transfer_bytes(spi_t bus, spi_cs_t cs, bool cont,
|
||||
}
|
||||
|
||||
if (!in_buf) {
|
||||
for (size_t i = 0; i < len; i++) {
|
||||
while (!(dev(bus)->SR & SSI_SR_TNF)) {}
|
||||
dev(bus)->DR = out_buf[i];
|
||||
while (!(dev(bus)->SR & SSI_SR_RNE)) {}
|
||||
dev(bus)->DR;
|
||||
for (const void *end = out_buf + len; out_buf != end; ++out_buf) {
|
||||
_trx(dev(bus), *out_buf);
|
||||
}
|
||||
}
|
||||
else if (!out_buf) {
|
||||
size_t in_cnt = 0;
|
||||
for (size_t i = 0; i < len; i++) {
|
||||
while (!(dev(bus)->SR & SSI_SR_TNF)) {}
|
||||
dev(bus)->DR = 0;
|
||||
while (!(dev(bus)->SR & SSI_SR_RNE)) {}
|
||||
in_buf[in_cnt++] = dev(bus)->DR;
|
||||
}
|
||||
/* get remaining bytes */
|
||||
while (dev(bus)->SR & SSI_SR_RNE) {
|
||||
in_buf[in_cnt++] = dev(bus)->DR;
|
||||
for (void *end = in_buf + len; in_buf != end; ++in_buf) {
|
||||
*in_buf = _trx(dev(bus), 0);
|
||||
}
|
||||
}
|
||||
else {
|
||||
for (size_t i = 0; i < len; i++) {
|
||||
while (!(dev(bus)->SR & SSI_SR_TNF)) {}
|
||||
dev(bus)->DR = out_buf[i];
|
||||
while (!(dev(bus)->SR & SSI_SR_RNE)) {}
|
||||
in_buf[i] = dev(bus)->DR;
|
||||
for (void *end = in_buf + len; in_buf != end; ++in_buf, ++out_buf) {
|
||||
*in_buf = _trx(dev(bus), *out_buf);
|
||||
}
|
||||
/* wait until no more busy */
|
||||
while ((dev(bus)->SR & SSI_SR_BSY)) {}
|
||||
}
|
||||
|
||||
if ((!cont) && (cs != SPI_CS_UNDEF)) {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user