Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <stdint.h>
- #include <string.h>
- #include <ftdi.h>
- #define PIN_TXD 0x01
- #define PIN_RXD 0x02
- #define PIN_RTS 0x04
- #define PIN_CTS 0x08
- #define PIN_DTR 0x10
- #define PIN_DSR 0x20
- #define PIN_DCD 0x40
- #define PIN_RI 0x80
- #define PIN_IRQ PIN_DSR
- #define PIN_SCK PIN_DCD
- #define PIN_MISO PIN_RXD
- #define PIN_MOSI PIN_TXD
- #define PIN_CSN PIN_DTR
- #define PIN_CE PIN_RI
- #define PIN_LED PIN_CTS
- #define FTDI_BAUDRATE 3000000
- struct ftdi_context ftdic;
- int pin_state;
- uint8_t nrf24l01_status;
- void spi_request(uint8_t *tx_data, uint8_t *rx_data, int count) {
- int i, j;
- uint8_t tx_buffer[count * 8 * 2 + 4];
- uint8_t rx_buffer[count * 8 * 2 + 4];
- int k = 0;
- tx_buffer[k++] = pin_state | PIN_CSN;
- tx_buffer[k++] = pin_state;
- for (i = 0; i < count; i++) {
- int byte = *tx_data;
- for (j = 0; j < 8; j++) {
- int bit = (byte >> 7) & 1;
- if (bit) {
- tx_buffer[k++] = pin_state | PIN_MOSI;
- tx_buffer[k++] = pin_state | PIN_SCK | PIN_MOSI;
- } else {
- tx_buffer[k++] = pin_state;
- tx_buffer[k++] = pin_state | PIN_SCK;
- }
- byte <<= 1;
- }
- tx_data++;
- }
- tx_buffer[k++] = pin_state;
- tx_buffer[k++] = pin_state | PIN_CSN;
- ftdi_write_data(&ftdic, tx_buffer, sizeof(tx_buffer));
- ftdi_read_data(&ftdic, rx_buffer, sizeof(rx_buffer));
- if (rx_data) {
- k = 3;
- for (i = 0; i < count; i++) {
- int byte = 0;
- for (j = 0; j < 8; j++) {
- k++;
- byte <<= 1;
- if (rx_buffer[k++] & PIN_MISO) {
- byte |= 1;
- }
- }
- *rx_data = byte;
- rx_data++;
- }
- }
- }
- void nrf24l01_ce_pulse() {
- uint8_t buffer = pin_state | PIN_CE;
- ftdi_write_data(&ftdic, &buffer, sizeof(buffer));
- usleep(10);
- buffer &= ~PIN_CE;
- ftdi_read_data(&ftdic, &buffer, sizeof(buffer));
- }
- uint8_t nrf24l01_nop() {
- uint8_t buffer[] = {0xFF};
- spi_request(buffer, buffer, sizeof(buffer));
- nrf24l01_status = buffer[0];
- return nrf24l01_status;
- }
- void nrf24l01_write_byte_reg(uint8_t reg, uint8_t value) {
- uint8_t buffer[] = {0x20 | reg, value};
- spi_request(buffer, buffer, sizeof(buffer));
- nrf24l01_status = buffer[0];
- }
- void nrf24l01_write_long_reg(uint8_t reg, unsigned long long value) {
- uint8_t buffer[1 + 5];
- buffer[0] = 0x20 | reg;
- memmove(buffer + 1, &value, 5);
- }
- uint8_t nrf24l01_read_byte_reg(uint8_t reg) {
- uint8_t buffer[] = {reg, 0};
- spi_request(buffer, buffer, sizeof(buffer));
- nrf24l01_status = buffer[0];
- return buffer[1];
- }
- unsigned long long nrf24l01_read_long_reg(uint8_t reg) {
- uint8_t buffer[1 + 5];
- buffer[0] = reg;
- spi_request(buffer, buffer, sizeof(buffer));
- nrf24l01_status = buffer[0];
- return *((unsigned long long*)(buffer + 1));
- }
- void nrf24l01_tx_payload(uint8_t *data, int len) {
- uint8_t buffer[len + 1];
- buffer[0] = 0xA0;
- memmove(buffer + 1, data, len);
- spi_request(buffer, buffer, sizeof(buffer));
- nrf24l01_status = buffer[0];
- }
- void nrf24l01_rx_payload(uint8_t *data, int len) {
- uint8_t buffer[len + 1];
- buffer[0] = 0x61;
- spi_request(buffer, buffer, sizeof(buffer));
- memmove(data, buffer + 1, len);
- nrf24l01_status = buffer[0];
- }
- void nrf24l01_send_packet(uint8_t *data, int len) {
- nrf24l01_tx_payload(data, len);
- nrf24l01_ce_pulse();
- }
- void nrf24l01_dump_regs() {
- printf("NRF24L01+ register values:\n");
- printf("\tCONFIG = %x\n", nrf24l01_read_byte_reg(0));
- printf("\tEN_AA = %x\n", nrf24l01_read_byte_reg(1));
- printf("\tEN_RXADDR = %x\n", nrf24l01_read_byte_reg(2));
- printf("\tSETUP_AW = %x\n", nrf24l01_read_byte_reg(3));
- printf("\tSETUP_RETR = %x\n", nrf24l01_read_byte_reg(4));
- printf("\tRF_CH = %x\n", nrf24l01_read_byte_reg(5));
- printf("\tRF_SETUP = %x\n", nrf24l01_read_byte_reg(6));
- printf("\tSTATUS = %x\n", nrf24l01_read_byte_reg(7));
- printf("\tOBSERVE_TX = %x\n", nrf24l01_read_byte_reg(8));
- printf("\tCD = %x\n", nrf24l01_read_byte_reg(9));
- printf("\tRX_ADDR_P0 = %x\n", nrf24l01_read_long_reg(10));
- printf("\tRX_ADDR_P1 = %x\n", nrf24l01_read_long_reg(11));
- printf("\tRX_ADDR_P2 = %x\n", nrf24l01_read_byte_reg(12));
- printf("\tRX_ADDR_P3 = %x\n", nrf24l01_read_byte_reg(13));
- printf("\tRX_ADDR_P4 = %x\n", nrf24l01_read_byte_reg(14));
- printf("\tRX_ADDR_P5 = %x\n", nrf24l01_read_byte_reg(15));
- printf("\tTX_ADDR = %x\n", nrf24l01_read_long_reg(16));
- printf("\tRX_PW_P0 = %x\n", nrf24l01_read_byte_reg(17));
- printf("\tRX_PW_P1 = %x\n", nrf24l01_read_byte_reg(18));
- printf("\tRX_PW_P2 = %x\n", nrf24l01_read_byte_reg(19));
- printf("\tRX_PW_P3 = %x\n", nrf24l01_read_byte_reg(20));
- printf("\tRX_PW_P4 = %x\n", nrf24l01_read_byte_reg(21));
- printf("\tRX_PW_P5 = %x\n", nrf24l01_read_byte_reg(22));
- printf("\tFIFO_STATUS = %x\n", nrf24l01_read_byte_reg(23));
- printf("\tDYNPD = %x\n", nrf24l01_read_byte_reg(0x1C));
- printf("\tFEATURE = %x\n", nrf24l01_read_byte_reg(0x1D));
- }
- int main(int argc, char **argv) {
- ftdi_init(&ftdic);
- if (ftdi_usb_open(&ftdic, 0x0403, 0x6001) < 0) {
- fprintf(stderr, "Error: failed to open FTDI device!\n");
- return 1;
- }
- if (ftdi_set_baudrate(&ftdic, FTDI_BAUDRATE) < 0) {
- ftdi_usb_close(&ftdic);
- fprintf(stderr, "Warning: failed to set bitbang baudrate!\n");
- }
- ftdi_set_bitmode(&ftdic, PIN_LED | PIN_SCK | PIN_MOSI | PIN_CSN | PIN_CE, BITMODE_SYNCBB);
- {
- uint8_t pin_state = PIN_CSN;
- ftdi_write_data(&ftdic, &pin_state, sizeof(pin_state));
- ftdi_read_data(&ftdic, &pin_state, sizeof(pin_state));
- }
- pin_state |= PIN_LED;
- nrf24l01_dump_regs();
- nrf24l01_send_packet("HELLO", 6);
- pin_state &= ~PIN_LED;
- nrf24l01_nop();
- sleep(2);
- printf("%x\n", nrf24l01_read_byte_reg(7));
- ftdi_usb_close(&ftdic);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment