[r2]: / trunk / legacy / Libraries / SPI_PiFace.library.md  Maximize  Restore  History

Download this file

152 lines (133 with data), 2.8 kB

<?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 &lt;&gt; 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