//
// test program for MCP23S17 with wiringPi
// cc -o mcp23s17w mcp23s17w.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)
{
char tbuf[3];
// char rbuf[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 loop,loopm;
int fd;
time_t start_time;
time_t end_time;
int byte;
loopm=30000;
if (argc == 2) loopm=1;
if (wiringPiSPISetup(CHANNEL, 32000000) < 0) {
printf("Setup Fail\n");
return 1;
}
SPI_TX(ADDRESS,IODIRB,0b00000000); //
MCP23S17 port B = OUTPUT
SPI_TX(ADDRESS,IODIRA,0b00000000); //
MCP23S17 port A = OUTPUT
SPI_TX(ADDRESS,GPIOB,0b00000000);
// MCP23S17 Clear port B
SPI_TX(ADDRESS,GPIOA,0b00000000);
// MCP23S17 Clear port A
start_time = time(NULL);
for(loop=0;loop<loopm;loop++) {
byte=0;
for(i=0;i<8;i++) {
byte=(byte<<1) + 1;
SPI_TX(ADDRESS,GPIOA,byte);
if (argc == 2) delay(500);
}
byte=0xff;
for(i=0;i<8;i++) {
byte=byte-(1<<i);
SPI_TX(ADDRESS,GPIOA,byte);
if (argc == 2) delay(500);
}
}
end_time = time(NULL);
printf("time:%.1fSec\n",difftime(end_time,start_time));
}
|