Salut,
Je rencontre des problèmes afin de réaliser ma liaison I2C entre mon PIC 18F2550 et mon accéléromètre LIS3LV02DL.
Je n'ai pas de quartz, j'utilise l'horloge interne du PIC.
Je pense que mon code est bon mais je ne vois rien à l'oscilloscope sur ma ligne SDA.
Voilà mon code. Je vous remercie d'avance.
#include <p18f2550.h>
#include "i2c.h"
#pragma config WDT = OFF //Watchdog désactivé
#pragma config MCLRE = OFF //désactiver la pin de Reset
#pragma config LVP = OFF //Low Voltage Programming désactivé => RB5 I/O normale
#pragma config FOSC = INTOSCIO_EC//Internal oscillator, port function on RA6, EC used by USB
void initialisation(void)
{
//configuration horloge interne du pic à 32 MHz
OSCCON = 0x70; //pas de prédiviseur => 8MHz
OSCTUNE = 0x40; //activer la PLL *4 => 32MHz
//désactiver le convertisseur analogique numerique
ADCON1=0x0F;
//désactiver le module CCP
CCP1CON=0;
//direction des ports 0=Output, 1= Input
TRISBbits.TRISB0=1; //SDA
TRISBbits.TRISB1=1; //SCL
TRISBbits.TRISB4 = 0;//LED verte
}
unsigned char ReadAccelerometre(unsigned char Registre)
{
unsigned char bRet = 0x00;
IdleI2C(); //Attente du bus OK
StartI2C(); //Envoi de message de début(envoie du ST)
IdleI2C(); //Attente de la disponibilité du bus
WriteI2C(0x1D); //Envoi de l'adresse de l'accéléromètre 0(écrire)+(0011101)
IdleI2C(); //Attente de la disponibilité du bus
WriteI2C(Registre); //Envoi du registre a lire
IdleI2C();
RestartI2C();//SR
WriteI2C(0x9D);
if (SSPCON2bits.ACKSTAT) //Si AckStat == 1, on n'a pas reçu d'acquittement
{
StopI2C(); //Envoi de la condition de stop
return bRet;
}
bRet = ReadI2C(); //Lecture I2C
NotAckI2C(); //Pas d'acquittement car on lit qu'un seul caractère
IdleI2C();
StopI2C(); //Envoi du stop
return bRet; //Retour de la valeur lue
}
unsigned char donnee;
void main ()
{
initialisation(); //initialisation du PIC
while(1){
OpenI2C(MASTER,SLEW_OFF); //Overture de l'I2C en master mode
PORTBbits.RB4 = 1;
donnee=ReadAccelerometre(0xAC) ;//ici 1(read))+OUTZ_L(0101100)
}
}
-----