Increased User Data causes disconnection
- Subscribe to RSS Feed
- Mark as New
- Mark as Read
- Bookmark
- Subscribe
- Printer Friendly Page
- Report Inappropriate Content
Answer:
Below is a patch for the DVK (PSoC firmware) to fix a receive buffer overflow (link loss) firmware issue with v1.6.
- Open all "radio.c" files under directory "...\Firmware\Source Code\..."
- Replace radio_receive() function on line 372 with the following:
UINT8 radio_receive(UINT8 buffer_length, UINT8 *rx_buffer, UINT8 *valid_buffer, UINT16 timeout)
{
UINT8 irq_source;
UINT8 radio_state;
UINT16 loop_counter = 0;
radio_state = (spi_radio_get(REG_CONTROL));
if ((radio_state & RX_ENABLE) != RX_ENABLE) {
radio_receive_on();
}
rx_data_length = 0;
// don't break out of the loop mid-packet..
while ((loop_counter < timeout) || (rx_data_length != 0)) {
// poll for a Radio Module interrupt, interrupts are self clearing
// when the appropiate status register is read
if(LS_IRQ_ASSERTED) {
irq_source = spi_radio_get(REG_RX_INT_STAT);
if(irq_source & RX_FULL_A) {
if (rx_data_length < buffer_length) {
*rx_buffer = spi_radio_get(REG_DATA_RX_A);
// don't read the valid register if it is all valid
if( irq_source & RX_VALID_A ) {
*valid_buffer = 0xFF;
}
else {
*valid_buffer = spi_radio_get(REG_VALID_RX_A);
}
// filter out bad bytes and don't overwrite the globals
if((*valid_buffer >= 0x0F) || (rx_data_length > 0)) {
rx_data_length++;
loop_counter = 0;
#ifdef RADIO_CHECK_FOR_ACK
if (((data & 0xF0) == 0x50) && (rx_data_length == ACK_LEN)) {
break;
}
#endif
rx_buffer++;
valid_buffer++;
}
}
else {
// buffer overflow... clear data register...exit receive mode
spi_radio_get(REG_DATA_RX_A);
rx_data_length = 0;
break;
}
}
if(irq_source & RX_EOF_A) {
if (rx_data_length != 0) {
break;
}
}
if(irq_source & RX_OVER_A) {
loop_counter = 0;
}
}
else {
++loop_counter; // only increment loop_counter for each 10us delay...
TIMER_DELAY_10_USEC();
}
}
if ((radio_state & RX_ENABLE) != RX_ENABLE) {
radio_off();
}
return rx_data_length;
}
- Tags:
- rf transceivers
-
This widget could not be displayed.Anonymous