Results 1 to 2 of 2

Thread: NLDRcsI2c

  1. #1

    NLDRcsI2c

    ------------
    De sources van NLDDanyUtils zijn te vinden in:
    ftp://ftp.nldelphi.com/public/OpenSo.../NLDDanyUtils/
    ------------

    Er is een nieuwe unit beschikbaar: NLDRcsI2c.pas (de software), en
    NLDRcsI2c.gif (de hardware).

    Samen zorgen ze ervoor dat de parallele poort van de PC gebruikt kan worden als I2c bus, en dus in staat is data te sturen naar en te ontvangen van I2c devices, alleen als master, niet als slave.

    De enige class die er gedefinieerd is is "TI2c", en de interface ziet er als volgt uit:
    Code:
    interface
    uses ExtCtrls, Forms;
    
    const
      // Error Definitions
      I2C_NO_ERROR = 0;
      I2C_NO_I2C_BUS = 1;
      I2C_NO_ACK_FROM_SLAVE = 2;
      I2C_SCL_TIMEOUT = 3;
    
    type TLevel = 0..1;
    
      TI2c = class
        // private data
    
        FBaseAddress, StatusRegister, ControlRegister: word;
        FI2cBusPresent: boolean;
        FSCLSDAOut: byte;
        FRepeats: word;
        FSCLTimer: TTimer;
        FSCLTimeOut: Word;                            // SCL timeout in milliseconds
        FInitialSpeed, FSpeed: real;
        FError: Integer;
    
        // private procedures
        procedure SetSCL(Level: TLevel);
        procedure SetSDA(Level: TLevel);
        function GetSCL: TLevel;
        function GetSDA: TLevel;
        procedure SCLTimerOut(Sender: TObject);
        function WaitForSclHigh: TLevel;              // 1 = ok, 0 is SCL timeout
        procedure SendStart;
        procedure SendStop;
        procedure SendBit(Level: TLevel);
        function GetBit: TLevel;
        procedure SendAck(Ack: boolean);
        function GetAck: boolean;
        function SendByte(B: byte): boolean;          // acknowledge returned by function
        function GetByte(Ack: boolean): byte;         // acknowkedge is sent by function
    
        public
        // public procedures and properties
        constructor Create(Base: word);
        destructor Destroy; override;
        procedure SendSingleByte(Addr, Value: byte);
        function GetSingleByte(Addr: byte): byte;
        function SendBytes(Addr: byte; Values: array of byte; Count: Integer = -1; Stop: boolean = true): word; // function returns No of bytes sent
        function GetBytes(Addr: byte; var Values: array of byte; Count: Integer = -1): word; // function returns No of bytes received
        procedure SendReadBytes(Addr: byte; SendBuff: array of byte; var ReadBuff: array of byte; SendCount: Integer = -1; ReadCount: Integer = -1);
    
        property InitialSpeed: real read FInitialSpeed; // initial bus speed before correction for the PC speed
        property Speed: real read FSpeed;             // bus speed after correction for the PC speed
        property I2cBusPresent: boolean read FI2cBuspresent;
        property SCLTimeOut: word read FSCLTimeOut write FSCLTimeOut; // SCL timeout in milliseconds
        property Error: Integer read FError;
      end;
    De diverse routines laten toe:
    - 1 byte te versturen naar een device: routine "SendSingleByte",
    - 1 byte te lezen van een device: routine "GetSingleByte",
    - meer bytes (uit een byte array) te sturen naar een device: routine "SendBytes",
    - meer bytes (in een byte array) te lezen van een device: routine "GetBytes", en tenslotte
    - meer bytes te zenden naar een device, gevolgd door meerdere bytes lezen van hetzelfde device: routine "SendReadBytes".

    De device adressen moeten reeds voorzien zijn van de R/W bit (dus reeds 1 bit naar links geshift), maar de R/W bit zelf mag willekeurig staan (wordt gecorriggeerd indien nodig).

    Uiteraard zijn de standaard "Create" (basis adres van de parallelpoort meegeven als parameter) en "Destroy" routines er ook (vergeet niet, een TI2c instance vrijgeven gebeurt door "xxx.Free", niet door "xxx.Destroy"!).

    Bovendien heeft de class een aantal Properties:
    - "I2cBusPresent" (read only) geeft aan of er een interface (zie de gif file voor het schema) aangesloten is of niet
    - "Speed" (read only) geeft de busspeed in KHz (automatish ingesteld zo dicht mogelijk bij 100 Khz, afhankelijk van de snelheid van de PC)
    - "SCLTimeOut" (read/write) is het aantal milliseconden dat SCL laag mag gehouden worden door een I2c device zonder dat er een error gegeven wordt
    - "Error" (read only) geeft het (error) resultaat van de laatst uitgevoerde I2c operatie.

    Naast de software is er dus ook een klein beetje hardware nodig, het schema is te vinden in NLDRcsI2c.gif.

    De software gebruikt de "InOut32.dll" driver te vinden op http://logix4u.net/Legacy_Ports/Para...000/NT/XP.html

    Voor meer details over de I2c bus, zie http://en.wikipedia.org/wiki/I2C

    Veel plezier!
    Dany
    Attached Thumbnails Attached Thumbnails Click image for larger version. 

Name:	RcsI2c.gif 
Views:	376 
Size:	6.9 KB 
ID:	3905  
    Last edited by Dany; 25-Jan-08 at 17:28.

  2. #2
    Vriendelijke groeten,
    Dany

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •