/* * File: spi.cpp * Author: * * Created on * * Inspired from spi speed test from wiringPi * wiringPi/examples/spiSpeed.c */ #include "spi.h" #include #include #include #include #include #include #include #define RF24_SPI_SPEED 8 * 1000000 // 8Mhz #define RF24_SPI_CHANNEL 0 SPI::SPI():fd(-1) { printf("wiringPi RF24 DRIVER\n"); } void SPI::begin(int csn_pin) { // initialize the wiringPiSPI if ((this->fd = wiringPiSPISetup(RF24_SPI_CHANNEL, RF24_SPI_SPEED)) < 0) { printf("Cannot configure the SPI device!\n"); fflush(stdout); abort(); } else printf("Configured SPI fd: %d - pin: %d\n", fd, csn_pin); } uint8_t SPI::transfer(uint8_t tx) { memset(&msgByte, 0, sizeof(msgByte)); memcpy(&msgByte, &tx, sizeof(tx)); if(wiringPiSPIDataRW(RF24_SPI_CHANNEL, &msgByte, sizeof(tx)) < 0) { printf("transfer(): Cannot send data: %s\n", strerror(errno)); fflush(stdout); abort(); } return msgByte; } void SPI::transfern(char* buf, uint32_t len) { printf("transfern(tx: %s)\n", buf); if(wiringPiSPIDataRW(RF24_SPI_CHANNEL, (uint8_t *)buf, len) < 0) { printf("transfern(): Cannot send data %s\n", strerror(errno)); fflush(stdout); abort(); } } void SPI::transfernb(char* tbuf, char* rbuf, uint32_t len) { // using an auxiliary buffer to keep tx and rx different memset(msg, 0, sizeof(msg)); memcpy(msg, tbuf, len); if(wiringPiSPIDataRW(RF24_SPI_CHANNEL, msg, len) < 0) { printf("transfernb() Cannot send data %s\n", strerror(errno)); fflush(stdout); abort(); } memcpy(rbuf, msg, len); } SPI::~SPI() { if (!(this->fd < 0)) { close(this->fd); this->fd = -1; } }