Guest User

Untitled

a guest
Mar 16th, 2019
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.78 KB | None | 0 0
  1. #include <avr/io.h>
  2. #include <stdio.h>
  3. #include <util/delay.h>
  4. #include <avr/interrupt.h>
  5.  
  6. #include "nrf24l01.h"
  7. #include "my_usartlib.h"
  8.  
  9. void initSPI();
  10. uint8_t writeByteSPI(uint8_t);
  11. uint8_t readReg(uint8_t);
  12. void writeReg(uint8_t, uint8_t);
  13. uint8_t *readRegArray(uint8_t, uint8_t *data, uint8_t);
  14. void nrf24l01_init();
  15. void nrf_transmit(uint8_t * W_buff);
  16. void reset_IRQ();
  17.  
  18.  
  19. uint8_t rx_address[] = {0x12, 0x12, 0x12, 0x12, 0x12};
  20. uint8_t tx_address[] = {0x12, 0x12, 0x12, 0x12, 0x12};
  21.  
  22. uint8_t* rx_buffer;
  23. volatile uint8_t rx_flag = 0x00;
  24.  
  25.  
  26.  
  27. int main(void){
  28.     usart_init();
  29.     usart_tx_string("UART success\n");
  30.    
  31.     DDRD |= (1<<6);     //D6 (LED) output
  32.     DDRD &= ~(1<<2);    //D2 (INT0) input
  33.     usart_tx_string("IO success\n");
  34.    
  35.     initSPI();
  36.     usart_tx_string("SPI success\n");
  37.        
  38.     nrf24l01_init();
  39.     usart_tx_string("NRF RX Setup success\n");
  40.    
  41.     _delay_ms(200);
  42.     PORTD |= (1<<6);
  43.     _delay_ms(200);
  44.     PORTD &= ~(1<<6);
  45.     _delay_ms(200);     //flash LED to denote success
  46.  
  47.     EICRA |= (1<<ISC01);    //Falling edge detect
  48.     EIMSK |= (1<<INT0);
  49.  
  50.    
  51.     usart_tx_string("CONFIG = 0x");
  52.     usart_tx_val(readReg(CONFIG), 16); usart_tx('\n');
  53.     sei();
  54.     PORTB |= (1 << 1);  //CE high, start listening
  55.    
  56.     while (1) {
  57.         if(rx_flag){
  58.             rx_flag = 0x00;
  59.             for(int i = 0; i < 5; i++){
  60.                 usart_tx_val(rx_buffer[i], 16);
  61.                 usart_tx(',');
  62.             }
  63.             usart_tx('\n');
  64.            
  65.             PORTD |= (1<<6);
  66.             _delay_ms(2000);
  67.             PORTD &= ~(1<<6);
  68.             _delay_ms(2000);    //LED ON for 2s, wait for 2s
  69.            
  70.             PORTB |= (1<<1);    //start listening again
  71.             reset_IRQ();   
  72.         }
  73.         _delay_ms(1000);
  74.         usart_tx_string("FIFO STATUS = 0x");
  75.         usart_tx_val(readReg(FIFO_STATUS), 16); usart_tx('\n');
  76.     }
  77. }
  78.  
  79.  
  80.  
  81.  
  82. void initSPI(){
  83.     DDRB |= (1<<DDB5) | (1<<DDB3) | (1<<DDB2) | (1<<DDB1);
  84.    
  85.     SPCR |= (1<<SPE) | (1<<MSTR);
  86.    
  87.     PORTB |= (1 << 2);  // CSN High
  88.     PORTB &= ~(1 << 1); // CE low
  89. }
  90.  
  91. uint8_t writeByteSPI(uint8_t cData){
  92.     SPDR = cData;
  93.     while(!(SPSR & (1<<SPIF)));
  94.     return SPDR;
  95. }
  96.  
  97. uint8_t readReg(uint8_t reg){
  98.     _delay_us(10);
  99.     PORTB &= ~(1 << 2);
  100.    
  101.     _delay_us(10);
  102.     writeByteSPI(R_REGISTER + reg);
  103.    
  104.     _delay_us(10);
  105.     reg = writeByteSPI(NOP);
  106.    
  107.     _delay_us(10);
  108.     PORTB |= (1 << 2);
  109.     return reg;
  110. }
  111.  
  112. void writeReg(uint8_t reg, uint8_t data){
  113.     _delay_us(10);
  114.     PORTB &= ~(1 << 2);
  115.    
  116.     _delay_us(10);
  117.     writeByteSPI(W_REGISTER + reg);
  118.    
  119.     _delay_us(10);
  120.     writeByteSPI(data);
  121.    
  122.     _delay_us(10);
  123.     PORTB |= (1 << 2);
  124. }
  125.  
  126. void writeRegArray(uint8_t reg, uint8_t *data, uint8_t data_length){
  127.     _delay_us(10);
  128.     PORTB &= ~(1 << 2);
  129.     _delay_us(10);
  130.     writeByteSPI(W_REGISTER + reg);
  131.     _delay_us(10);
  132.    
  133.     for(int i = 0; i < data_length; i++){
  134.         writeByteSPI(data[i]);
  135.         _delay_us(10);
  136.     }
  137.    
  138.     PORTB |= (1 << 2);
  139. }
  140.  
  141. uint8_t *readRegArray(uint8_t reg, uint8_t *data, uint8_t data_length){
  142.     static uint8_t ret[32];
  143.    
  144.     _delay_us(10);
  145.     PORTB &= ~(1 << 2);
  146.     _delay_us(10);
  147.     writeByteSPI(reg);
  148.     _delay_us(10);
  149.    
  150.     for(int i = 0; i < data_length; i++){
  151.         ret[i] = writeByteSPI(NOP);
  152.         _delay_us(10);
  153.     }
  154.    
  155.     PORTB |= (1 << 2);
  156.    
  157.     return ret;
  158. }
  159.  
  160. void nrf24l01_init(){
  161.     _delay_ms(100);
  162.    
  163.     writeReg(EN_AA, 0x3F);      //enable auto-ack
  164.     writeReg(SETUP_RETR, 0x2F); //15 retries at 750us for EN_AA
  165.    
  166.     writeReg(EN_RXADDR, 0x03);  //enable data pipe 0&1
  167.    
  168.     writeReg(SETUP_AW, 0x03);   //5 bytes of rx address
  169.    
  170.     writeReg(RF_CH, 0x01);      //2.401GHz frequency
  171.    
  172.     writeReg(RF_SETUP, 0x07);   //power and range modes
  173.    
  174.     writeRegArray(RX_ADDR_P1, rx_address, 5);
  175.     //writeRegArray(TX_ADDR, tx_address, 5);
  176.    
  177.     writeReg(RX_PW_P1, 5);  //5 byte payload width
  178.    
  179.     writeReg(CONFIG, 0x1F); //bits 4, 3, 2, 1, 0 (receiver)
  180.     _delay_ms(100);
  181. }
  182.  
  183. void reset_IRQ(void){
  184.     writeReg(STATUS, 0x70);
  185. }
  186.  
  187. ISR(INT0_vect){
  188.     PORTB &= ~(1 << 1);
  189.     rx_buffer = readRegArray(R_RX_PAYLOAD, rx_buffer, 5);
  190.     rx_flag = 0xFF;
  191.    
  192.     reset_IRQ();
  193. }
Advertisement
Add Comment
Please, Sign In to add comment