2022-12-15 11:34 PM
Paired the BNRG2A1 module with the STM32L476RG as recommended in the sample application. But when debugging I realised that the hciReadPktRxQueue is always empty leading to timeout.
I have made no modification to the sample application and even with the same hardware is unable to run the application. Any ideas on how to get it running?
This is the original hc_send_req that constantly timeout.
int hci_send_req(struct hci_request* r, BOOL async)
{
uint8_t *ptr;
uint16_t opcode = htobs(cmd_opcode_pack(r->ogf, r->ocf));
hci_event_pckt *event_pckt;
hci_spi_pckt *hci_hdr;
tHciDataPacket * hciReadPacket = NULL;
tListNode hciTempQueue;
list_init_head(&hciTempQueue);
free_event_list();
send_cmd(r->ogf, r->ocf, r->clen, r->cparam);
if (async)
{
return 0;
}
while (1)
{
evt_cmd_complete *cc;
evt_cmd_status *cs;
evt_le_meta_event *me;
uint32_t len;
uint32_t tickstart = HAL_GetTick();
while (1)
{
if ((HAL_GetTick() - tickstart) > HCI_DEFAULT_TIMEOUT_MS)
{
goto failed;
}
if (!list_is_empty(&hciReadPktRxQueue))
{
break;
}
}
/* Extract packet from HCI event queue. */
list_remove_head(&hciReadPktRxQueue, (tListNode **)&hciReadPacket);
hci_hdr = (void *)hciReadPacket->dataBuff;
if (hci_hdr->type == HCI_EVENT_PKT)
{
event_pckt = (void *)(hci_hdr->data);
ptr = hciReadPacket->dataBuff + (1 + HCI_EVENT_HDR_SIZE);
len = hciReadPacket->data_len - (1 + HCI_EVENT_HDR_SIZE);
switch (event_pckt->evt)
{
case EVT_CMD_STATUS:
cs = (void *) ptr;
if (cs->opcode != opcode)
goto failed;
if (r->event != EVT_CMD_STATUS) {
if (cs->status) {
goto failed;
}
break;
}
r->rlen = MIN(len, r->rlen);
BLUENRG_memcpy(r->rparam, ptr, r->rlen);
goto done;
case EVT_CMD_COMPLETE:
cc = (void *) ptr;
if (cc->opcode != opcode)
goto failed;
ptr += EVT_CMD_COMPLETE_SIZE;
len -= EVT_CMD_COMPLETE_SIZE;
r->rlen = MIN(len, r->rlen);
BLUENRG_memcpy(r->rparam, ptr, r->rlen);
goto done;
case EVT_LE_META_EVENT:
me = (void *) ptr;
if (me->subevent != r->event)
break;
len -= 1;
r->rlen = MIN(len, r->rlen);
BLUENRG_memcpy(r->rparam, me->data, r->rlen);
goto done;
case EVT_HARDWARE_ERROR:
goto failed;
default:
break;
}
}
/* If there are no more packets to be processed, be sure there is at list one
packet in the pool to process the expected event.
If no free packets are available, discard the processed event and insert it
into the pool. */
if (list_is_empty(&hciReadPktPool) && list_is_empty(&hciReadPktRxQueue)) {
list_insert_tail(&hciReadPktPool, (tListNode *)hciReadPacket);
hciReadPacket=NULL;
}
else {
/* Insert the packet in a different queue. These packets will be
inserted back in the main queue just before exiting from send_req(), so that
these events can be processed by the application.
*/
list_insert_tail(&hciTempQueue, (tListNode *)hciReadPacket);
hciReadPacket=NULL;
}
}
failed:
if (hciReadPacket!=NULL) {
list_insert_head(&hciReadPktPool, (tListNode *)hciReadPacket);
}
move_list(&hciReadPktRxQueue, &hciTempQueue);
return -1;
done:
/* Insert the packet back into the pool.*/
list_insert_head(&hciReadPktPool, (tListNode *)hciReadPacket);
move_list(&hciReadPktRxQueue, &hciTempQueue);
return 0;
}
2023-11-28 05:50 AM
I found out what I was doing wrong, my pin connected to the bluenrg interrupt is PA3 and it works if I connect it to the IRQ3 interrupt, I instead connected it to IRQ1...now it still doesn't work because in "hci_notify_asynch_evt" the packet I receive has data_len equal to 0...:frowning_face:
2023-11-28 06:08 AM
can you check if you call hci_tl_lowlevel_isr();
if yes, check the CS pin for SPI
2023-11-28 06:41 AM
yes, hci_tl_lowlevel_isr is called...and consequently HCI_TL_SPI_Receive is called, but, after
BSP_SPI1_SendRecv(header_master, header_slave, HEADER_SIZE);
header_slave=[1,0,0,1,x81] so header_slave[0] is not 2
2023-11-28 07:07 AM
First check the SPI config,
here is my config with bluenrg :
hspi1.Instance = SPI1;
hspi1.Init.Mode = SPI_MODE_MASTER;
hspi1.Init.Direction = SPI_DIRECTION_2LINES;
hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
hspi1.Init.CLKPolarity = SPI_POLARITY_HIGH;
hspi1.Init.CLKPhase = SPI_PHASE_2EDGE;
hspi1.Init.NSS = SPI_NSS_SOFT;
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi1.Init.CRCPolynomial = 7;
hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;
hspi1.Init.NSSPMode = SPI_NSS_PULSE_DISABLE;
do you have other device connected to the same SPI bus ?
if yes, be sure that all CS are set to 1 and only the BlueNRG CS is set to 0
2023-11-28 07:09 AM
my spi is configured as the following:
hspi->Instance = SPI1;
hspi->Init.Mode = SPI_MODE_MASTER;
hspi->Init.Direction = SPI_DIRECTION_2LINES;
hspi->Init.DataSize = SPI_DATASIZE_8BIT;
hspi->Init.CLKPolarity = SPI_POLARITY_LOW;
hspi->Init.CLKPhase = SPI_PHASE_2EDGE;
hspi->Init.NSS = SPI_NSS_SOFT;
hspi->Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_64;
hspi->Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi->Init.TIMode = SPI_TIMODE_DISABLE;
hspi->Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi->Init.CRCPolynomial = 7;
hspi->Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;
hspi->Init.NSSPMode = SPI_NSS_PULSE_DISABLE;
2023-11-28 07:13 AM
my clock is 160 MHz, so I use a prescaler of 64...I tried also a polarity of SPI_POLARITY_HIGH, but header_slave[0] is not 2...I have only 1 SPI.
2023-11-28 07:27 AM
the max SPI clock supported by the BlueNRG is 1MHz
in your case the clock is too high ! (160/64 = 2.5MHz)
2023-11-28 07:28 AM
check the config on the datasheet
2023-11-28 08:09 AM
could you send me a link to this datasheet?...thank you.
2023-11-28 08:28 AM