version 31/08/2017
rev 02/09/2017

Test présence Devices sur un bus I2C (MikroC)

Lorsqu'on veut connecter des interfaces (Devices) sur un bus I2C, il arrive souvent qu'on ne connaisse pas l'adresse I2C de celui-ci
Un meme interface pouvant avoir plusieurs versions et composants differents
ou une configuration par strap qui modifie l'adresse de base ..
Il y a les DATASHEET pour celà .. oui .. mais lorque l'interface vient de RPC .. le composant a souvent son marquage EFFACE !


Le PIC utilisé 18F26K22 a un I2C Hardware , RC3 =>SCL et RC4 => SDA
(N'importe quel autre MCU avec I2C Hardware ou I2C Software pourrai aller)
une resistance de pull up de 4,7k sur chaque ligne



Pour cette demo , 3devices I2C
Un 1er module comprenant 1 EEPROM 24C256 + horloge RTC DS1307
Un afficheur LCD 4x20 avec une back board equipée d'un PCF8754( interface I2C)
Liaison UART pour l'affichage (9600,N,8,1) pour etre compatible avec un module BlueTooth HC06 (reglage usine)

module RTC DS1307 en I2C LCD 4x20 avec back board interface I2C

Sur le LCD, j'ai soudé depuis, directement les 2 R de 4,7K de Pull Up SDA et SCL sur la partie module PCF8754
de sorte à ne jamais les oublier
C'est un PCF8754 donc à l'adresse de base 0x40..+ adresse A0 A1 A2
On peut VOIR que les adresses PCF ne SONT PAS visibles, accessibles ( à moins de dessouder le module Pigback

Sur le module RTC, il y a 2 composants
L'EEPROM 24C32 à l'Adresse 0xA0
Le module RTC à l'adresse de base 0xD0

Quelques adresses à retenir :






Le programme fait simplement le listage des devices rencontres sur le bus I2C.
Seules les adresses paires sont utilisées, correspondant au I2C WRITE ( adresse impaire = I2C READ)
Une reponse ACK est obtenue QUE si le device reconnait son adresse.
dans ce cas l'adresse est stockée dans une table pouvant conteni 8 adresses
elle peut etre affichée en ligne, pendnat l'exploration des adresses(en mode Bavard)
L'exploration du champ d'adresse est ici limitée de 32 à 224 ;

ATTENTION : suivant la famille de MCU on ne parle pas de la meme chose.
avec ATMEL ARDUINO, on parle de l'adresse du device qui est definie sur 7 bits
avec les PIC on parle de l'adresse complete , formée par les 7 bits adresse device +bit R/W
on ne peut pas separer ces 8 bits
C'est une question de CONVENTION.
L'adresse d'ecriture , sur 8 bits se termine donc toujourts par 0
L'adresse de lecture , avec bit R/W=1 .. est alors Adress + 1
On ne s'en preoccupe pas ici
L'exploration d'adresse se faisant modulo 2 . .. 32,34,36...etc
ATTENTION on peut trouver des ERREURS sur le web .. et ensuite tourner en rond, chercher ce qui va pas
...un exemple flagrant de document
rajout d'un bit à 0 coté MSB ..au lieu de LSB

BAD information : On ajoute pas le bit R/W coté MSB , mais coté LSB . Position des bits corrigée et adapté au modele PCF8754 A
PCF8754 : adresse de base Ecriture (0x27<<1 )=>4E avec straps (A0=A1=A2=1) attention PCF8754A adresse de base Ecriture 0x7E (avec A0,A1,A2=1)

* lorqu'il y a des straps sur les pins d'adresse , encore faut(il verifier si le strap mets la pin au niveau 0 , ou niveau 1
Là , encore , question de convention : Logique positive ou logique negative : Presence STRAP => niveau 0 dans le cas de l'afficheur

L'adresse de base du device PCF8754A est 0x38 avec les 3 bits d'adresse à 1.
L'Adresse d'ECRITURE est 0x70 car il faut faire un decalage à gauche de 1 bit AVANT de les rajouter le bit R/W
soit Adresse finale = (0x38 +(0b00000111) << 1 soit (0X3F<<1 )= > 0x7E
ou autre combinaison suivant l'agencement des 3 bits d'adresse A0 A1 A2
La premiere adresse en Lecture etant Adresse +1

ADRESSE DE BASE :



Un document TRES INTERESSANT et indispensable à lire :
NXP I2C_bus_Specif_User_Manual_UM10204

La difficulté dans ce programme , a été soulevée lors de test avec PLUSIEURS devices sur le bus .
car si Le bit de collision WOL est armé , le dialogue est bloqué .

La liaison UART sert à afficher le resultat sur un ecran PC ( via un cordon TTL/USB Prolic)
Vitesse à 9600baud, car possible d'utiliser un HC06 BlueTooth et une tablette ou Phone Android pour voir le resultat..
J'utilise la pin RA5 pour decider si on voit les details ou pas

Resultat sur écran , en mode BAVARD .. pin RA5 =0



ou en mode discret ,avec RA5=1

images/Test_mode_discret.gif

La partie vitale :
unsigned char check_device(unsigned char dev_address,char Bavard)
{
char Cx,OK;
unsigned char k1;
OK=0;
if(Bavard>0)
{
strConstRamCpy(txt,"Device @ ");
k1=strlen(txt);
ByteToStr(dev_address,CRam1);
strcat(txt,CRam1);
UART1_Write_Text(txt);
}
if(dev_address==160) Synchro_SQ50=1; // pour Analyse signal
SSP1CON1.B7=0; //WCOL_bit
I2C1_Start();
Cx=I2C1_Wr(dev_address);
if(Cx == -1) //check if collision happened
{
Cx = SSPBUF; //empty the buffer,
SSPCON1.WCOL=0; // clear the collision status bit
}
I2C_Stop();
Synchro_SQ50=0;
if( Cx!=0 )
{
OK=0;
if(Bavard>0)UART1_Write_CText(" not found");
}
else
{
OK=1;
I2_Adresses_Devices[k]=dev_address;
if(Bavard>0)
{
strConstRamCpy(CRam1, " Device # find at @ ");
*(CRam1+9)=k+48;
ByteToStr(dev_address,CRam1+21);
UART1_Write_Text(CRam1);
UART1_Write_CText(" soit ");
ByteToHex(dev_address,CRam1);
UART1_Write_Text(CRam1);
CRLF();

}
k++;
}
I2C1_Stop();
Delay_ms(50);
while(I2C1_Is_Idle()==0);
if(Bavard>0) CRLF();
return(OK);
}



J'utilise dans ce programme la sortie RA3 , comme top de synchro , pour
visualiser sur mon SQ50 IKA Logic analyser, le bus I2C, lorsqu'il rencontre un device sur le bus
On voit bien le ACK present ..
Par contre l'adressage affiché est l'adressage DEVICE , pas l'adresse ECRITURE, comme à la mode ARDUINO !

images/t_SQ50_I2C_adresse_7bits_only.gif
Affiche 0x50 ! soit 80 l'adresse 7 bits !
qui est quand meme contradictoire, si on se refere à l'affichage BINAIRE, moi je lis 0xA0 ! soit 160 sur 8 bits
C'est bien la sequence I2C sur l'adresse d'ecriture 160 que je capture

....Bon c'est comme ça !..
IL FAUT JUSTE , BIEN FAIRE ATTENTION ..


Le programme
Source documenté :
_18F26K22_List_I2C_devices_on_the_bus_170901.c
fichier Hex :
_18F26K22_List_I2C_devices_on_the_bus.hex
Projet MikroC :
_List_devices_sur_bus_I2C.zip



 

 

paulfjujo@free.fr


Retour à l'index general