#include <stdint.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <getopt.h>
#include <fcntl.h>
#include <libgen.h>
#include <sys/ioctl.h>
#include <sys/stat.h>
#include <linux/types.h>
#include <linux/spi/spidev.h>
void pabort(char *string)
{
perror(string);
abort();
}
void usage(char *progname)
{
printf("usage: %s <device> \n", progname);
}
void spiRead(int fd, uint32_t *rxbuffer, uint8_t bits, size_t txlen, uint32_t spiSpeed)
{
*rxbuffer = 0;
struct spi_ioc_transfer tr =
{
.tx_buf = (uint32_t) 0,
.rx_buf = (uint32_t) rxbuffer,
.len = txlen,
.delay_usecs = 1,
.speed_hz = spiSpeed,
.bits_per_word = bits,
};
if(ioctl(fd, SPI_IOC_MESSAGE(1), &tr) == -1)
{
perror("can't read SPI message");
return;
}
else
printf("SPI read: %x\n", *rxbuffer);
}
int main(int argc, char **argv)
{
int spifd = 0;
uint8_t mode = 3;
uint8_t bits = 32;
uint32_t speed = 500000;
uint32_t rxVal = 0;
close(spifd);
spifd = open("/dev/spidev1.0", O_RDWR);
if(spifd == -1)
{
close(spifd);
pabort("open: ");
}
if(ioctl(spifd, SPI_IOC_WR_MODE, &mode) == -1)
pabort("ioctl SPI_IOC_WR_MODE: ");
if(ioctl(spifd, SPI_IOC_WR_BITS_PER_WORD, &bits))
pabort("ioctl SPI_IOC_WR_BITS_PER_WORD: ");
if(ioctl(spifd, SPI_IOC_WR_MAX_SPEED_HZ, &speed))
pabort("ioctl SPI_IOC_WR_MAX_SPEED_HZ: ");
while(1)
{
// printf("Sending message to %s\n", argv[1]);
spiRead(spifd, &rxVal, bits, sizeof(rxVal), speed);
// usleep(500000);
}
close(spifd);
return 0;
}