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.
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)
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)
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 !)
Cette fonction affiche simplement une boite de dialogue qui donne la
version de la DLL et l'interface en cours d'utilisation.
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 !)
Cette fonction ferme le bus.
En sortie :
0 = OK
I2CBUSERROR sinon
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)
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)
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)
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).
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 )
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...
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.
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.