Guest User

NRF24L01 and FTDI

a guest
Apr 20th, 2015
497
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.57 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stdint.h>
  4. #include <string.h>
  5. #include <ftdi.h>
  6.  
  7. #define PIN_TXD  0x01
  8. #define PIN_RXD  0x02
  9. #define PIN_RTS 0x04
  10. #define PIN_CTS 0x08
  11. #define PIN_DTR 0x10
  12. #define PIN_DSR 0x20
  13. #define PIN_DCD 0x40
  14. #define PIN_RI  0x80
  15.  
  16. #define PIN_IRQ PIN_DSR
  17. #define PIN_SCK PIN_DCD
  18. #define PIN_MISO PIN_RXD
  19. #define PIN_MOSI PIN_TXD
  20. #define PIN_CSN PIN_DTR
  21. #define PIN_CE PIN_RI
  22. #define PIN_LED PIN_CTS
  23.  
  24. #define FTDI_BAUDRATE 3000000
  25.  
  26. struct ftdi_context ftdic;
  27. int pin_state;
  28. uint8_t nrf24l01_status;
  29.  
  30. void spi_request(uint8_t *tx_data, uint8_t *rx_data, int count) {
  31.     int i, j;
  32.     uint8_t tx_buffer[count * 8 * 2 + 4];
  33.     uint8_t rx_buffer[count * 8 * 2 + 4];
  34.     int k = 0;
  35.     tx_buffer[k++] = pin_state | PIN_CSN;
  36.     tx_buffer[k++] = pin_state;
  37.     for (i = 0; i < count; i++) {
  38.         int byte = *tx_data;
  39.         for (j = 0; j < 8; j++) {
  40.             int bit = (byte >> 7) & 1;
  41.             if (bit) {
  42.                 tx_buffer[k++] = pin_state | PIN_MOSI;
  43.                 tx_buffer[k++] = pin_state | PIN_SCK | PIN_MOSI;
  44.             } else {
  45.                 tx_buffer[k++] = pin_state;
  46.                 tx_buffer[k++] = pin_state | PIN_SCK;
  47.                
  48.             }
  49.             byte <<= 1;
  50.         }
  51.         tx_data++;
  52.     }
  53.     tx_buffer[k++] = pin_state;
  54.     tx_buffer[k++] = pin_state | PIN_CSN;
  55.     ftdi_write_data(&ftdic, tx_buffer, sizeof(tx_buffer));
  56.     ftdi_read_data(&ftdic, rx_buffer, sizeof(rx_buffer));
  57.     if (rx_data) {
  58.         k = 3;
  59.         for (i = 0; i < count; i++) {
  60.             int byte = 0;
  61.             for (j = 0; j < 8; j++) {
  62.                 k++;
  63.                 byte <<= 1;
  64.                 if (rx_buffer[k++] & PIN_MISO) {
  65.                     byte |= 1;
  66.                 }
  67.             }
  68.             *rx_data = byte;
  69.             rx_data++;
  70.         }
  71.     }
  72. }
  73.  
  74. void nrf24l01_ce_pulse() {
  75.     uint8_t buffer = pin_state | PIN_CE;
  76.     ftdi_write_data(&ftdic, &buffer, sizeof(buffer));
  77.     usleep(10);
  78.     buffer &= ~PIN_CE;
  79.     ftdi_read_data(&ftdic, &buffer, sizeof(buffer));
  80. }
  81.  
  82. uint8_t nrf24l01_nop() {
  83.     uint8_t buffer[] = {0xFF};
  84.     spi_request(buffer, buffer, sizeof(buffer));
  85.     nrf24l01_status = buffer[0];
  86.     return nrf24l01_status;
  87. }
  88.  
  89. void nrf24l01_write_byte_reg(uint8_t reg, uint8_t value) {
  90.     uint8_t buffer[] = {0x20 | reg, value};
  91.     spi_request(buffer, buffer, sizeof(buffer));
  92.     nrf24l01_status = buffer[0];
  93. }
  94.  
  95. void nrf24l01_write_long_reg(uint8_t reg, unsigned long long value) {
  96.     uint8_t buffer[1 + 5];
  97.     buffer[0] = 0x20 | reg;
  98.     memmove(buffer + 1, &value, 5);
  99. }
  100.  
  101. uint8_t nrf24l01_read_byte_reg(uint8_t reg) {
  102.     uint8_t buffer[] = {reg, 0};
  103.     spi_request(buffer, buffer, sizeof(buffer));
  104.     nrf24l01_status = buffer[0];
  105.     return buffer[1];
  106. }
  107.  
  108. unsigned long long nrf24l01_read_long_reg(uint8_t reg) {
  109.     uint8_t buffer[1 + 5];
  110.     buffer[0] = reg;
  111.     spi_request(buffer, buffer, sizeof(buffer));
  112.     nrf24l01_status = buffer[0];
  113.     return *((unsigned long long*)(buffer + 1));
  114. }
  115.  
  116. void nrf24l01_tx_payload(uint8_t *data, int len) {
  117.     uint8_t buffer[len + 1];
  118.     buffer[0] = 0xA0;
  119.     memmove(buffer + 1, data, len);
  120.     spi_request(buffer, buffer, sizeof(buffer));
  121.     nrf24l01_status = buffer[0];
  122. }
  123.  
  124. void nrf24l01_rx_payload(uint8_t *data, int len) {
  125.     uint8_t buffer[len + 1];
  126.     buffer[0] = 0x61;
  127.     spi_request(buffer, buffer, sizeof(buffer));
  128.     memmove(data, buffer + 1, len);
  129.     nrf24l01_status = buffer[0];
  130. }
  131.  
  132. void nrf24l01_send_packet(uint8_t *data, int len) {
  133.     nrf24l01_tx_payload(data, len);
  134.     nrf24l01_ce_pulse();
  135. }
  136.  
  137. void nrf24l01_dump_regs() {
  138.     printf("NRF24L01+ register values:\n");
  139.     printf("\tCONFIG = %x\n", nrf24l01_read_byte_reg(0));
  140.     printf("\tEN_AA = %x\n", nrf24l01_read_byte_reg(1));
  141.     printf("\tEN_RXADDR = %x\n", nrf24l01_read_byte_reg(2));
  142.     printf("\tSETUP_AW = %x\n", nrf24l01_read_byte_reg(3));
  143.     printf("\tSETUP_RETR = %x\n", nrf24l01_read_byte_reg(4));
  144.     printf("\tRF_CH = %x\n", nrf24l01_read_byte_reg(5));
  145.     printf("\tRF_SETUP = %x\n", nrf24l01_read_byte_reg(6));
  146.     printf("\tSTATUS = %x\n", nrf24l01_read_byte_reg(7));
  147.     printf("\tOBSERVE_TX = %x\n", nrf24l01_read_byte_reg(8));
  148.     printf("\tCD = %x\n", nrf24l01_read_byte_reg(9));
  149.     printf("\tRX_ADDR_P0 = %x\n", nrf24l01_read_long_reg(10));
  150.     printf("\tRX_ADDR_P1 = %x\n", nrf24l01_read_long_reg(11));
  151.     printf("\tRX_ADDR_P2 = %x\n", nrf24l01_read_byte_reg(12));
  152.     printf("\tRX_ADDR_P3 = %x\n", nrf24l01_read_byte_reg(13));
  153.     printf("\tRX_ADDR_P4 = %x\n", nrf24l01_read_byte_reg(14));
  154.     printf("\tRX_ADDR_P5 = %x\n", nrf24l01_read_byte_reg(15));
  155.     printf("\tTX_ADDR = %x\n", nrf24l01_read_long_reg(16));
  156.     printf("\tRX_PW_P0 = %x\n", nrf24l01_read_byte_reg(17));
  157.     printf("\tRX_PW_P1 = %x\n", nrf24l01_read_byte_reg(18));
  158.     printf("\tRX_PW_P2 = %x\n", nrf24l01_read_byte_reg(19));
  159.     printf("\tRX_PW_P3 = %x\n", nrf24l01_read_byte_reg(20));
  160.     printf("\tRX_PW_P4 = %x\n", nrf24l01_read_byte_reg(21));
  161.     printf("\tRX_PW_P5 = %x\n", nrf24l01_read_byte_reg(22));
  162.     printf("\tFIFO_STATUS = %x\n", nrf24l01_read_byte_reg(23));
  163.     printf("\tDYNPD = %x\n", nrf24l01_read_byte_reg(0x1C));
  164.     printf("\tFEATURE = %x\n", nrf24l01_read_byte_reg(0x1D));  
  165. }
  166.  
  167. int main(int argc, char **argv) {
  168.     ftdi_init(&ftdic);
  169.     if (ftdi_usb_open(&ftdic, 0x0403, 0x6001) < 0) {
  170.         fprintf(stderr, "Error: failed to open FTDI device!\n");
  171.         return 1;
  172.     }
  173.     if (ftdi_set_baudrate(&ftdic, FTDI_BAUDRATE) < 0) {
  174.         ftdi_usb_close(&ftdic);
  175.         fprintf(stderr, "Warning: failed to set bitbang baudrate!\n");
  176.     }
  177.     ftdi_set_bitmode(&ftdic, PIN_LED | PIN_SCK | PIN_MOSI | PIN_CSN | PIN_CE, BITMODE_SYNCBB);
  178.     {
  179.         uint8_t pin_state = PIN_CSN;
  180.         ftdi_write_data(&ftdic, &pin_state, sizeof(pin_state));
  181.         ftdi_read_data(&ftdic, &pin_state, sizeof(pin_state));
  182.     }
  183.     pin_state |= PIN_LED;
  184.     nrf24l01_dump_regs();
  185.     nrf24l01_send_packet("HELLO", 6);
  186.     pin_state &= ~PIN_LED;
  187.     nrf24l01_nop();
  188.     sleep(2);
  189.     printf("%x\n", nrf24l01_read_byte_reg(7));
  190.     ftdi_usb_close(&ftdic);
  191.     return 0;
  192. }
Advertisement
Add Comment
Please, Sign In to add comment