V.O. 31/08/2017
rev1 02/09/2017
rev2 09/04/2018
Test présence Devices sur un bus I2C
(MikroC)
Version
18F46K22 DIP 40 , test sur I2C1 ou I2C2 , choix dans definition
programme
Version 18F26K22
DIP 28 pins
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
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 !
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
Version 18F46K22 DIP 40 , test
sur I2C1 ou I2C2 ,
choix dans definition programme
Application semblable..
Rajout
Compilation conditionnelle pour choix I2C1 OU I2C2
Rappel Hardware :
Projet MikroC : _18F46K22_List_I2C1_or_I2C2_devices_on_the_bus_180409.zip
Source : _18F46K22_List_I2Cx_devices_on_the_bus_180409.c
Chargeur : _18F46K22_List_I2C1_or_I2C2_devices_on_the_bus_180409.hex
Resultat avec RTC DS1307 + Eeeprom + LCD 4x20
chars PCF8754T
Presentation:
Directory :C:\_MikroC\_MesProjets_MikroC\_List_I2C_devices_on_the_I2C_Bus
MikroC pro 7.10
Projet :_18F46K22_List_I2C1_or_I2C2_devices_on_the_bus.mcppi
Lecture adresses device sur le bus I2C1 ou I2C2
Source : _18F46K22_List_I2Cx_devices_on_the_bus_180409.c
LCD 4x20 I2C , module EEprom 24LC32 avec RTC DS1307 sur le Bus I2C
#1
Avec R pull up de 2,7K sur les lignes SCL et SDA du bus I2x
Mode BAvard si RA5 =0
Init I2C1 RC3=SCL1 RC4=SDA1 100Khz
Mode Bavard RA5 =1
List Write Adress I2Cx Devices (from @32 to 254) :
Device #1 @4E
Device #2 @A0
Device #3 @D0
Device #4
Device #5
Device #6
Device #7
Device #8