This sample demonstrates how to query the SPI Hexadecimal Isolated Input Board.
#include <sys/thread.h> #include <sys/timer.h> #include <sys/event.h> #include <sys/print.h> #include <dev/spidigio.h> static volatile u_long ival; static HANDLE iocq; /* * Scans for digital input changes. */ THREAD(InputScanner, arg) { u_char num = (u_char)((u_short)arg); u_long rval; rval = ival = SpiDigitalGet(num); NutEventPost(&iocq); for(;;) if((rval = SpiDigitalGet(num)) != ival) { ival = rval; NutEventPost(&iocq); } else NutThreadYield(); } /* * Main application routine. * * Nut/OS automatically calls this entry after initialization. */ THREAD(NutMain, arg) { u_char ni; u_char no; u_long baud = 115200; /* * Initialize debug UART device and * print banner. */ outp(BV(RXEN) | BV(TXEN), UCR); NutDeviceIOCtl(0, UART_SETSPEED, &baud); NutPrintString_P(0, PSTR("\r\nDigital Opto Input Demo\r\n")); /* * Keep looking for inputs. */ for(;;) { /* * Initialize the SPI to the digital I/O boards. * The call returns the number of inputs and * outputs detected. */ SpiDigitalInit(&ni, &no); NutPrintFormat(0, "Found %u digital inputs and %u digital outputs\r\n", ni, no); if(ni) break; NutSleep(500); } NutThreadCreate("iscan", InputScanner, (void *)(ni + no), 512); for(;;) { NutEventWait(&iocq, 0); NutPrintFormat(0, "I/O: %08lX\r\n", ival); } }