diff --git a/port/stm32-sx1280/controller/ll_sx1280.c b/port/stm32-sx1280/controller/ll_sx1280.c index 0bb673215..c42287c76 100644 --- a/port/stm32-sx1280/controller/ll_sx1280.c +++ b/port/stm32-sx1280/controller/ll_sx1280.c @@ -65,6 +65,12 @@ extern LPTIM_HandleTypeDef hlptim1; #define ADV_MAX_PAYLOAD (6+6+22) #define LL_MAX_PAYLOAD 37 +// split 256 bytes data buffer into 2 rx and 2 tx buffers +#define SX1280_RX0_OFFSET 0 +#define SX1280_RX1_OFFSET 64 +#define SX1280_TX0_OFFSET 128 +#define SX1280_TX1_OFFSET 192 + // set output power in dBM, range [-18..+13] dBm - Bluetooth LE max is 10 dBM #define TX_OUTPUT_POWER 10 @@ -376,7 +382,8 @@ static void send_adv(void){ memcpy(&adv_buffer[2], ctx.bd_addr_le, 6); memcpy(&adv_buffer[8], ctx.adv_data, ctx.adv_len); uint16_t packet_size = 2 + adv_buffer[1]; - Radio.SendPayload( adv_buffer, packet_size, ( TickTime_t ){ RADIO_TICK_SIZE_1000_US, 1 } ); + SX1280HalWriteBuffer( SX1280_TX0_OFFSET, adv_buffer, packet_size ); + SX1280SetTx( ( TickTime_t ){ RADIO_TICK_SIZE_1000_US, 1 } ); } static void receive_adv_response(void){ @@ -617,12 +624,16 @@ static void radio_on_rx_done(void ){ } // Read complete buffer - SX1280HalReadBuffer( 0, &rx_packet->header, 2 + LL_MAX_PAYLOAD ); - + uint16_t max_packet_len; if (ll_state == LL_STATE_CONNECTED){ // mark as data packet rx_packet->flags |= LL_PDU_FLAG_DATA_PDU; + max_packet_len = 2 + 27; + } else { + rx_packet->flags = 0; + max_packet_len = 2 + LL_MAX_PAYLOAD; } + SX1280HalReadBuffer( SX1280_RX0_OFFSET, &rx_packet->header, max_packet_len); // queue received packet btstack_linked_queue_enqueue(&ctx.rx_queue, (btstack_linked_item_t *) rx_packet); @@ -655,11 +666,11 @@ static void radio_on_rx_done(void ){ if (ctx.tx_pdu == NULL){ empty_packet[0] = (ctx.transmit_sequence_number << 3) | (ctx.next_expected_sequence_number << 2) | PDU_DATA_LLID_DATA_CONTINUE; empty_packet[1] = 0; - Radio.SetPayload(empty_packet, 2); + SX1280HalWriteBuffer( SX1280_TX0_OFFSET, empty_packet, 2 ); } else { uint8_t md = btstack_linked_queue_empty(&ctx.tx_queue) ? 0 : 1; ctx.tx_pdu->header |= (md << 4) | (ctx.transmit_sequence_number << 3) | (ctx.next_expected_sequence_number << 2); - Radio.SetPayload((uint8_t *) &ctx.tx_pdu->header, 2 + ctx.tx_pdu->len); + SX1280HalWriteBuffer( SX1280_TX0_OFFSET, (uint8_t *) &ctx.tx_pdu->header, 2 + ctx.tx_pdu->len ); } // preamble (1) + aa (4) + header (1) + len (1) + payload (len) + crc (3) -- ISR handler ca. 50 us @@ -758,7 +769,7 @@ void ll_radio_on(void){ Radio.SetStandby( STDBY_RC ); Radio.SetPacketType( modulationParams.PacketType ); Radio.SetModulationParams( &modulationParams ); - Radio.SetBufferBaseAddresses( 0x00, 0x00 ); + Radio.SetBufferBaseAddresses( SX1280_TX0_OFFSET, SX1280_RX0_OFFSET ); Radio.SetTxParams( TX_OUTPUT_POWER, RADIO_RAMP_02_US ); // Go back to Frequcency Synthesis Mode, reduces transition time between Rx<->TX