mirror of https://github.com/arendst/Tasmota.git
94 lines
1.8 KiB
C++
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;
|
|
}
|
|
}
|