Quiero enviar y recibir datos al aire utilizando un par de nRF24L01 + módulos. Estoy usando PIC16F684 como microcontrolador y trabajando con el software SPI. Puse los datos en la línea MOSI antes de elevar el SCK y leí los datos de la línea MISO entre subir y bajar el SCK (en la parte superior). Pero los dispositivos no funcionan. Este es mi código en mikroC:
char nRF_SPI_Read() {
char k, d;
d = 0;
for (k = 0; k < 8; k++) {
d <<= 1;
nRF_SCK = 0b1;
Delay_ms(1);
if (nRF_MISO) d |= 1;
nRF_SCK = 0b0;
Delay_ms(1);
}
return d;
}
void nRF_SPI_Write(char dt) {
char k;
for (k = 0; k < 8; k++) {
nRF_MOSI = dt.B7;
dt <<= 1;
Delay_ms(1);
nRF_SCK = 0b1;
Delay_ms(2);
nRF_SCK = 0b0;
Delay_ms(1);
}
}
void nRF_CSN_Low() {
nRF_CSN = 0b0;
Delay_ms(1);
}
void nRF_CSN_High() {
nRF_CSN = 0b1;
Delay_ms(1);
}
void nRF_WriteRegister(char reg, char val) {
nRF_CSN_Low();
nRF_SPI_Write(nRF_W_REGISTER | reg);
nRF_SPI_Write(val);
nRF_CSN_High();
}
char nRF_ReadRegister(char reg) {
char r;
nRF_CSN_Low();
nRF_SPI_Write(nRF_R_REGISTER | reg);
r = nRF_SPI_Read();
nRF_CSN_High();
return r;
}
void nRF_Command(char cmd) {
nRF_CSN_Low();
nRF_SPI_Write(cmd);
nRF_CSN_High();
}
char nRF_Status() {
return nRF_ReadRegister(nRF_STATUS);
}
void nRF_Clear_Status() {
nRF_WriteRegister(nRF_STATUS, 0x70);
}
void nRF_FlushTXRX() {
nRF_Clear_Status();
nRF_Command(nRF_FLUSH_TX);
nRF_Command(nRF_FLUSH_RX);
}
void nRF_ReadPayload() {
char k;
nRF_CSN_Low();
nRF_SPI_Write(nRF_R_RX_PAYLOAD);
for (k = 0; k < 2; k++) PayLoad[k] = nRF_SPI_Read();
nRF_CSN_High();
}
void nRF_WritePayload() {
char k;
nRF_FlushTXRX();
nRF_WriteRegister(nRF_CONFIG, nRF_CONFIG_MASK_TX_DS | nRF_CONFIG_MASK_MAX_RT | nRF_CONFIG_EN_CRC | nRF_CONFIG_PWR_UP);
nRF_CSN_Low();
nRF_SPI_Write(nRF_W_TX_PAYLOAD);
for (k = 0; k < 2; k++) nRF_SPI_Write(PayLoad[k]);
nRF_CSN_High();
nRF_CE = 0b1;
Delay_us(60);
nRF_CE = 0b0;
}
void nRF_Init() {
nRF_CE = 0b0;
nRF_CSN_High();
nRF_WriteRegister(nRF_CONFIG, nRF_CONFIG_MASK_TX_DS | nRF_CONFIG_MASK_MAX_RT | nRF_CONFIG_EN_CRC);
nRF_WriteRegister(nRF_SETUP_RETR, nRF_SETUP_RETR_ARD_250 | nRF_SETUP_RETR_ARC_0);
nRF_WriteRegister(nRF_SETUP_AW, nRF_SETUP_AW_5BYTES);
nRF_WriteRegister(nRF_RF_SETUP, nRF_RF_SETUP_RF_DR_2000 | nRF_RF_SETUP_RF_PWR_0);
nRF_WriteRegister(nRF_RF_CH, 9);
nRF_WriteRegister(nRF_EN_AA, nRF_EN_AA_NONE);
nRF_WriteRegister(nRF_RX_PW_P0, 2);
nRF_WriteRegister(nRF_CONFIG, nRF_CONFIG_MASK_TX_DS | nRF_CONFIG_MASK_MAX_RT | nRF_CONFIG_EN_CRC | nRF_CONFIG_PWR_UP | nRF_CONFIG_PRIM_RX);
//set_TX_RX_address(address, 5, TX_ADDR_reg);
//set_TX_RX_address(address, 5, RX_ADDR_P0_reg);
nRF_FlushTXRX();
nRF_CE = 0b1;
}
void main() {
bit b1, b2;
PORTA = 0;
PORTC = 0;
OPTION_REG = 0b01011111;
ANSEL = 0;
CMCON0 = 7;
TRISA = 0b110000;
WPUA = 0b110000;
TRISC = 0b100001;
b1 = RA5_bit;
b2 = RA4_bit;
PayLoad[0] = 0;
nRF_Init();
while (1) {
if (b1 != RA5_bit) {
Delay_ms(500); // debouncing
if (b1) {
PayLoad[0] = 45;
PayLoad[1] = 84;
RA0_bit = !RA0_bit;
}
b1 = RA5_bit;
}
if (b2 != RA4_bit) {
Delay_ms(500); // debouncing
if (b2) {
PayLoad[0] = 108;
PayLoad[1] = 240;
RA1_bit = !RA1_bit;
}
b2 = RA4_bit;
}
if (PayLoad[0]) {
nRF_WritePayload();
PayLoad[0] = 0;
}
if (nRF_Status().B6) {
nrf_ReadPayload(); // RX_Payload(&dt);
if ((PayLoad[0] == 45) && (PayLoad[1] == 84)) RA0_bit = !RA0_bit;
if ((PayLoad[0] == 108) && (PayLoad[1] == 240)) RA1_bit = !RA1_bit;
PayLoad[0] = 0;
nRF_Clear_Status();
}
Delay_100ms();
}
}
Y este es el estado de los pines en el analizador lógico para la función nRF_Status()
:
¿Cuáles son las señales que los circulé de color rosa? Mi micro no los lee. ¿Por qué el primer byte y el segundo byte que se leen desde nRF no son los mismos? (Ambos deben ser el valor del registro de estado, ¿verdad?). ¿Por qué no se transmiten datos entre dos dispositivos?