domodom
Accueil du site > mini2440 > Windows CE > Tutoriaux > Utiliser le driver I2C dans une application

Utiliser le driver I2C dans une application

dimanche 14 février 2010, par Dom

On trouve dans le BSP de la mini2440 un driver i2c. Son utilisation n’est pas compliquée. En plus, il y a une eeprom sur le bus i2c de la mini2440, utiliser l’i2c ne nécessite donc aucun ajout hard.

Le driver I2C est un driver de type "stream". On accède à un driver de ce type via la commande CreateFile qui nous renvoie un handle sur le pilote. A partir de ce handle, on peut envoyer des commandes IOCTL au driver via la fonction DeviceIoControl.

La fonction CreateFile prend en paramètre le nom du driver. Pour trouver le nom du driver I2C, il suffit d’aller consulter le fichier C :\WINCE600\PLATFORM\Mini2440\FILES\platform.reg du BSP. La configuration du driver i2c se situe dans les lignes suivantes :

[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\I2C]
"Prefix"="I2C"
"Dll"="I2C.DLL"
"Order"=dword:200
"Index"=dword:0
"Mode"=dword:1 ; Mode : 0 = POLLING, 1 = INTERRUPT
"SlaveAddress"=dword:0 ; Bus Driver’s Slave Address
"FriendlyName"="I2C Bus Driver"

La clé qui nous intéresse est Prefix, c’est elle qui spécifie le nom du driver à appeler via la fonction CreateFile.
Comme un driver peut gérer plusieurs canaux, il faut ajouter le numéro de canal derrière le nom. Le driver i2c ne gère qu’un seul canal, ce sera donc 0 pour nous. On passera donc à CreateFile le nom "I2C0 :".

Maintenant qu’on connait le nom du driver, il est nécessaire de trouver les commandes IOCTL supportées par celui-ci. Le fichier C :\WINCE600\PLATFORM\Mini2440\SRC\INC\i2c.h nous permet de trouver la liste des commandes IOCTL :
- IOCTL_I2C_READ
- IOCTL_I2C_WRITE
- IOCTL_I2C_GET_FASTCALL

La fonction DeviceIoControl prend en paramètres le handle du driver, une structure d’entrée et une structure de sortie.
On peut aller voir les sources du driver pour voir comment une commande IOCTL est traitée par celui-ci. Le fichier C :\WINCE600\PLATFORM\Mini2440\SRC\DRIVERS\IIC\drv.c contient la fonction I2C_IOControl qui est appelée par Windows lors d’une requête IOCTL au driver.
En lisant le code de cette fonction, on voit que la structure d’entrée est de type I2C_IO_DESC, structure justement définie dans le .h du driver :

typedef struct _I2C_IO_DESC
DWORD SlaveAddr ; // Target Slave Address
UCHAR WordAddr ; // Starting Slave Word Address
PUCHAR Data ; // pBuffer
DWORD Count ; // nBytes to read/write
I2C_IO_DESC, *PI2C_IO_DESC ;

Cette structure contient :
- l’adresse du composant sur le bus i2c avec lequel on veut communiquer
- l’adresse dans le composant avec lequel on veut communiquer
- un pointeur sur un buffer
- la taille du buffer

Pour lire ou écrire dans l’eeprom, il suffira donc d’envoyer une requête IOTCL avec cette structure en paramètres. Pour une lecture, le buffer contiendra au retour les données lues, pour une écriture, il faudra mettre dans ce buffer les données à écrire.

J’ai développé très rapidement une petite application en guise d’exemple. Attention, mon programme ne lit/écrit que les 16 premiers caractères de chaque zone d’édition.

Vous pouvez télécharger les sources de ce programme ici

Remarque : la vitesse de la transmission I2C est configurée en dur à une valeur très faible :
PCLK / 512 / 17 = 5OOOO / 512 / 17 = 5.74kHz.
L’i2c fonctionne couramment à 100kHz, on peut dont remplacer, dans le fichier C :\WINCE600\PLATFORM\Mini2440\SRC\DRIVERS\IIC\drv.h, les lignes :

#define RESUME_ACK      0xEF
#define RESUME_NO_ACK   0x6F

par :

#define RESUME_ACK      0xE0
#define RESUME_NO_ACK   0x60

1 Message

SPIP | Contact me | | Plan du site | Suivre la vie du site RSS 2.0      Version Française | English version