mirror of
https://github.com/betaflight/betaflight.git
synced 2025-07-25 17:25:20 +03:00
Improved handling of odd-length data
This commit is contained in:
parent
99d78cb201
commit
d460e545d4
1 changed files with 45 additions and 40 deletions
|
@ -235,53 +235,58 @@ bool spiTransfer(SPI_TypeDef *instance, const uint8_t *txData, uint8_t *rxData,
|
||||||
{
|
{
|
||||||
// set 16-bit transfer
|
// set 16-bit transfer
|
||||||
CLEAR_BIT(instance->CR2, SPI_RXFIFO_THRESHOLD);
|
CLEAR_BIT(instance->CR2, SPI_RXFIFO_THRESHOLD);
|
||||||
while (len) {
|
while (len > 1) {
|
||||||
uint16_t spiTimeout = 1000;
|
int spiTimeout = 1000;
|
||||||
while (!LL_SPI_IsActiveFlag_TXE(instance)) {
|
while (!LL_SPI_IsActiveFlag_TXE(instance)) {
|
||||||
if ((spiTimeout--) == 0) {
|
if ((spiTimeout--) == 0) {
|
||||||
return spiTimeoutUserCallback(instance);
|
return spiTimeoutUserCallback(instance);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (len > 1) {
|
uint16_t w;
|
||||||
uint16_t w;
|
if (txData) {
|
||||||
if (txData) {
|
w = *((uint16_t *)txData);
|
||||||
w = *((uint16_t *)txData);
|
txData += 2;
|
||||||
txData += 2;
|
|
||||||
} else {
|
|
||||||
w = 0xFFFF;
|
|
||||||
}
|
|
||||||
LL_SPI_TransmitData16(instance, w);
|
|
||||||
|
|
||||||
spiTimeout = 1000;
|
|
||||||
while (!LL_SPI_IsActiveFlag_RXNE(instance)) {
|
|
||||||
if ((spiTimeout--) == 0) {
|
|
||||||
return spiTimeoutUserCallback(instance);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
w = LL_SPI_ReceiveData16(instance);
|
|
||||||
if (rxData) {
|
|
||||||
*((uint16_t *)rxData) = w;
|
|
||||||
rxData += 2;
|
|
||||||
}
|
|
||||||
len -= 2;
|
|
||||||
} else {
|
} else {
|
||||||
// set 8-bit transfer
|
w = 0xFFFF;
|
||||||
SET_BIT(instance->CR2, SPI_RXFIFO_THRESHOLD);
|
|
||||||
uint8_t b = txData ? *(txData++) : 0xFF;
|
|
||||||
LL_SPI_TransmitData8(instance, b);
|
|
||||||
|
|
||||||
spiTimeout = 1000;
|
|
||||||
while (!LL_SPI_IsActiveFlag_RXNE(instance)) {
|
|
||||||
if ((spiTimeout--) == 0) {
|
|
||||||
return spiTimeoutUserCallback(instance);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
b = LL_SPI_ReceiveData8(instance);
|
|
||||||
if (rxData) {
|
|
||||||
*(rxData++) = b;
|
|
||||||
}
|
|
||||||
--len;
|
|
||||||
}
|
}
|
||||||
|
LL_SPI_TransmitData16(instance, w);
|
||||||
|
|
||||||
|
spiTimeout = 1000;
|
||||||
|
while (!LL_SPI_IsActiveFlag_RXNE(instance)) {
|
||||||
|
if ((spiTimeout--) == 0) {
|
||||||
|
return spiTimeoutUserCallback(instance);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
w = LL_SPI_ReceiveData16(instance);
|
||||||
|
if (rxData) {
|
||||||
|
*((uint16_t *)rxData) = w;
|
||||||
|
rxData += 2;
|
||||||
|
}
|
||||||
|
len -= 2;
|
||||||
|
}
|
||||||
|
// set 8-bit transfer
|
||||||
|
SET_BIT(instance->CR2, SPI_RXFIFO_THRESHOLD);
|
||||||
|
if (len) {
|
||||||
|
int spiTimeout = 1000;
|
||||||
|
while (!LL_SPI_IsActiveFlag_TXE(instance)) {
|
||||||
|
if ((spiTimeout--) == 0) {
|
||||||
|
return spiTimeoutUserCallback(instance);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
uint8_t b = txData ? *(txData++) : 0xFF;
|
||||||
|
LL_SPI_TransmitData8(instance, b);
|
||||||
|
|
||||||
|
spiTimeout = 1000;
|
||||||
|
while (!LL_SPI_IsActiveFlag_RXNE(instance)) {
|
||||||
|
if ((spiTimeout--) == 0) {
|
||||||
|
return spiTimeoutUserCallback(instance);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
b = LL_SPI_ReceiveData8(instance);
|
||||||
|
if (rxData) {
|
||||||
|
*(rxData++) = b;
|
||||||
|
}
|
||||||
|
--len;
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue