Advertisement
Guest User

nrf24l01+ setup

a guest
Apr 19th, 2014
232
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.57 KB | None | 0 0
  1. #include <bcm2835.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include "nRF24L01.h"
  6.  
  7. #define CE RPI_GPIO_P1_22
  8. #define LED RPI_GPIO_P1_12
  9.  
  10. void initSPI(){
  11.     /*
  12.      *      Init SPI
  13.      */
  14.     if (!bcm2835_init()){
  15.         exit(1);
  16.     }
  17.     bcm2835_spi_begin();
  18.     bcm2835_spi_setBitOrder(BCM2835_SPI_BIT_ORDER_MSBFIRST);      
  19.     bcm2835_spi_setDataMode(BCM2835_SPI_MODE0);                  
  20.     bcm2835_spi_setClockDivider(BCM2835_SPI_CLOCK_DIVIDER_128);
  21.     bcm2835_spi_chipSelect(BCM2835_SPI_CS0);                      
  22.     bcm2835_spi_setChipSelectPolarity(BCM2835_SPI_CS0, LOW);      
  23.  
  24.    
  25.     //STAT led in CE
  26.     bcm2835_gpio_fsel(CE, BCM2835_GPIO_FSEL_OUTP);
  27.     bcm2835_gpio_fsel(LED, BCM2835_GPIO_FSEL_OUTP);
  28.     bcm2835_gpio_write(CE, LOW);           
  29. }
  30.  
  31. void writeSPI(char command, uint8_t reg, uint8_t* payload, int size){
  32.     /*  R - read, W - write, C - command
  33.      *  
  34.      */
  35.    
  36.     uint8_t* buffer;
  37.     int i;
  38.     buffer = (uint8_t*)malloc(sizeof(uint8_t)*(size+1));
  39.    
  40.     if(command == 'W'){
  41.         reg = W_REGISTER + reg;
  42.     }
  43.     buffer[0] = reg;
  44.    
  45.     if(command == 'R'){
  46.         for(i = 1; i < size+1; i++){
  47.             buffer[i] = 0xFF; //nop
  48.         }
  49.     }else{
  50.         memcpy(buffer+1, payload, sizeof(uint8_t)*size);
  51.     }
  52.    
  53.     bcm2835_spi_transfern(buffer, size+1);
  54.     if(command = 'R'){
  55.         memcpy(payload, buffer+1, sizeof(uint8_t)*size);
  56.     }
  57.    
  58. }
  59.  
  60. void printOut(){
  61.     uint8_t* stat;
  62.     stat = (uint8_t*)malloc(sizeof(uint8_t)*5);
  63.     writeSPI('R', STATUS, stat, 1);
  64.     printf("Status:\t\t 0x%02X\n",stat[0]);
  65.    
  66.     writeSPI('R', RX_ADDR_P0, stat, 5);
  67.     printf("RX_ADDR_P0:\t 0x%02X%02X%02X%02X%02X\n",stat[0],stat[1],stat[2],stat[3],stat[4]);
  68.    
  69.     writeSPI('R', RX_ADDR_P1, stat, 5);
  70.     printf("RX_ADDR_P1:\t 0x%02X%02X%02X%02X%02X\n",stat[0],stat[1],stat[2],stat[3],stat[4]);
  71.    
  72.     writeSPI('R', TX_ADDR, stat, 5);
  73.     printf("TX_ADDR:\t 0x%02X%02X%02X%02X%02X\n",stat[0],stat[1],stat[2],stat[3],stat[4]);
  74.    
  75.     writeSPI('R', RX_PW_P0, stat, 1);
  76.     printf("RX_PW_P0:\t 0x%02X\n",stat[0]);
  77.    
  78.     writeSPI('R', RX_PW_P1, stat, 1);
  79.     printf("RX_PW_P1:\t 0x%02X\n",stat[0]);
  80.    
  81.     writeSPI('R', EN_AA, stat, 1);
  82.     printf("EN_AA:\t\t 0x%02X\n",stat[0]);
  83.    
  84.     writeSPI('R', EN_RXADDR, stat, 1);;
  85.     printf("EN_RXADDR:\t 0x%02X\n",stat[0]);
  86.  
  87.     writeSPI('R', RF_CH, stat, 1);
  88.     printf("RF_CH:\t\t 0x%02X\n",stat[0]);
  89.    
  90.     writeSPI('R', RF_SETUP, stat, 1);
  91.     printf("RF_SETUP:\t 0x%02X\n",stat[0]);
  92.    
  93.     writeSPI('R', CONFIG, stat, 1);
  94.     printf("CONFIG:\t\t 0x%02X\n",stat[0]);
  95.    
  96.     writeSPI('R', DYNPD, stat, 1);
  97.     printf("DYNPD:\t\t 0x%02X\n",stat[0]);
  98.    
  99.     writeSPI('R', RF_SETUP, stat, 1);
  100.     if((stat[0] & (1<<RF_DR_LOW)) == 0){
  101.         //1/2mbs
  102.         if((stat[0] & (1<<RF_DR_HIGH)) == 0){
  103.             printf("Data Rate:\t 1Mbps\n");        
  104.         }else{
  105.             printf("Data Rate:\t 2Mbps\n");        
  106.         }
  107.     }else if((stat[0] & (1<<RF_DR_LOW)) == 1){
  108.         printf("Data Rate:\t 250kbps\n");
  109.     }else{
  110.         printf("Data rate ne dela\n");
  111.     }
  112.  
  113.     if((stat[0] & (1<< RF_PWR_LOW)) == 0){
  114.         if((stat[0] & (1<< RF_PWR_HIGH)) == 0){
  115.             printf("PA Power\t = -18dBm\n");
  116.         }else{
  117.             printf("PA Power\t = -6dBm\n");
  118.         }
  119.     }else{
  120.         if((stat[0] & (1<< RF_PWR_HIGH)) == 0){
  121.             printf("PA Power\t = -12dBm\n");
  122.         }else{
  123.             printf("PA Power\t = -0dBm\n");
  124.         }
  125.     }
  126. }
  127.  
  128. void init(char* func){
  129.     uint8_t* buffer;   
  130.     buffer = (uint8_t*)malloc(sizeof(uint8_t)*5);
  131.     //CONFIG
  132.    
  133.     buffer[0] = (1<<PWR_UP) | (1<<CRCO) | (1<<EN_CRC);
  134.     writeSPI('W', CONFIG, buffer, 1);
  135.    
  136.     //Enable EX addr
  137.     buffer[0] = (1<<ERX_P0) | (1<<ERX_P1);
  138.     writeSPI('W', EN_RXADDR, buffer, 1);
  139.    
  140.     if(strcmp(func, "RX") == 0){       
  141.         //TX address
  142.         buffer[0] = 0xf0;
  143.         buffer[1] = 0xf0;
  144.         buffer[2] = 0xf0;
  145.         buffer[3] = 0xf0;
  146.         buffer[4] = 0xd2;
  147.         writeSPI('W', TX_ADDR, buffer, 5);
  148.        
  149.         //Rx0 address (auto acc)
  150.         buffer[0] = 0xf0;
  151.         buffer[1] = 0xf0;
  152.         buffer[2] = 0xf0;
  153.         buffer[3] = 0xf0;
  154.         buffer[4] = 0xd2; //al pa e1/d2
  155.         writeSPI('W', RX_ADDR_P0, buffer, 5);
  156.        
  157.         //Rx1 address
  158.         buffer[0] = 0xf0;
  159.         buffer[1] = 0xf0;
  160.         buffer[2] = 0xf0;
  161.         buffer[3] = 0xf0;
  162.         buffer[4] = 0xe1; //al pa e1/d2
  163.         writeSPI('W', RX_ADDR_P1, buffer, 5);
  164.        
  165.         //Data rate 1mbs
  166.         buffer[0] = 0x03; //-12db
  167.         writeSPI('W', RF_SETUP, buffer, 1);
  168.     }else if(strcmp(func, "TX") == 0){
  169.         //TX address
  170.         buffer[0] = 0xf0;
  171.         buffer[1] = 0xf0;
  172.         buffer[2] = 0xf0;
  173.         buffer[3] = 0xf0;
  174.         buffer[4] = 0xe1;
  175.         writeSPI('W', TX_ADDR, buffer, 5);
  176.        
  177.         //Rx0 address (auto acc)
  178.         buffer[0] = 0xf0;
  179.         buffer[1] = 0xf0;
  180.         buffer[2] = 0xf0;
  181.         buffer[3] = 0xf0;
  182.         buffer[4] = 0xe1;
  183.         writeSPI('W', RX_ADDR_P0, buffer, 5);
  184.        
  185.         //Rx1 address
  186.         buffer[0] = 0xf0;
  187.         buffer[1] = 0xf0;
  188.         buffer[2] = 0xf0;
  189.         buffer[3] = 0xf0;
  190.         buffer[4] = 0xd2;
  191.         writeSPI('W', RX_ADDR_P1, buffer, 5);
  192.        
  193.         //Data rate 1mbs
  194.         buffer[0] = 0x07; ///0db
  195.         writeSPI('W', RF_SETUP, buffer, 1);
  196.     }
  197.    
  198.     //RF channel frequency
  199.     buffer[0] = 0x4c;
  200.     writeSPI('W', RF_CH, buffer, 1);
  201.    
  202.     //Enable RX addr 0 & 1
  203.     buffer[0] = (1<<ERX_P0) | (1<<ERX_P1);
  204.     writeSPI('W', EN_RXADDR, buffer, 1);
  205.    
  206.     //Pipe width
  207.     buffer[0] = 0x20;
  208.     writeSPI('W', RX_PW_P0, buffer, 1);
  209.     buffer[0] = 0x20;
  210.     writeSPI('W', RX_PW_P1, buffer, 1);
  211.    
  212.     //enable aa
  213.     buffer[0] = (1<<ENAA_P0) | (1<<ENAA_P1) | (1<<ENAA_P2) | (1<<ENAA_P3) | (1<<ENAA_P4) | (1<<ENAA_P5);
  214.     writeSPI('W', EN_AA, buffer, 1);
  215.  
  216.    
  217.     //Setup_retr - retransmit and delay times
  218.     buffer[0] = 0xff;
  219.     writeSPI('W', SETUP_RETR, buffer, 1);
  220.    
  221.     //status -> clear bits
  222.     buffer[0] = (1<<RX_DR) | (1<<TX_DS) | (1<<MAX_RT);
  223.     writeSPI('W', STATUS, buffer, 1);
  224.    
  225.     writeSPI('C', FLUSH_TX, buffer, 1);
  226.     writeSPI('C', FLUSH_RX, buffer, 1);
  227. }
  228.  
  229. int main(int argc, char* argv[]){
  230.     /*
  231.      *  argv[1] == RX - receive
  232.      *  argv[1] == TX - transmit
  233.      */
  234.     uint8_t stat;
  235.     uint8_t* buffer;
  236.     char c;
  237.     int i;
  238.    
  239.     if(argc < 2){
  240.         printf("Missing argument TX/RX\n");
  241.     }
  242.    
  243.     buffer = (uint8_t*)malloc(sizeof(uint8_t)*20);
  244.    
  245.     initSPI();
  246.     //READ conf
  247.     writeSPI('R', CONFIG, buffer, 1);
  248.     printf("CONFIG:\t 0x%02X\n",buffer[0]);
  249.     //READ status
  250.     writeSPI('R', STATUS, buffer, 1);
  251.     printf("STATUS:\t 0x%02X\n", buffer[0]);
  252.    
  253.     buffer[0] = 0x7e;
  254.     writeSPI('W', STATUS, buffer, 1);
  255.    
  256.     init(argv[1]);
  257.     printOut();
  258.    
  259.     printf("ENTER to start\n");
  260.     scanf("%c", &c);
  261.    
  262.     if(strcmp(argv[1], "RX") == 0){
  263.         //RXmode
  264.         //add PRIM_RX = 1 (rx mode) to CONFIG register
  265.         writeSPI('R', CONFIG, buffer, 1);      
  266.         buffer[0] |= (1<<PRIM_RX);
  267.         printf("CONFIG 2:\t 0x%02X\n",buffer[0]);
  268.         writeSPI('W', CONFIG, buffer, 1);
  269.        
  270.         writeSPI('C', FLUSH_RX, buffer, 0);
  271.        
  272.         bcm2835_gpio_write(CE, HIGH); //CE high -> enable RX mode
  273.         delay(1);
  274.         while(1){
  275.             writeSPI('R', STATUS, buffer, 1);
  276.             printf("STATUS 1:\t 0x%02X\n", buffer[0]);
  277.             if((buffer[0] & (1<<RX_DR)) == 1){
  278.                 //Read data
  279.                 writeSPI('R', R_RX_PAYLOAD, buffer, 20);
  280.                 printf("Read:\n");
  281.                 for(i = 0; i<20; i++){
  282.                     printf("0x%02X ");                 
  283.                 }
  284.                 printf("\n");
  285.                 //write 1 to clear bit
  286.                 writeSPI('R', STATUS, buffer, 1);
  287.                 buffer[0] |= (1<<RX_DR);
  288.                 writeSPI('W', STATUS, buffer, 1);
  289.                 break;
  290.             }
  291.  
  292.  
  293.             delay(10);         
  294.         }
  295.         bcm2835_gpio_write(CE, LOW);
  296.        
  297.     }else if(strcmp(argv[1], "TX") == 0){
  298.         //TX mode
  299.         writeSPI('R', STATUS, buffer, 1);
  300.         printf("STATUS:\t 0x%02X, %d\n", buffer[0], (buffer[0] & (1<<TX_DS)));
  301.         while((buffer[0] & (1<<TX_DS)) != 1){
  302.             writeSPI('C', FLUSH_TX, buffer, 0);
  303.             for(i = 0; i < 20; i++){
  304.                 buffer[i] = 17-(i%2);      
  305.             }
  306.             writeSPI('C', W_TX_PAYLOAD, buffer, 20);
  307.             bcm2835_gpio_write(CE, HIGH);
  308.             delay(20);
  309.             bcm2835_gpio_write(CE, LOW);
  310.             printf("sent\n");
  311.            
  312.             writeSPI('R', STATUS, buffer, 1);
  313.             printf("STATUS:\t 0x%02X, %d\n", buffer[0], (buffer[0] & (1<<TX_DS)));
  314.             delay(10);
  315.         }
  316.     }
  317.    
  318.     bcm2835_spi_end();
  319.     bcm2835_close();
  320. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement