//
// test program for MCP23S17 with wiringPi
// cc -o mcp23s17Led mcp23s17Led.c -l wiringPi
//
#include <stdio.h>
#include <time.h>
#include <wiringPi.h>
#include <wiringPiSPI.h>
#define
IODIRA
0x00
// MCP23S17 address of I/O direction
#define
IODIRB
0x01
// MCP23S17 address of I/O direction
#define
GPIOA
0x12
// MCP23S17 address of GP Value
#define
GPIOB
0x13
// MCP23S17 address of GP Value
#define
ADDRESS
0b01000000 // MCP23S17 SPI
Address
#define
CHANNEL
0
// MCP23S17 SPI Port
// MCP23S17 SPI Data Transfer
void SPI_TX(unsigned char device, unsigned char regadd,
unsigned char
tx_data) {
unsigned char tbuf[3];
device = device & 0b11111110; // Clear last bit
for a write
tbuf[0]=device;
tbuf[1]=regadd;
tbuf[2]=tx_data;
wiringPiSPIDataRW(CHANNEL,tbuf,sizeof(tbuf));
}
int main(int argc, char **argv) {
int i;
int byte;
if (wiringPiSPISetup(CHANNEL, 32000000) < 0) {
printf("wiringPiSPISetup Error\n");
return 1;
}
SPI_TX(ADDRESS,IODIRA,0x00);
SPI_TX(ADDRESS,IODIRB,0x00);
SPI_TX(ADDRESS,GPIOA,0x00);
SPI_TX(ADDRESS,GPIOB,0x00);
byte=0;
for(i=0;i<8;i++) {
byte=(byte<<1) + 1;
SPI_TX(ADDRESS,GPIOA,byte);
delay(1000);
}
delay(2000);
for(i=0;i<10;i++) {
byte=0;
SPI_TX(ADDRESS,GPIOA,byte);
delay(1000);
byte=0xff;
SPI_TX(ADDRESS,GPIOA,byte);
delay(1000);
}
delay(2000);
byte=0xff;
for(i=0;i<8;i++) {
byte=(byte>>1);
SPI_TX(ADDRESS,GPIOA,byte);
delay(1000);
}
}
|