LINUX.ORG.RU

Выжать всё из NRF24L01+

 


0

1

Сколько максимум бит/сек можно выжать из этого радиомодуля? Конечно, даташит гордо заявляет нам о 2 МБит/сек, однако если вчитаться, то оказывается, что каждую посылку заново стартует PLL, что приводит к большим потерям. Пользуясь формулами из даташита получил максимальную скорость около 800 КБит/сек.

Интересно, как к ней приблизится.

Сейчас работает тупой алгоритм:

static void NRF24L01_sendNextPacket(NRF24L01_Driver *radio) {
	NRF24L01_Packet *packet;
	while ((NRF24L01_readStatus(radio) & NRF24L01_STATUS_TX_FULL) == 0) {
		if (chMBFetch(&radio->txMailbox, (msg_t*)&packet, TIME_IMMEDIATE) != MSG_OK) break;
		if (radio->rxMode) {
			NRF24L01_chipDisable(radio);
			NRF24L01_andByteReg(radio, NRF24L01_REG_CONFIG, ~NRF24L01_CONFIG_PRIM_RX);
			radio->rxMode = FALSE;
			//chThdSleepMilliseconds(10);
		}
		NRF24L01_txPayload(radio, packet->data, packet->size, FALSE);
		chHeapFree(packet);
		NRF24L01_chipEnable(radio);
		//chThdSleepMilliseconds(10);
		return;
	}
	if (NRF24L01_readByteReg(radio, NRF24L01_REG_FIFO_STATUS) & NRF24L01_FIFO_STATUS_TX_EMPTY) {
		NRF24L01_startRx(radio);
	} else {
		NRF24L01_chipEnable(radio);
	}
}

Эта функция вызывается, когда в программной очереди отправки появляется очередной пакет, либо приходит прерывания TX_DS (на момент вызова функции флаг прерывания уже сброшен).

Приём осуществляется таким нехитрым способом:

static void NRF24L01_rxData(NRF24L01_Driver *radio) {
	while ((NRF24L01_readByteReg(radio, NRF24L01_REG_FIFO_STATUS) & NRF24L01_FIFO_STATUS_RX_EMPTY) == 0) {
		NRF24L01_Packet *packet = chHeapAlloc(NULL, sizeof(NRF24L01_Packet));
		packet->size = NRF24L01_readRxPayloadLen(radio);
		NRF24L01_rxPayload(radio, packet->data, packet->size);
		if (chMBPost(&radio->rxMailbox, (msg_t)packet, TIME_IMMEDIATE) != MSG_OK) {
			chHeapFree(packet);
		}
	}
}

Эта функция вызывается при приходе прерывания RX_DR. По идее должна высосать все данные из RX PIPE, сколько бы их там не скопилось.

Тестирую время отправки серии из 10 пакетов (размер очереди отправки позволяет запихнуть их туда все, всё упирается именно в скорость извлечения их оттуда), получаю скорость около 372 КБит/сек.

Маловато будет. Убираем return в конце цикла в функции передачи. В таком случае он по идее должен заполнять RX PIPE сразу 3-мя пакетами (как это позволяет радиомодуль), а затем по мере необходимости добавлять новые. И... теряем больше половины пакетов. Что характерно, пакеты с номерами кратными трём доходят всегда. То есть первый пакет, который мы запихнули в TX PIPE уходит нормально, а остальные отправляются как-то криво. Ну и зачем хвастаться в даташите трёхуровневой очередью отправки, если при запихивании в неё сразу трёх пакетов без пауз, она глючит?

Модули NRF24L01 точно с оригинальными чипами. В качестве микроконтроллера используется STM32F103 с ChibiOS.

Какие уловки следует применить, чтобы увеличить скорость? Да, ACK-ответы, разумеется, отключены.

★★★★★

Последнее исправление: KivApple (всего исправлений: 2)

Если это модуль с алиэкспресс $5 за пучек с доставкой, то это все китайские копии и скажите спасибо, что хоть так работают.

alexru ★★★★
()
Последнее исправление: alexru (всего исправлений: 1)
Ответ на: комментарий от alexru

Ну это версия с усилителем мощности, внешней антенной и SMD-кварцем (в описании лота обещают дальность до 1000 метров, по факту получалось в районе 750, но условия теста были не очень хорошие - подозреваем наличие источника помех, потому что в одном месте сигнал вообще пропадал, а потом появлялся). При старом курсе доллара были куплены за 250 рублей/штука, когда обычные стоили по 30 рублей/штука.

Достал их из своих закромов, когда получил глюки на обычных дешёвых NRF24L01+ (впрочем, там тоже нормальный квадратный чип, а не залитая эпоксидкой НЁХ), но ничего не изменилось.

KivApple ★★★★★
() автор топика
Последнее исправление: KivApple (всего исправлений: 4)
Ответ на: комментарий от KivApple

У «стандартных» дешевых модулей на клонах выходная мощность далека от оригинала. Но будет вполне достаточна для входа усилителя. Есть ссылка или картинка?

Но я из них полной скорости выжать не пытался (наоборот понижал скорость для дальности), но чип настолько распространен, что в баги чипа верится с трудом.

alexru ★★★★
()
Последнее исправление: alexru (всего исправлений: 1)
Ответ на: комментарий от KivApple

Модуль с усилителем похож на настоящий.

Без - точно подделка. Даты производства на многих подделках 1242AF и 1331AF.

alexru ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.