Tasmota/lib/RF24/utility/wiringPi/spi.cpp

94 lines
1.8 KiB
C++

/*
* File: spi.cpp
* Author:
*
* Created on
*
* Inspired from spi speed test from wiringPi
* wiringPi/examples/spiSpeed.c
*/
#include "spi.h"
#include <wiringPi.h>
#include <wiringPiSPI.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdint.h>
#include <string.h>
#include <errno.h>
#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;
}
}