nRF24L01+ v multiciever režimu 1x PRX - více PTX

Zdravím. Zase se trápím s komunikací s více vysílači s nRF24L01+. Když si povídají jen dva mezi sebou, tak je všechno v pohodě, ale jak chci si povídat s více členy (PTX) tak mi to přijímá data pořád jen z jednoho. A to z toho, který je nastaven v adresovém registru RX_ADDR_P1. Z jiných mi to prostě nejde. Když adreso v RX_ADDR_P1 změním na jinej PTX, tak si to povídá s ním. Knihovnu pro komunikaci s modulem jsem si našel na netu a postupně poupravil. Přijímací adresy mám povolený všechny a Auto acknowlege taky. Přikládám výtah fcí pro náběh procesoru a nastavení nrf24L01+, v příloze jsou celé soubory. Někde mám nějakou krpu a už nevím kde. Procházel jsem snad všechno několikrát a zaboha nejsem schopnej to najít. Poradil by někdo jestli jsem jen slepej a něco přehlížím, nebo bl…

Main:

[code]#include <avr/io.h>
#include <stdint.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <stdlib.h>

#include “…/nrf24.h”
#include “…/uart.h”

/* ------------------------------------------------------------------------- */
uint8_t temp;
char buf[8];
uint8_t q = 0;
uint8_t tmp = 0;
uint8_t data_array[5];
uint8_t data_pipe;
uint8_t master_address[5] = {0xD7,0xD7,0xD7,0xD7,0xD7}; // master
uint8_t slave1_address[5] = {0xE7,0xE7,0xE7,0xE7,0xE7}; // levý terč
uint8_t slave2_address[5] = {0xE7,0xE7,0xE7,0xE7,0xA7}; // pravý terč
uint8_t slave3_address[5] = {0xE7,0xE7,0xE7,0xE7,0xE9}; //
uint8_t slave4_address[5] = {0xE7,0xE7,0xE7,0xE7,0xEA}; //

/* ------------------------------------------------------------------------- /
int main()
{
/
init the software uart */
uart_init(UART_BAUD_SELECT(19200,F_CPU));
sei();

/* simple greeting message */
uart_puts_P("\r\n> TX device ready\r\n");

/* init hardware pins */
nrf24_init();

/* Channel #108 , payload length: 5, master */
nrf24_config(108,5,1);

/* Set the device addresses */
//nrf24_tx_address();
nrf24_rx_address(RX_ADDR_P0, master_address);
nrf24_rx_address(RX_ADDR_P1, slave1_address);    
nrf24_rx_address(RX_ADDR_P5, slave2_address);

PORTC |= _BV(PINC0) | _BV(PINC1);		//nastavení pro zkušební tlačítka

uart_puts_P("RX_ADDR_P1 ");		// kontrola zapsání adresy
nrf24_readRegister(RX_ADDR_P1,slave4_address,5);
utoa(slave4_address[4],buf,10);
uart_puts(buf);
uart_puts_P("\r\n");

uart_puts_P("RX_ADDR_P2 ");		// kontrola zapsání adresy
nrf24_readRegister(RX_ADDR_P2,slave4_address,1);
utoa(slave4_address[0],buf,10);
uart_puts(buf);
uart_puts_P("\r\n");


while(1)

atd…[/code]

nastavovací rutiny v nrf24.c

[code]/* configure the module /
void nrf24_config(uint8_t channel, uint8_t pay_length, uint8_t master)
{
/
Use static payload length … */
payload_len = pay_length;

// CRC enable, 1 byte CRC length
nrf24_configRegister(CONFIG,nrf24_CONFIG);	// #define nrf24_CONFIG ((1<<EN_CRC)|(0<<CRCO))

 // Auto retransmit delay: 1000 us and Up to 15 retransmit trials
 nrf24_configRegister(SETUP_RETR,(0x04<<ARD)|(0x0F<<ARC));

// Set RF channel
nrf24_configRegister(RF_CH,channel);

// 1 Mbps, TX gain: 0dbm
nrf24_configRegister(RF_SETUP, (0<<RF_DR)|((0x03)<<RF_PWR));

//if (master == 1)
//{
	// Auto Acknowledgment
	nrf24_configRegister(EN_AA,(1<<ENAA_P0)|(1<<ENAA_P1)|(1<<ENAA_P2)|(1<<ENAA_P3)|(1<<ENAA_P4)|(1<<ENAA_P5));

	// Enable RX addresses
	nrf24_configRegister(EN_RXADDR,(1<<ERX_P0)|(1<<ERX_P1)|(1<<ERX_P2)|(1<<ERX_P3)|(1<<ERX_P4)|(1<<ERX_P5));
	
	// Dynamic length configurations: No dynamic length
	nrf24_configRegister(DYNPD,(0<<DPL_P0)|(0<<DPL_P1)|(0<<DPL_P2)|(0<<DPL_P3)|(0<<DPL_P4)|(0<<DPL_P5));
	
	// Set length of incoming payload
	nrf24_configRegister(RX_PW_P0, payload_len); // Auto-ACK pipe ...
	nrf24_configRegister(RX_PW_P1, payload_len); // Data payload pipe
	nrf24_configRegister(RX_PW_P2, payload_len); // Data payload pipe
	nrf24_configRegister(RX_PW_P3, payload_len); // Data payload pipe
	nrf24_configRegister(RX_PW_P4, payload_len); // Data payload pipe
	nrf24_configRegister(RX_PW_P5, payload_len); // Data payload pipe

nrf24_powerUpRx();
}

[/code]

a fce pro zjišťování zda přišla zpráva ( nevxužívám přerušení)

[code]/* Checks if data is available for reading /
/
Returns 1 if data is ready … /
uint8_t nrf24_dataReady(uint8_t
pipe)
{
// See note in getData() function - just checking RX_DR isn’t good enough
uint8_t status = nrf24_getStatus();

// We can short circuit on RX_DR, but if it's not set, we still need
// to check the FIFO for any pending packets
if ( status & (1 << RX_DR) ) 
{
	*pipe = (status & MASK_RX_P_NO) >> 1;		//#define MASK_RX_P_NO	0x0E
    return 1;
}

return !nrf24_rxFifoEmpty();;

}[/code]
nrf24L01+.rar (14.1 KB)

To tu není nikdo, kdo si hrál s tímto modulem a neporadil by kde můžu mít chybu?

Je mi líto, ještě jsem se k němu nedostal, i když jej mám již koupený. :frowning:

Mám jich 12 a ještě jsem se k tomu nedostal. Chtěl jsem mít jeden master, kterej by přijímal data z 11x slave.