Port Expander Library
mikroPascal PRO for PIC32 provides a library for communication with the Microchip’s Port Expander MCP23S17 via SPI interface. Connections of the PIC32 MCU and MCP23S17 is given on the schematic at the bottom of this page.

- The library uses the SPI module for communication. User must initialize the appropriate SPI module before using the Port Expander Library.
- For MCUs with multiple SPI modules it is possible to initialize all of them and then switch by using the
SPI_Set_Active()
function. See the SPI Library functions. - Library does not use Port Expander interrupts.
Library Dependency Tree

External dependencies of Port Expander Library
The following variables must be defined in all projects using Port Expander Library: | Description : | Example : |
---|---|---|
var SPExpanderRST : sbit; sfr; atomic; external; |
Reset line. | var SPExpanderRST : sbit at LATF0_bit; |
var SPExpanderCS : sbit; sfr; atomic; external; |
Chip Select line. | var SPExpanderCS : sbit at LATF1_bit; |
var SPExpanderRST_Direction : sbit; sfr; atomic; external; |
Direction of the Reset pin. | var SPExpanderRST_Direction : sbit at TRISF0_bit; |
var SPExpanderCS_Direction : sbit; sfr; atomic; external; |
Direction of the Chip Select pin. | var SPExpanderCS_Direction : sbit at TRISF1_bit; |
Library Routines
- Expander_Init
- Expander_Init_Advanced
- Expander_Read_Byte
- Expander_Write_Byte
- Expander_Read_PortA
- Expander_Read_PortB
- Expander_Read_PortAB
- Expander_Write_PortA
- Expander_Write_PortB
- Expander_Write_PortAB
- Expander_Set_DirectionPortA
- Expander_Set_DirectionPortB
- Expander_Set_DirectionPortAB
- Expander_Set_PullUpsPortA
- Expander_Set_PullUpsPortB
- Expander_Set_PullUpsPortAB
Expander_Init
Prototype |
procedure Expander_Init(ModuleAddress : byte); |
---|---|
Description |
Initializes Port Expander using SPI communication. Port Expander module settings :
|
Parameters |
|
Returns |
Nothing. |
Requires |
Global variables :
|
Example |
// Port Expander module connections var SPExpanderRST : sbit at LATF0_bit; SPExpanderCS : sbit at LATF1_bit; SPExpanderRST_Direction : sbit at TRISF0_bit; SPExpanderCS_Direction : sbit at TRISF1_bit; // End of Port Expander module connections ... // If Port Expander Library uses SPI module SPI1_Init(); // Initialize SPI module used with PortExpander Expander_Init(0); // Initialize Port Expander |
Notes |
None. |
Expander_Init_Advanced
Prototype |
procedure Expander_Init_Advanced(var rstPort : dword; rstPin : byte; haen : byte); |
---|---|
Description |
Initializes Port Expander using SPI communication. |
Parameters |
|
Returns |
Nothing. |
Requires |
|
Example |
// Port Expander module connections sbit SPExpanderRST at LATF0_bit; sbit SPExpanderCS at LATF1_bit; sbit SPExpanderRST_Direction at TRISF0_bit; sbit SPExpanderCS_Direction at TRISF1_bit; // End Port Expander module connections ... // If Port Expander Library uses SPI1 module SPI1_Init(); // Initialize SPI1 module used with PortExpander Expander_Init_Advanced(PORTB, 0, 0); // Initialize Port Expander |
Notes |
None. |
Expander_Read_Byte
Prototype |
function Expander_Read_Byte(ModuleAddress, RegAddress : byte) : byte; |
---|---|
Description |
The function reads byte from Port Expander. |
Parameters |
|
Returns |
Byte read. |
Requires |
Port Expander must be initialized. See Expander_Init. |
Example |
// Read a byte from Port Expander's register var read_data : byte; ... read_data := Expander_Read_Byte(0,1); |
Notes |
None. |
Expander_Write_Byte
Prototype |
procedure Expander_Write_Byte(ModuleAddress, RegAddress, Data : byte); |
---|---|
Description |
Routine writes a byte to Port Expander. |
Parameters |
|
Returns |
Nothing. |
Requires |
Port Expander must be initialized. See Expander_Init. |
Example |
// Write a byte to the Port Expander's register Expander_Write_Byte(0,1,$FF); |
Notes |
None. |
Expander_Read_PortA
Prototype |
function Expander_Read_PortA(ModuleAddress : byte) : byte; |
---|---|
Description |
The function reads byte from Port Expander's PortA. |
Parameters |
|
Returns |
Byte read. |
Requires |
Port Expander must be initialized. See Expander_Init. Port Expander's PortA should be configured as input. See Expander_Set_DirectionPortA and Expander_Set_DirectionPortAB routines. |
Example |
// Read a byte from Port Expander's PORTA var read_data : byte; ... Expander_Set_DirectionPortA(0,$FF); // set expander's porta to be input ... read_data := Expander_Read_PortA(0); |
Notes |
None. |
Expander_Read_PortB
Prototype |
function Expander_Read_PortB(ModuleAddress : byte) : byte; |
---|---|
Description |
The function reads byte from Port Expander's PortB. |
Parameters |
|
Returns |
Byte read. |
Requires |
Port Expander must be initialized. See Expander_Init. Port Expander's PortB should be configured as input. See Expander_Set_DirectionPortB and Expander_Set_DirectionPortAB routines. |
Example |
// Read a byte from Port Expander's PORTB var read_data : byte; ... Expander_Set_DirectionPortB(0,$FF); // set expander's portb to be input ... read_data := Expander_Read_PortB(0); |
Notes |
None. |
Expander_Read_PortAB
Prototype |
function Expander_Read_PortAB(ModuleAddress : byte) : word; |
---|---|
Description |
The function reads word from Port Expander's ports. PortA readings are in the higher byte of the result. PortB readings are in the lower byte of the result. |
Parameters |
|
Returns |
Word read. |
Requires |
Port Expander must be initialized. See Expander_Init. Port Expander's PortA and PortB should be configured as inputs. See Expander_Set_DirectionPortA, Expander_Set_DirectionPortB and Expander_Set_DirectionPortAB routines. |
Example |
// Read a byte from Port Expander's PORTA and PORTB var read_data : word; ... Expander_Set_DirectionPortAB(0,$FFFF); // set expander's porta and portb to be input ... read_data := Expander_Read_PortAB(0); |
Notes |
None. |
Expander_Write_PortA
Prototype |
procedure Expander_Write_PortA(ModuleAddress, Data : byte); |
---|---|
Description |
The function writes byte to Port Expander's PortA. |
Parameters |
|
Returns |
Nothing. |
Requires |
Port Expander must be initialized. See Expander_Init. Port Expander's PortA should be configured as output. See Expander_Set_DirectionPortA and Expander_Set_DirectionPortAB routines. |
Example |
// Write a byte to Port Expander's PORTA ... Expander_Set_DirectionPortA(0,$00); // set expander's porta to be output ... Expander_Write_PortA(0, $AA); |
Notes |
None. |
Expander_Write_PortB
Prototype |
procedure Expander_Write_PortB(ModuleAddress, Data : byte); |
---|---|
Description |
The function writes byte to Port Expander's PortB. |
Parameters |
|
Returns |
Nothing. |
Requires |
Port Expander must be initialized. See Expander_Init. Port Expander's PortB should be configured as output. See Expander_Set_DirectionPortB and Expander_Set_DirectionPortAB routines. |
Example |
// Write a byte to Port Expander's PORTB ... Expander_Set_DirectionPortB(0,$00); // set expander's portb to be output ... Expander_Write_PortB(0,$55); |
Notes |
None. |
Expander_Write_PortAB
Prototype |
procedure Expander_Write_PortAB(ModuleAddress : byte; Data : word); |
---|---|
Description |
The function writes word to Port Expander's ports. |
Parameters |
|
Returns |
Nothing. |
Requires |
Port Expander must be initialized. See Expander_Init. Port Expander's PortA and PortB should be configured as outputs. See Expander_Set_DirectionPortA, Expander_Set_DirectionPortB and Expander_Set_DirectionPortAB routines. |
Example |
// Write a byte to Port Expander's PORTA and PORTB ... Expander_Set_DirectionPortAB(0, $0000); // set expander's porta and portb to be output ... Expander_Write_PortAB(0, $AA55); |
Notes |
None. |
Expander_Set_DirectionPortA
Prototype |
procedure Expander_Set_DirectionPortA(ModuleAddress, Data : byte); |
---|---|
Description |
The function sets Port Expander's PortA direction. |
Parameters |
|
Returns |
Nothing. |
Requires |
Port Expander must be initialized. See Expander_Init. |
Example |
// Set Port Expander's PORTA to be output Expander_Set_DirectionPortA(0,$00); |
Notes |
None. |
Expander_Set_DirectionPortB
Prototype |
procedure Expander_Set_DirectionPortB(ModuleAddress, Data : byte); |
---|---|
Description |
The function sets Port Expander's PortB direction. |
Parameters |
|
Returns |
Nothing. |
Requires |
Port Expander must be initialized. See Expander_Init. |
Example |
// Set Port Expander's PORTB to be input Expander_Set_DirectionPortB(0,$FF); |
Notes |
None. |
Expander_Set_DirectionPortAB
Prototype |
procedure Expander_Set_DirectionPortAB(ModuleAddress, Direction : word); |
---|---|
Description |
The function sets Port Expander's PortA and PortB direction. |
Parameters |
|
Returns |
Nothing. |
Requires |
Port Expander must be initialized. See Expander_Init. |
Example |
// Set Port Expander's PORTA to be output and PORTB to be input Expander_Set_DirectionPortAB(0,$00FF); |
Notes |
None. |
Expander_Set_PullUpsPortA
Prototype |
procedure Expander_Set_PullUpsPortA(ModuleAddress, Data : byte); |
---|---|
Description |
The function sets Port Expander's PortA pull up/down resistors. |
Parameters |
|
Returns |
Nothing. |
Requires |
Port Expander must be initialized. See Expander_Init. |
Example |
// Set Port Expander's PORTA pull-up resistors Expander_Set_PullUpsPortA(0, $FF); |
Notes |
None. |
Expander_Set_PullUpsPortB
Prototype |
procedure Expander_Set_PullUpsPortB(ModuleAddress, Data : byte); |
---|---|
Description |
The function sets Port Expander's PortB pull up/down resistors. |
Parameters |
|
Returns |
Nothing. |
Requires |
Port Expander must be initialized. See Expander_Init. |
Example |
// Set Port Expander's PORTB pull-up resistors Expander_Set_PullUpsPortB(0, 0xFF); |
Notes |
None. |
Expander_Set_PullUpsPortAB
Prototype |
procedure Expander_Set_PullUpsPortAB(ModuleAddress : byte; PullUps : word); |
---|---|
Description |
The function sets Port Expander's PortA and PortB pull up/down resistors. |
Parameters |
|
Returns |
Nothing. |
Requires |
Port Expander must be initialized. See Expander_Init. |
Example |
// Set Port Expander's PORTA and PORTB pull-up resistors Expander_Set_PullUpsPortAB(0, $FFFF); |
Notes |
None. |
Library Example
The example demonstrates how to communicate with Port Expander MCP23S17. Note that Port Expander pins A2 A1 A0 are connected to GND so Port Expander Hardware Address is 0
.
program PortExpander;
// Port Expander module connections
var SPExpanderRST : sbit at LATF0_bit;
SPExpanderCS : sbit at LATF1_bit;
SPExpanderRST_Direction : sbit at TRISF0_bit;
SPExpanderCS_Direction : sbit at TRISF1_bit;
// End Port Expander module connections
var counter : word;
begin
counter := 0;
CHECON := 0x32;
AD1PCFG := 0xFFFF; // Configure AN pins as digital
TRISB := 0x00;
LATB := 0xFF;
// If Port Expander Library uses SPI1 module
SPI2_Init_Advanced(_SPI_MASTER,_SPI_8_BIT, 4, _SPI_SS_DISABLE,_SPI_DATA_SAMPLE_MIDDLE,_SPI_CLK_IDLE_LOW,_SPI_ACTIVE_2_IDLE);
Expander_Init(0); // Initialize Port Expander
Expander_Set_DirectionPortA(0, 0x00); // Set Expander's PORTA to be output
Expander_Set_DirectionPortB(0,0xFF); // Set Expander's PORTB to be input
Expander_Set_PullUpsPortB(0,0xFF); // Set pull-ups to all of the Expander's PORTB pins
while ( TRUE ) do // Endless loop
begin
Expander_Write_PortA(0, counter); // Write i to expander's PORTA
Inc(counter);
PORTB := Expander_Read_PortB(0); // Read expander's PORTB and write it to LEDs
Delay_ms(75);
end;
end.
HW Connection
Port Expander HW connection
What do you think about this topic ? Send us feedback!