Disculpa por la tardanza, pero estaba de viaje. Los modulos NRF24L01 tienen poca potencia y solo sirven para pequeñas distancias, el NRF905 tiene +10dBm .
Esta es la libreria que hize para el NRF905, no contempla todas las posibilidades del modulo. Espero que te sirva.
/*******************************************************************************
CONNECTOR NRF905
---------------
Cable 3 fils:
Vermell PIN_A0 CARR_DETECT
Groc PIN_A1 ADDR_MATCH
Groc PIN_A2 DATA_READY
Cable 3 fils:
Vermell PIN_C0 TX_EN
Verd PIN_C1 PWR_UP
Verd PIN_C2 TRX_CE
Cable 4 fils:
Vermell PIN_B0 SPI_CS
Blau PIN_B1 SPI_CLK
Blau PIN_B2 SPI_OUT MOSI
Blau PIN_B3 SPI_IN MISO
Definició de PIN´S per utilitzar el cable de prova
---------------------------------------------------------
#define SPI_CS PIN_B0
#define SPI_CLK PIN_B1
#define SPI_OUT PIN_B2 // MOSI
#define SPI_IN PIN_B3 // MISO
#define TX_EN PIN_C0
#define PWR_UP PIN_C1
#define TRX_CE PIN_C2
#define CARR_DETECT PIN_A0
#define ADDR_MATCH PIN_A1
#define DATA_READY PIN_A2
///////////////////////////////////////////////////////////////////////////////
----------------------------
CABLE NOU DE PROVA NRF905
----------------------------
Cable 8 fils:
Blanc PIN_B0 SPI_CS
PIN_B1 SPI_CLK
PIN_B2 SPI_OUT MOSI
PIN_B3 SPI_IN MISO
PIN_B4 DATA READY
PIN_B5 PWR_UP
PIN_B6 TRX_CE
Blau PIN_B7 TX_EN
Cable 3 fils:
Blau PIN_C0 CD
Blanc PIN_C1 AM
Groc PIN_C2 UCK
*******************************************************************************/
#ifndef SPI_CS
#define SPI_CS PIN_B0
#endif
#ifndef SPI_CLK
#define SPI_CLK PIN_B1
#endif
#ifndef SPI_OUT
#define SPI_OUT PIN_B2 // MOSI
#endif
#ifndef SPI_IN
#define SPI_IN PIN_B3 // MISO
#endif
#ifndef DATA_READY
#define DATA_READY PIN_B4
#endif
#ifndef PWR_UP
#define PWR_UP PIN_B5
#endif
#ifndef TRX_CE
#define TRX_CE PIN_B6
#endif
#ifndef TX_EN
#define TX_EN PIN_B7
#endif
#ifndef CARR_DETECT
#define CARR_DETECT PIN_C0 // Si s'utilitza el "Carrier Detect"
#endif
#ifndef ADDR_MATCH
#define ADDR_MATCH PIN_C1 // Si s'utilitza el "Address Match"
#endif
#ifndef REG_CFG_0
#define REG_CFG_0 0x01 //0x6C 0x01 = Canal nº 1
#endif
#ifndef REG_CFG_1
#define REG_CFG_1 0x0C //0x00 0x0C = +10dbm 0x08 = +6dbm 0x04 = -2dbm 0x00 = -10dbm [7:6]no utilitzat, [5]AUTO_RETRAN, [4]RX_RED_PWR, [3:2]PA_PWR, [1]HFREQ_PLL, [0]Bit8 CH_NO
#endif
#ifndef REG_CFG_2
#define REG_CFG_2 0x44 //0b01000100 4 bytes RX_ADDRESS y TX_ADDRESS [7]no utilitzat, [6:4]TX_AFW, [3]no utilitzat, [2:0]RX_AFW
#endif
#ifndef REG_CFG_3
#define REG_CFG_3 0x06 //0x20 PAYLOAD de 32 bytes
#endif
#ifndef REG_CFG_4
#define REG_CFG_4 0x06 //0x20 PAYLOAD de 32 bytes
#endif
#ifndef RX_ADDRESS_1
#define RX_ADDRESS_1 0xE7
#endif
#ifndef RX_ADDRESS_2
#define RX_ADDRESS_2 0xE7
#endif
#ifndef RX_ADDRESS_3
#define RX_ADDRESS_3 0xE7
#endif
#ifndef RX_ADDRESS_4
#define RX_ADDRESS_4 0xE7
#endif
#ifndef REG_CFG_9
#define REG_CFG_9 0x58 // 0b01011000 CRC de 8 bits activat y 16MHz XOF [7]CRC_MODE, [6]CRC_EN, [5:3]XOF, [2]UP_CLK_EN, [1:0]UP_CLK_FREQ
#endif
#ifndef BUFF_RX_PL
#define BUFF_RX_PL REG_CFG_3 + 1 // Registre 3 + 1 byte
#endif
#ifndef BUFF_TX_PL
#define BUFF_TX_PL REG_CFG_4 + 1 // Registre 4 + 1 byte
#endif
#define WRITE_CFG 0x00
#define READ_CFG 0x10
#define WRITE_TX_PL 0x20
#define WRITE_TX_AD 0x22
#define READ_RX_PL 0x24
Byte SpiRead(void);
void SpiWrite(byte Data);
void SetConfig();
void TestConfig(void);
void TxPacket(void);
void RxPacket(void);
void SetRxMode(void);
Byte TxBuf[BUFF_TX_PL];
Byte RxBuf[BUFF_RX_PL];
void TestConfig(void)
{
int8 i;
byte tmp[10];
printf("Llegint registres...\r");
delay_ms(50);
printf(" \r");
delay_ms(50);
output_high(PWR_UP);
output_low(TRX_CE);
output_low(SPI_CS);
SpiWrite(READ_CFG);
for (i=0; i<10; i++) Tmp[i]=SpiRead();
output_high(SPI_CS);
for (i=0; i<10; i++)
{
printf("Registre %d = %X\r",(i),tmp[i]);
delay_ms(50);
}
printf(" \r");
delay_ms(50);
}
void SetConfig()
{
output_high(PWR_UP);
output_low(TRX_CE);
output_low(TX_EN);
output_low(SPI_CS);
SpiWrite(WRITE_CFG);
SpiWrite(REG_CFG_0);
SpiWrite(REG_CFG_1);
SpiWrite(REG_CFG_2);
SpiWrite(REG_CFG_3);
SpiWrite(REG_CFG_4);
SpiWrite(RX_ADDRESS_1);
SpiWrite(RX_ADDRESS_2);
SpiWrite(RX_ADDRESS_3);
SpiWrite(RX_ADDRESS_4);
SpiWrite(REG_CFG_9);
output_high(SPI_CS);
printf("Gravats els registres...\r");
delay_ms(50);
printf(" \r");
delay_ms(50);
}
void SpiWrite(byte Data)
{
int8 i;
byte D;
D=Data;
output_bit(SPI_OUT,bit_test(D,7));
for(i=0; i<8; i++)
{
output_high(SPI_CLK);
D=D << 1;
output_low(SPI_CLK);
output_bit(SPI_OUT,bit_test(D,7));
}
output_low(SPI_OUT);
}
byte SpiRead(void)
{
int8 i;
byte D=0;
for (i=0; i<8; i++)
{
D=D << 1;
output_high(SPI_CLK);
if(input(SPI_IN)) bit_set(D,0);
output_low(SPI_CLK);
}
return D;
}
void TxPacket(void)
{
int8 i;
output_high(PWR_UP);
output_high(TX_EN);
output_low(TRX_CE);
output_low(SPI_CS);
SpiWrite(WRITE_TX_AD);
SpiWrite(RX_ADDRESS_1);
SpiWrite(RX_ADDRESS_2);
SpiWrite(RX_ADDRESS_3);
SpiWrite(RX_ADDRESS_4);
output_high(SPI_CS);
delay_us(100);
output_low(SPI_CS);
SpiWrite(WRITE_TX_PL);
for (i=0; i<BUFF_TX_PL; i++) SpiWrite(TxBuf[i]);
output_high(SPI_CS);
output_high(TRX_CE);
delay_us(20);
output_low(TRX_CE);
}
void RxPacket(void)
{
int8 i;
output_high(PWR_UP);
output_low(TX_EN);
output_low(TRX_CE);
output_low(SPI_CS);
SpiWrite(READ_RX_PL);
for(i=0; i<BUFF_RX_PL; i++) RxBuf[i] = SpiRead();
output_high(SPI_CS);
}
void SetRxMode(void)
{
output_high(PWR_UP);
output_low(TX_EN);
output_high(TRX_CE);
delay_us(650);
}
Para utilizarla solo tienes que cambiar los pines de los defines de acuerdo con el PIC utilizado y
1 llamar a la funcion void SetConfig(); para grabar los registros.
2 si quieres comprobar los registros grabados, llama a la funcion void TestConfig(void);
3 llama a la funcion void SetRxMode(void); para colocar al modulo en modo recepcion
4 para transmitir coloca los datos a transmitir en Byte TxBuf[BUFF_TX_PL]; llama a la funcion void TxPacket(void); y despues llama a la funcion void SetRxMode(void);
para colocar al modulo en modo recepcion.
5 para recibir comprueba el estado de DATA_READY y si esta en alto llama a la funcion void RxPacket(void); los datos se cargaran en el bufer Byte RxBuf[BUFF_RX_PL]; y
llama a la funcion void SetRxMode(void); para colocar al modulo en modo recepcion.
Este modulo tienes muchas posibilidades en la hoja de datos lo tienes muy bien detallado.
Saludos,
Miquel