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)