1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
| //Project: Port Expander
//MCU: PIC16F877A
//Clock: 8 MHz
//Author: Jayanth Devarayanadurga
#define I2CMODE 1
#define SPIMODE 0
#define WrtCmd 0
#define RdCmd 1
//#defines are with IOCON.BANK = 0
#define IODIRA 0x00
#define IODIRB 0x01
#define IPOLA 0x02
#define IPOLB 0x03
#define GPINTENA 0x04
#define GPINTENB 0x05
#define DEFVALA 0x06
#define DEFVALB 0x07
#define INTCONA 0x08
#define INTCONB 0x09
#define IOCONA 0x0A
#define IOCONB 0x0B
#define GPPUA 0x0C
#define GPPUB 0x0D
#define INTFA 0x0E
#define INTFB 0x0F
#define INTCAPA 0x010
#define INTCAPB 0x011
#define GPIOA 0x012
#define GPIOB 0x013
#define OLATA 0x014
#define OLATB 0x015
#define IORESET PORTC.F4
#define HRDADD 0x00;
#define HRDWADD 6 // device hard address
unsigned char gAddrPins = HRDWADD <<1;
unsigned char SerialMode = I2CMODE;
unsigned char gControlByte = 0x40;
unsigned char mode = 0; //1 for SPI, 0 for I2C
void I2CWriteByte(unsigned char reg, unsigned char data_);
void Write23X17(unsigned char reg, unsigned char data_);
void ResetMCP23X17();
void InitMCP(void);
void ResetMCP23X17(){
IORESET = 0;
delay_us(100);
//IORESET = 1;;
}
void SPIWriteByte(unsigned char reg, unsigned char data_)
{
SPI1_Write(gControlByte | WrtCmd | gAddrPins);
SPI1_Write(reg);
SPI1_Write(data_);
}
//****************************************
// I2CWriteByte(unsigned char addr, unsigned char byte)
// Writes a byte to the 23017
//****************************************
/*************************************************************
Function Name: Write23X17
Return Value: void
Parameters: Register address, Data
Description: Writes a 23X17 register. I2C or SPI is in
global byte
**************************************************************/
void Write23X17(unsigned char reg, unsigned char data_)
{
if(SerialMode == I2CMODE) //If 23017 selected
I2CWriteByte(reg, data_); //
else //Else 23S17 is selected
SPIWriteByte(reg, data_); //
}
void InitMCP()
{
//Configure 23017
//Write23X17(GPPUA, 0x00); // Pullups
Write23X17(IOCONA, 0x40); //
Write23X17(IOCONB, 0x40);
Write23X17(IODIRA, 0x00); //All outs
Write23X17(IODIRB, 0x00); //All outs
}
void I2CWriteByte(unsigned char reg, unsigned char data_)
{
I2C1_Start();
I2C1_Wr(gControlByte | WrtCmd | gAddrPins);
I2C1_Wr(reg);
I2C1_Wr(data_);
I2C1_Stop();
}
void main(){
TRISA = TRISB = TRISD = PORTA = PORTB = PORTD = 0x00;
TRISC = 0x00;
PORTC = 0x00;
if(mode == 0)
I2C1_Init(100000);
else if(mode == 1)
SPI1_Init();
InitMCP();
while(1){
Write23X17(GPIOA, 0xAA);
}
} |