<?xml version="1.0" encoding="utf-8"?>---
FUNCTION_BLOCK PiFaceDigital EXTENDS spi
VAR_INPUT
byOut: BYTE;
END_VAR
VAR_OUTPUT
byIn: BYTE;
END_VAR
VAR
_byHardwareAddress: BYTE;
END_VAR
VAR_TEMP
i: INT;
k: INT;
END_VAR
SUPER^();
CASE _iState OF
0:
IF SUPER^.init() THEN
_iState := 1;
END_IF
1:
write8(_byHardwareAddress, IOCON, 8); //enable hardware addressing
write8(_byHardwareAddress, GPIOA, 0); //turn on port A
write8(_byHardwareAddress, IODIRA, 0); //set port A as an output
write8(_byHardwareAddress, IODIRB, 16#FF); // set port B as an input
write8(_byHardwareAddress, GPPUB, 16#FF); // turn on port B pullups
_iState := 10;
END_CASE
METHOD Initialize: UDINT
VAR_INPUT
wModuleType: UINT;
dwInstance: UDINT;
pConnector: pointer;
END_VAR
VAR
pParam: pointer;
udiResult: UDINT;
END_VAR
SUPER^.Initialize(wModuleType, dwInstance, pConnector);
pParam := ConfigGetParameter(_pConnector, 1);
IF pParam <> 0 THEN
_byHardwareAddress := IoStandard.ConfigGetParameterValueByte(pParam, ADR(udiResult));
END_IF
METHOD BeforeWriteOutputs: INT
VAR
i: USINT;
END_VAR
SUPER^.BeforeWriteOutputs();
IF _iState = 10 THEN
write8(_byHardwareAddress, GCL_PIFace.OUTPUT_PORT, byOut);
END_IF
METHOD AfterReadInputs: INT
VAR
aby: ARRAY [..] OF ;
END_VAR
SUPER^.AfterReadInputs();
IF _iState = 10 THEN
byIn := NOT read8(_byHardwareAddress, GCL_PIFace.INPUT_PORT);
END_IF
METHOD read8: BYTE
VAR_INPUT
byHardwareAddress: subrangeSigned;
byPort: BYTE;
END_VAR
VAR
abyTxBuffer: ARRAY [..] OF ;
abyRxBuffer: ARRAY [..] OF ;
END_VAR
abyTxBuffer[0] := 16#40 + SHL(byHardwareAddress, 1) + 1; //SPI_READ_CMD;
abyTxBuffer[1] := byPort;
abyTxBuffer[2] := 16#FF;
IF transfer(pabyTxBuffer:=ADR(abyTxBuffer) , pabyRxBuffer:=ADR(abyRxBuffer) , udiLen:=3 , uiDelayus:=5 ) THEN
read8 := abyRxBuffer[2];
ELSE
_iState := 1000;
END_IF
METHOD write8: BOOL
VAR_INPUT
byHardwareAddress: subrangeSigned;
byPort: BYTE;
byValue: BYTE;
END_VAR
VAR
abyTxBuffer: ARRAY [..] OF ;
abyRxBuffer: ARRAY [..] OF ;
END_VAR
abyTxBuffer[0] := 16#40 + SHL(byHardwareAddress, 1); //SPI_WRITE_CMD;
abyTxBuffer[1] := byPort;
abyTxBuffer[2] := byValue;
write8 := transfer(pabyTxBuffer:=ADR(abyTxBuffer) , pabyRxBuffer:=ADR(abyRxBuffer) , udiLen:=3 , uiDelayus:=5 );
IF NOT write8 THEN
_iState := 1000;
END_IF
VAR_GLOBAL
OUTPUT_PORT: USINT;
INPUT_PORT: USINT;
IOCON: USINT;
GPIOA: USINT;
GPIOB: USINT;
GPPUB: USINT;
IODIRA: USINT;
IODIRB: USINT;
END_VAR