#include <avr/io.h>
#include <stdio.h>
#include <avr/delay.h>
#include "SPI.h"
#define F_CPU 1000000UL
#include <avr/interrupt.h>
//#include "nRF24L01.h"
#define PORT_SPI PORTB
#define DDR_SPI DDRB
#define DD_MISO DDB4
#define DD_MOSI DDB3
#define DD_SS DDB2
#define DD_CE DDB1
#define DD_SCK DDB5
#define W 1
#define R 0
#define CONFIG 0x00
#define STATUS 0x07
#define RF_CH 0x05
#define EN_AA 0x01
#define RF_SETUP 0x06
#define EN_RXADDR 0x02
#define SETUP_AW 0x03
#define SETUP_RETR 0x04
#define RX_ADDR_P0 0x0A
#define TX_ADDR 0x10
#define RX_PW_P0 0x11
#define R_REGISTER 0x00
#define W_REGISTER 0x20
#define R_RX_PAYLOAD 0x61
#define W_TX_PAYLOAD 0xA0
#define FLUSH_TX 0xE1
#define FLUSH_RX 0xE2
#define NOP 0xFF
void spi_init()
//inicializacion de la comunicacion SPI
{
DDR_SPI |= ((1<<DD_MOSI)|(1<<DD_SS)|(1<<DD_SCK)|(1<<DD_CE));
SPCR |= (1<<SPE)|(1<<MSTR); // SPI Enable y Master/Slave select
//(0<<SPIE)| // SPI Interupt Enable
//(0<<DORD)| // Data Order (0:MSB first / 1:LSB first)
//(0<<SPR1)|(1<<SPR0)| // SPI Clock Rate
//(0<<CPOL)| // Clock Polarity (0:SCK low / 1:SCK hi when idle)
//(0<<CPHA)); // Clock Phase (0:leading / 1:trailing edge sampling)
//SPSR = (1<<SPI2X); // Double Clock Rate
PORTB|= (1<<PORTB2);
PORTB&= (0<<PORTB1);
}
char WByteSPI(unsigned char dato){
SPDR = dato;
while(!(SPSR & (1<<SPIF)));
return SPDR;
}
uint8_t LeerReg(uint8_t reg){
_delay_us(10);
PORTB&= (0<<PORTB2);
_delay_us(10);
WByteSPI(R_REGISTER + reg);
_delay_us(10);
reg=WByteSPI(NOP);
PORTB|= (1<<PORTB2);
return reg;
}
void EscribirReg(uint8_t reg, uint8_t paquete){
_delay_us(10);
PORTB&= (0<<PORTB2);
_delay_us(10);
WByteSPI(W_REGISTER + reg);
_delay_us(10);
WByteSPI(paquete);
_delay_us(10);
PORTB|= (1<<PORTB2);
}
uint8_t *WtoNrf(uint8_t RW, uint8_t reg, uint8_t *val, uint8_t n)
{
if (RW == W)
{
reg = W_REGISTER + reg;
}
static uint8_t ret[32];
_delay_us(10);
PORTB&= (0<<PORTB2);
_delay_us(10);
WByteSPI(reg);
_delay_us(10);
int i;
for (i=0; i<n; i++)
{
if ((RW == R) && (reg != W_TX_PAYLOAD))
{
ret[i]=WByteSPI(NOP);
_delay_us(10);
}
else
{
WByteSPI(val[i]);
_delay_us(10);
}
}
PORTB|= (1<<PORTB2);
return ret;
}
int main(void)
{
uint8_t val[5];
uint8_t *data;
int i=0;
DDRD=255;
// Inicializa SPI
spi_init();
_delay_ms(500);
val[0]=0x01;
WtoNrf(W,EN_AA,val,1);
WtoNrf(W,EN_RXADDR,val,1);
val[0]=0x03;
WtoNrf(W,SETUP_AW,val,1);
val[0]=0x01;
WtoNrf(W,RF_CH,val,1);
val[0]=0x07;
WtoNrf(W,RF_SETUP,val,1);
for(i=0; i<5; i++)
{
val[i]=0x12;
}
WtoNrf(W,TX_ADDR,val,5);
val[0]=5;
WtoNrf(W,RX_PW_P0,val,1);
val[0]=0x2F;
WtoNrf(W,SETUP_RETR,val,1);
val[0]=0x1E;
WtoNrf(W,CONFIG,val,1);
_delay_ms(100);
//uint8_t write[5];
//for(i=0; i<5; i++)
//{
//write[i]=0x93;
//}
//WtoNrf(R,FLUSH_TX,write,0);
//WtoNrf(R,W_TX_PAYLOAD,write,5);
//_delay_ms(15);
data= WtoNrf(R,CONFIG,data,2);
PORTD = data[1];
_delay_ms(1500);
PORTD = 0;
_delay_ms(1000);
data= WtoNrf(R,RF_CH,data,1);
PORTD = data[0];
_delay_ms(1500);
PORTD = 0;
_delay_ms(1000);
while(1)
{
//TODO:: Please write your application code
}
}
No hay comentarios:
Publicar un comentario