// WiringPi test program: SPI functions (need XO hardware) // Compile: gcc -Wall wiringpi_xotest_test1_spi.c -o wiringpi_xotest_test1_spi -lwiringPi #include #include #include #include #include "wpi_test.h" #include #define TRUE (1==1) #define FALSE (!TRUE) #define CHAN_CONFIG_SINGLE 8 #define CHAN_CONFIG_DIFF 0 const float fRefVoltage = 3.3f; const float fResolution = 4096; //12-Bit const int spiChannel = 1; const int spiSpeed = 1000000; // MHz int AnalogRead(int spiChannel, int analogChannel, int* returnvalue) { if (analogChannel<0 || analogChannel>1) { return -1; } unsigned char spiData[3]; unsigned char chanBits; if (analogChannel == 0) { chanBits = 0b11010000; } else { chanBits = 0b11110000; } spiData[0] = chanBits; spiData[1] = 0; spiData[2] = 0; *returnvalue = wiringPiSPIxDataRW(0, spiChannel, spiData, 3); return ((spiData [0] << 9) | (spiData [1] << 1) | (spiData[2] >> 7)) & 0xFFF; } void checkVoltage(float expect, const char* szexpect) { int returnvalue; //int CH0 = AnalogRead(spiChannel, 0, &returnvalue); int CH1 = AnalogRead(spiChannel, 1, &returnvalue); //float value0 = CH0 * fRefVoltage / fResolution; float value1 = CH1 * fRefVoltage / fResolution; CheckSameFloat(szexpect, value1, expect); delayMicroseconds(300); } int main(int argc, char *argv []){ const int GPIOIn = 29; int hSPI; //int CH0; int CH1; int major, minor; wiringPiVersion(&major, &minor); printf("Testing SPI functions with WiringPi %d.%d\n",major, minor); printf("------------------------------------------\n\n"); wiringPiSetup(); if ((hSPI = wiringPiSPISetup (spiChannel, spiSpeed)) < 0) { FailAndExitWithErrno("wiringPiSPISetup", hSPI); } int hSPIOld=hSPI; //printf("\nSPI fd = %d\n call close now\n", hSPI); int ret = wiringPiSPIClose(spiChannel); if (ret!=0) { FailAndExitWithErrno("wiringPiSPIClose", ret); } if ((hSPI = wiringPiSPIxSetupMode(0, spiChannel, spiSpeed, 0)) < 0) { FailAndExitWithErrno("wiringPiSPIxSetup", hSPI); } CheckSame("SPISetup, Close and SPIxSetup handle", hSPI, hSPIOld); int returnvalue; //CH0 = AnalogRead(spiChannel, 0, &returnvalue); CH1 = AnalogRead(spiChannel, 1, &returnvalue); CheckSame("SPI reading ioctl result (byte count) ", returnvalue, 3); //float value0 = CH0 * fRefVoltage / fResolution; //float value1 = CH1 * fRefVoltage / fResolution; pinMode(21, OUTPUT); pinMode(22, INPUT); pinMode(24, INPUT); pinMode(25, INPUT); pinMode(27, INPUT); pinMode(28, INPUT); pinMode(GPIOIn, INPUT); digitalWriteEx(21, GPIOIn, LOW); checkVoltage(0.1f, "Analog value 1xLow"); checkVoltage(0.1f, "Analog value 1xLow"); digitalWriteEx(21, GPIOIn, HIGH); checkVoltage(3.1f, "Analog value 1xHigh"); pinMode(22, OUTPUT); digitalWriteEx(22, -1, LOW); checkVoltage(1.65f, "Analog value Half (1H/1L)"); digitalWriteEx(22, GPIOIn, HIGH); checkVoltage(3.2f, "Analog value 2xHigh"); pinMode(24, OUTPUT); digitalWriteEx(24, GPIOIn, HIGH); checkVoltage(3.2f, "Analog value 3xHigh"); digitalWriteEx(24, -1, LOW); checkVoltage(2.2f, "Analog value 2xHigh/1xLow"); checkVoltage(2.2f, "Analog value 2xHigh/1xLow"); pinMode(25, OUTPUT); digitalWriteEx(25, GPIOIn, HIGH); checkVoltage(2.475f, "Analog value 3xHigh/1xLow"); digitalWriteEx(25, -1, LOW); checkVoltage(1.65f, "Analog value Half (2H/2L)"); pinMode(27, OUTPUT); digitalWriteEx(27, GPIOIn, HIGH); checkVoltage(1.98f, "Analog value 3xHigh/2xLow"); digitalWriteEx(27, -1, LOW); checkVoltage(1.32f, "Analog value Half (2H/3L)"); pinMode(28, OUTPUT); digitalWriteEx(28, GPIOIn, LOW); checkVoltage(1.100f, "Analog value 2xHigh/4xLow"); digitalWriteEx(28, GPIOIn, HIGH); checkVoltage(1.65f, "Analog value Half (3H/3L)"); digitalWriteEx(27, GPIOIn, HIGH); checkVoltage(2.2f, "Analog value 4xHigh/2xLow"); digitalWriteEx(25, GPIOIn, HIGH); checkVoltage(2.75f, "Analog value 5xHigh/1xLow"); digitalWriteEx(24, GPIOIn, HIGH); checkVoltage(3.3f, "Analog value 6xHigh"); CH1 = AnalogRead(3, 1, &returnvalue); CheckSame("\nReading Wrong channel 3 result ", CH1, 0); CheckSame("\nReading Wrong channel 3 ioctl result ", returnvalue, -EINVAL); CH1 = AnalogRead(2, 1, &returnvalue); CheckSame("\nReading Wrong channel 2 result ", CH1, 0); CheckSame("\nReading Wrong channel 3 ioctl result ", returnvalue, -EBADF); pinMode(22, INPUT); pinMode(21, INPUT); pinMode(24, INPUT); pinMode(25, INPUT); pinMode(27, INPUT); pinMode(28, INPUT); ret = wiringPiSPIxClose(0, spiChannel); CheckSame("wiringPiSPIxClose result", ret, 0); if (ret!=0) { FailAndExitWithErrno("wiringPiSPIxClose", ret); } ret = wiringPiSPIxGetFd(0, spiChannel); CheckSame("Fd after close", ret, -1); return UnitTestState(); }