diff --git a/probeTxRx/Makefile b/probeTxRx/Makefile new file mode 100644 index 00000000..e013769b --- /dev/null +++ b/probeTxRx/Makefile @@ -0,0 +1,21 @@ +all: probeTxRx + +rebuild: clean +rebuild: all + +clean: + rm -f probeTxRx + rm -f probeTxRx.o + rm -f spi/ax5043spi.o + +probeTxRx: probeTxRx.o +probeTxRx: spi/ax5043spi.o + gcc -Wall -Wextra -o probeTxRx -lwiringPi probeTxRx.o spi/ax5043spi.o + +probeTxRx.o: probeTxRx.c +probeTxRx.o: spi/ax5043spi.h + gcc -Wall -Wextra -c probeTxRx.c + +spi/ax5043spi.o: spi/ax5043spi.c +spi/ax5043spi.o: spi/ax5043spi.h + gcc -Wall -Wextra -c -o spi/ax5043spi.o spi/ax5043spi.c diff --git a/probeTxRx/probeTxRx b/probeTxRx/probeTxRx new file mode 100755 index 00000000..447edb2d Binary files /dev/null and b/probeTxRx/probeTxRx differ diff --git a/probeTxRx/probeTxRx.c b/probeTxRx/probeTxRx.c new file mode 100644 index 00000000..6bdaff7f --- /dev/null +++ b/probeTxRx/probeTxRx.c @@ -0,0 +1,55 @@ +#include +#include +#include +#include + +#include "spi/ax5043spi.h" + +#define AX5043_PWRMODE (0x002) +#define AX5043_PWRSTATE_POWERDOWN (0x000) +#define AX5043_SILICONREVISION (0x000) +#define AX5043_SCRATCH (0x001) +#define SILICONREV1 (0x51) + +int main() { + setSpiChannel(SPI_CHANNEL); + setSpiSpeed(SPI_SPEED); + initializeSpi(); + + printf("INFO: Resetting AX5043\n"); + + uint8_t i; + + // Initialize Interface + // Reset Device + ax5043WriteReg(AX5043_PWRMODE, 0x80); + ax5043WriteReg(AX5043_PWRMODE, AX5043_PWRSTATE_POWERDOWN); + + // Wait some time for regulator startup + usleep(10000); + + // Check Scratch + i = ax5043ReadReg(AX5043_SILICONREVISION); + i = ax5043ReadReg(AX5043_SILICONREVISION); + + if (i != SILICONREV1) { + printf("ERROR: Unexpected hardware revision: %d\n", (int)i); + exit(EXIT_FAILURE); + } + + ax5043WriteReg(AX5043_SCRATCH, 0x55); + + if (ax5043ReadReg(AX5043_SCRATCH) != 0x55) { + printf("ERROR: Unable to communicate with the AX5043\n"); + exit(EXIT_FAILURE); + } + + ax5043WriteReg(AX5043_SCRATCH, 0xAA); + if (ax5043ReadReg(AX5043_SCRATCH) != 0xAA) { + printf("ERROR: Unable to communicate with the AX5043\n"); + exit(EXIT_FAILURE); + } + + printf("INFO: Successfully initialized the AX5043\n"); + exit(EXIT_SUCCESS); +} diff --git a/probeTxRx/probeTxRx.o b/probeTxRx/probeTxRx.o new file mode 100644 index 00000000..785fcd50 Binary files /dev/null and b/probeTxRx/probeTxRx.o differ diff --git a/probeTxRx/spi/ax5043spi.c b/probeTxRx/spi/ax5043spi.c new file mode 100644 index 00000000..569d85c9 --- /dev/null +++ b/probeTxRx/spi/ax5043spi.c @@ -0,0 +1,97 @@ +// Copyright (c) 2018 Brandenburg Tech, LLC + +#include "ax5043spi.h" + +#include +#include +#include +#include + +//#include "dummyspi.h" +//#warning "For production builds, must not include dummyspi.h" +#include +#include + +int spiChannel = -1; +int spiSpeed = -1; + +void setSpiChannel(int newSpiChannel) { + spiChannel = newSpiChannel; +} + +void setSpiSpeed(int newSpiSpeed) { + spiSpeed = newSpiSpeed; +} + +void initializeSpi() { + printf("INFO: Initializing SPI\n"); + + if (spiChannel < 0) { + fprintf(stderr, "ERROR: invalid SPI channel %d\n", spiChannel); + exit(EXIT_FAILURE); + } + if (spiSpeed < 0) { + fprintf(stderr, "ERROR: invalid SPI speed %d\n", spiSpeed); + exit(EXIT_FAILURE); + } + + + int fd; + + wiringPiSetup(); + + fd = wiringPiSPISetup(spiChannel, spiSpeed); + + if (fd < 0) { + fprintf(stderr, "ERROR: Cannot open SPI bus with error %d, %s\n", + errno, strerror(errno)); + exit(EXIT_FAILURE); + } + + printf("INFO: Finished initializing SPI\n"); +} + +void ax5043WriteReg(uint16_t reg, uint8_t val) { + uint8_t buf[3]; + int result; + + if (spiChannel < 0) { + fprintf(stderr, "ERROR: invalid SPI channel %d\n", spiChannel); + exit(EXIT_FAILURE); + } + + buf[0] = (unsigned char)(0x00f0 | ((reg & 0xf00) >> 8)); + buf[1] = (reg & 0xff); + buf[2] = val & 0xff; + + result = wiringPiSPIDataRW(spiChannel, buf, sizeof(buf)); + if (result < 0) { + fprintf(stderr, "Failed to write the register with result %d and error %s\n", + result, strerror(result)); + exit(EXIT_FAILURE); + } +} + +uint8_t ax5043ReadReg(uint16_t reg) { + uint8_t buf[3]; + int result; + + if (spiChannel < 0) { + fprintf(stderr, "ERROR: invalid SPI channel %d\n", spiChannel); + exit(EXIT_FAILURE); + } + + buf[0] = (unsigned char)(0x0070 | ((reg & 0xf00) >> 8)); + buf[1] = (reg & 0xff); + buf[2] = 0x0000; + + result = wiringPiSPIDataRW(spiChannel, buf, sizeof(buf)); + if (result < 0) { + fprintf(stderr, "Failed to read register with result = %d and error %s\n", + result, strerror(errno)); + exit(EXIT_FAILURE); + } + + //printf("DEBUG: read value: %d\n", (int)buf[2]); + return (buf[2] & 0xff); +} diff --git a/probeTxRx/spi/ax5043spi.h b/probeTxRx/spi/ax5043spi.h new file mode 100644 index 00000000..a39b6d4c --- /dev/null +++ b/probeTxRx/spi/ax5043spi.h @@ -0,0 +1,17 @@ +// Copyright (c) 2018 Brandenburg Tech, LLC + +#ifndef AX5043SPI_H_ +#define AX5043SPI_H_ + +#include + +#define SPI_CHANNEL (0) +#define SPI_SPEED (32000000) + +void setSpiChannel(int newSpiChannel); +void setSpiSpeed(int newSpiSpeed); +void initializeSpi(); +void ax5043WriteReg(uint16_t reg, uint8_t val); +uint8_t ax5043ReadReg(uint16_t reg); + +#endif /* AX5043SPI_H_ */ diff --git a/probeTxRx/spi/ax5043spi.o b/probeTxRx/spi/ax5043spi.o new file mode 100644 index 00000000..9024bcc7 Binary files /dev/null and b/probeTxRx/spi/ax5043spi.o differ