bluetooth: hci: spi: delay between header and data

The HCI receive path has a delay between reading the header and payload
from the controller to give the controller time to setup the SPI
peripheral for the next transaction. Add the same delay on the transmit
path for the same reasons.

Signed-off-by: Jordan Yates <jordan.yates@data61.csiro.au>
This commit is contained in:
Jordan Yates 2023-10-20 14:08:49 +10:00 committed by Carles Cufí
commit 2283b02ce4
2 changed files with 12 additions and 7 deletions

View file

@ -425,6 +425,8 @@ static int bt_spi_send(struct net_buf *buf)
(header_rx[1] | header_rx[2] | header_rx[3] | header_rx[4]) == 0U) && !ret); (header_rx[1] | header_rx[2] | header_rx[3] | header_rx[4]) == 0U) && !ret);
if (!ret) { if (!ret) {
/* Delay here is rounded up to next tick */
k_sleep(K_USEC(DATA_DELAY_US));
/* Transmit the message */ /* Transmit the message */
while (true) { while (true) {
ret = bt_spi_transceive(buf->data, buf->len, ret = bt_spi_transceive(buf->data, buf->len,
@ -432,6 +434,9 @@ static int bt_spi_send(struct net_buf *buf)
if (rx_first[0] != 0U || ret) { if (rx_first[0] != 0U || ret) {
break; break;
} }
/* Consider increasing controller-data-delay-us
* if this message is extremely common.
*/
LOG_DBG("Controller not ready for SPI transaction of %d bytes", buf->len); LOG_DBG("Controller not ready for SPI transaction of %d bytes", buf->len);
} }
} }

View file

@ -28,10 +28,10 @@ properties:
type: int type: int
default: 20 default: 20
description: description:
Duration to delay between reading a valid header and reading the data associated Duration to delay between reading a valid header and transceiving the data
with that header. This delay gives the controller time to configure the SPI data associated with that header. This delay gives the controller time to configure
transaction after finishing the header transaction. Without this delay the host the SPI data transaction after finishing the header transaction. Without this
can attempt to read before the controller is ready, resulting in empty data that delay the host can attempt to read/write before the controller is ready,
then needs to be read a second time. The default of 20uS was chosen as the lowest resulting in an ignored transaction that then needs to be performed a second time.
delay that reliably eliminated double transmits between a nRF9160 host and a The default of 20uS was chosen as the lowest delay that reliably eliminated double
nRF52832 controller. transactions between a nRF9160 host and a nRF52832 controller.