I2C Driver 32 Version 4.11

Version fonctionnant sous Windows 95, 98, NT 4.0 et 2000

Présentation

Voilà une évolution de la quatrième version de mon driver pour le bus I2C.

Comme la précédente version cette version gère les 2 types d’interfaces habituelles :
- Carte interne ISA (type Elektor 1992)
- Module Philips sur le port parallèle
et en plus une interface générique sur port // (permet l'adaptation sur d'autres types d'adaptateurs que celui de Philips)

La sélection entre les interfaces s'effectue par logiciel (ou à défaut par le fichier INI).
J’ai aussi intégré la gestion des accès exclusif, c’est à dire que plusieurs processus peuvent utiliser le bus, l’arbitrage des accès sera géré par la DLL.
 

Le package

Après téléchargement, dézippez l’archive avec les répertoires (important).

Dans ce package vous devez trouver :

I2C_Drv32.DLL
DlPortIO.sys
DlPortIO.dll
DlportIO.reg
I2C_Drv32.h
I2C_Drv32.lib
Description\*.* (projet Delphi 2.0 d'un programme d'exemple)
PCF8574\*.* (Programme d'exemple utilisant des PCF8574 avec des LED en sortie)
Typon\*.* (Fichiers imprimante (format HP LaserJet 300DPI) du circuit imprimé de l'interface proposé par Philips, il se branche directement sur le port // et s'alimente soit par le bus, soit par une source externe d'au moins 7.5V)
 

Installation

A faire par tous, même ceux qui utilisaient une ancienne version de I2C_Drv32.

Configuration

Pour préciser à I2C_Drv32 quelle interface vous allez utiliser et fixer les différents paramètres vous devez éditer le fichier I2C.INI et renseigner les différents champs. Dans le doute, les valeurs par défauts pour les ‘Nops’ doivent convenir à toutes les configurations.
Test du produit
Lancer simplement DESCRIP, une fenêtre s'ouvre avec des champs Adresse, mode, Name et Description. Cela vous permet de renseigner le fichier I2C.ini pour reconnaître vos circuits habituellement connectés à votre bus. Mode permet de spécifier le type d'accès possible aux circuits (Read/Write, read only, write Only), grâce à ce choix le programme modifie l'adresse émise sur le bus pour respecter le mode d'accès. Pour des exemples voir dans le fichier I2C.ini fourni.

Le Bouton Test permet de vérifier la présence d'un circuit à l'adresse courante.
Le Bouton Save sauve les modifications de description apportées à cette adresse.

PCF8574 va scanner le bus I2C pour y trouver tous les PCF8574 et permet de modifier l’état de leurs sorties via la souris.

DEMO est un petit exemple qui utilise un PCF8574 en chenillard à vitesse réglable.

TESTI2C est probablement le plus utile de tous puisqu'il permet d'avoir un interpreteur pour commander le bus (via des commandes Start, Close, Read ...). Personellement je m'en sert souvent en diagnotics et tests de nouveaux composants.

Utilisation de la DLL
Lorsque vous développez un soft qui va utiliser la DLL, vous devez déclarer les fonctions importées, par exemple en C:

#define DllImport __declspec( dllimport )
DllExport short pascal I2C_Info(void);
DllExport short pascal I2C_Read(short nbr, unsigned char *buf);
DllExport short pascal I2C_Send(short nbr, unsigned char *buf);
DllExport short pascal I2C_Address(short  address);
DllExport short pascal I2C_Stop(void);
DllExport short pascal I2C_Start(void);
DllExport short pascal I2C_Init(void);
DllExport short pascal I2C_SelectInterface(short Carte);

ou en Pascal :
{ Declaration du bus I2C }
function I2C_Address(address : Word) : Word; stdcall; external 'I2C_Drv32.dll';
function I2C_Start : Word; stdcall; external 'I2C_Drv32.dll';
function I2C_Stop : Word; stdcall; external 'I2C_Drv32.dll';
function I2C_Send(nb:Word; data : pointer ) : Word; stdcall; external 'I2C_Drv32.dll';
function I2C_Read(nb:Word; data : pointer ) : Word; stdcall; external 'I2C_Drv32.dll';
function I2C_Init : Word; stdcall; external 'I2C_Drv32.dll';
function I2C_Info : Word; stdcall; external 'I2C_Drv32.dll';
function I2C_SelectInterface(I2Ccard : Word) : Word; stdcall; external 'I2C_Drv32.dll';

(Je ne connais pas les autres langages, se référer aux fichiers d'aides de vos outils de développement)
 

Description des fonctions

I2C_SelectInterface

Paramètre(s) d'entrée : entier 16 bits
Valeur de sortie : entier 16 bits
Cette fonction doit être la PREMIERE fonction appelée de la DLL, elle permet au driver de savoir avec quel type d'interface vous souhaitez travailler. Si vous ne l'appelez pas, la DLL utilisera l'interface spécifié dans le champ "I2C Device" (par soucis de compatibilité avec les anciens softs).
en entrée :
0 = interface donnée dans I2C.ini
1 = carte interne
2 = module Philips sur port //
3 = module générique sur port //
en sortie :
0 = OK
1 = erreur d’interface
 

I2C_Init

Paramètre(s) d'entrée : néant
Valeur de sortie : entier 16 bits (sans signification)

Cette fonction doit être la DEUXIEME fonction appelée de la DLL, elle a pour charge d'initialiser des variables internes. (sans appel, vous aurez certainement des fautes de protection générale dans le module xxxx !)
 

I2C_Info

Paramètre(s) d'entrée : néant
Valeur de sortie : entier 16 bits (sans signification)

Cette fonction affiche simplement une boite de dialogue qui donne la version de la DLL et l'interface en cours d'utilisation.
 

I2C_Start

Paramètre(s) d'entrée : néant
Valeur de sortie : entier 16 bits

Cette fonction ouvre le bus I2C.
En sortie :
0 = OK
I2CBUSERROR sinon
ATTENTION : malgrès la gestion exclusive de la DLL, si I2C_Start renvoie autre chose que 0, le bus n’est pas ouvert, ne pas tenter de commande Send ou Read sous peine de planter une éventuelle communication en cours. (Ce n’est pas vrai tout le temps, mais cela arrive. C’est assimilable à un bug et j’en cherche la cause !)
 

I2C_Stop

Paramètre(s) d'entrée : néant
Valeur de sortie : entier 16 bits

Cette fonction ferme le bus.
En sortie :
0 = OK
I2CBUSERROR sinon
 

I2C_Address

Paramètre(s) d'entrée : entier 16 bits (adresse du circuit sur les 8 bits de poids faible)
Valeur de sortie : entier 16 bits

Cette fonction émet sur le bus l'adresse du circuit donné en paramètre. Si le bus était déjà ouvert elle provoque un repeated start avec la nouvelle adresse.
Elle retourne les codes d'erreur suivant :
0 : OK
1 : I2CBUSERROR , erreur sur le bus (court circuit, bus déjà ouvert par un autre maître)
2 : I2CBUSBUSY , bus occupé (bus déjà ouvert par un autre maître)
3 : I2CNOACK , pas d’acquittement sur l'adresse (circuit absent ?!)
4 : I2CTIMEOUT , problème de délais sur le bus (ne doit pas arriver ici)
 

I2C_Send

Paramètre(s) d'entrée : pointeur 32 bits sur buffer
Valeur de sortie : entier 16 bits

Cette fonction émet le nombre d'octet spécifié présent dans buffer passé en paramètre.
Elle retourne le nombre d'octets émis sur le bus. (comme printf)
 

I2C_Read

Paramètre(s) d'entrée : pointeur 32 bits sur buffer
Valeur de sortie : entier 16 bits

Cette fonction lit le nombre d'octet spécifié et les place dans le buffer passé en paramètre.
Elle retourne le nombre d'octets lus. (comme scanf)
 

Exemple (en C)

Lecture de 15 octets sur le circuit d'adresse 0x20 :

unsigned char buffer[50];
I2C_SelectInterface(1);
I2C_init();
I2C_Start();
I2C_Address(0x20);
I2C_Read(15, buffer);
I2C_Stop();

(ici je ne teste pas les codes de retour des fonctions).
 

Plan du module Philips


Cf le schéma fourni par Philips (disponible sur son site ftp) :

                                        LS05 pin 14 (Vcc) o      -------
                                                          |      |     |
           +--+--+---------------------+--+--+------------+------+-o 1 |
           |  |  |                     |  |  |           ===.1uF | +5V |
 -------- [R][R][R] 3x10K       3x10K [R][R][R]   LS05    |      |     |
 |      |  |  |  |                     |  |  |    pin 7 o-+------+-o 2 |
 | 12 o-+--+  |  |   3|\ 4             |  |  |    (Gnd)          | GND |
 | 17 o-+-----|--|----| >o-------------+--|--|--------------+    |     |
 |      |     |  |    |/        8 /|9     |  |     10 /|11  +----+-o 3 |
 | 15 o-+-----+--|--------------o< |------+--|------o< |----+    | SCL |
 |      |        |   1|\ 2        \|         |        \|         |     |
 |  9 o-+--------|----| >o-------------------+--------------+----+-o 4 |
 |      |        |    |/                            6 /|5   |    | SDA |
 | 11 o-+--------+----------------------------------o< |----+    -------
 | 10 o-+-+                                           \|          4-pin
 | 13 o-+-+--oGND                                               Connector
 | 25 o-+-+        ------------------ Part List --------------------------
 --------          | 1 - .1 uF capacitor   | 6 - 10K 5% resistors        |
 25-pin male D     | 1 - 4-pin connector   | 1 - 25-pin male D connector |
 connector to PC   | 1 - 74LS05 open collector hex inverter              |
 printer port      -------------------------------------------------------
( Schéma : (c) Philips Electronics )
 

Evolutions prévues


En vrac et sans ordre de priorité :
Utilisation de la base de registre au lieu d'un fichier INI
Fiabiliser le fonctionnement (?)
Intégrer le support des cartes PC/TV à base de BT848 (en cours, rapide si Brooktree me fourni les docs voulues, et visiblement ils ne sont pas pressés !)
si vous avez des idées...

Conclusion

IMPORTANT -- IMPORTANT -- IMPORTANT -- IMPORTANT -- IMPORTANT -- IMPORTANT

Cette version n'est pas entièrement stable et testée, vous l'utilisez à vos risques et périls; JE NE PEUX ETRE  TENU  POUR RESPONSABLE D'AUCUN DOMMAGE OU D'AUCUNE DESTRUCTION (MATERIEL OU LOGICIEL) QUI POURRAIT RESULTER DE L'UTILISATION DE CETTE LIBRAIRIE, elle vous est fournie à des fins de tests uniquement et pour votre usage personnel.

L'utilisation  de  cette  librairie est  libre de tout  droit pour  une utilisation  privée ou éducative.
L'utilisation  de ces  logiciels  dans un cadre  professionnel, industriel  ou commercial  est interdite sans mon accord préalable écrit.

(c) Marc BOUGET - 1997/2000

Toutes les marques citées appartiennent à leurs propriétaires respectifs.

IMPORTANT -- IMPORTANT -- IMPORTANT -- IMPORTANT -- IMPORTANT – IMPORTANT

Pour tout problème avec cette DLL, suggestion d'amélioration, évolution spécifique ou autre, n'hésitez pas à me contacter.

Marc BOUGET
mbouget@club-internet.fr
http://perso.club-internet.fr/mbouget

Novembre 2000.