Bonjour à tous,
Mon projet actuel consiste à faire communiquer (via le protocole I2C) un microcontrôleur PIC24FJ64GA002 avec un BlinkM qui est une LED RGB intelligente et programmable. J'ai besoin d'envoyer des commandes à la LED pour la faire changer de couleurs, mais aussi de lui demander la valeur d'un registre (son adresse, une ligne de sa mémoire EEPROM, ...).
Le µC et la LED sont alimentés à 3.4 V.
J'utiliser le module I2C2 du PIC, j'ai placé des résistances pull-up de 1.1 kOhms sur les lignes SDA2 et SCL2.
Jusqu'à maintenant j'ai réussi à commander la LED en choisissant la couleur ou en programmant le "light script". J'observe de bons résultats à l'affichage et les signaux mesurés avec mon analyseur logique sont corrects.
Par contre je n'arrive pas à récupérer la valeur d'un registre : en demandant par exemple l'adresse de la LED BlinkM, celle-ci a l'air de me renvoyer la valeur zéro, peu importe ce que je lui demande (je précise "a l'air de" car je n'ai pas réussi à observer le signal de réponse avec l'analyseur logique).
Voici le code utilisé :
Si vous avez une idée pour m'aider à résoudre ce problème ... merci beaucoup.Code:#include "p24FJ64GA002.h" #define USE_AND_OR // To enable AND_OR mask setting for I2C. #include "i2c.h" // Watchdog Timer/ICD pins select _CONFIG1(JTAGEN_OFF & GCP_OFF & GWRP_OFF & COE_OFF & FWDTEN_OFF & ICS_PGx1) // Disable CLK switch and CLK monitor, OSCO or Fosc/2, HS oscillator, // Primary oscillator _CONFIG2(FCKSM_CSDCMD & OSCIOFNC_OFF & POSCMOD_XT & FNOSC_PRI) // calculate baud rate of I2C #define Fosc (8000000) #define Fcy (Fosc/2) // no PLL #define Fsck 1000 #define I2C_BRG ((Fcy/2/Fsck)-1) void i2c_wait(unsigned int cnt) // fonction de temporisation { while(--cnt) { asm( "nop" ); asm( "nop" ); } } int main() { unsigned char SlaveAddress; char i2cData[10]; int DataSz; unsigned char i2cbyte = 0x02; OpenI2C2( I2C_ON, I2C_BRG ); SlaveAddress = 0x00; i2cData[0] = SlaveAddress << 1 ; //Device Address & WR i2cData[1] = 0x5A; // register DataSz = 2; while(1) // boucle tant que la communication ne marche pas { StartI2C2(); IdleI2C2(); MasterWriteI2C2( i2cData[0] ); // adresse IdleI2C2(); if( !I2C2STATbits.ACKSTAT ) { MasterWriteI2C2( i2cData[1] ); // adresse du registre à lire IdleI2C2(); } if( !I2C2STATbits.ACKSTAT ) { I2C2CONbits.RSEN=1; while(I2C2CONbits.RSEN); MasterWriteI2C2( i2cData[0] + 1 ); IdleI2C2(); if( !I2C2STATbits.ACKSTAT ) { I2C2CONbits.RCEN = 1; while(I2C2CONbits.RCEN); i2cbyte = I2C2RCV; // lecture de la réponse I2C2CONbits.ACKDT = 0; I2C2CONbits.ACKEN = 1; // NACK StopI2C2(); //Send the Stop condition IdleI2C2(); //Wait to complete // Config UART1 : _RP11R = 3; _U1RXR = 12; U1BRG = UART_BRG; U1MODEbits.UARTEN = 1; while(1) // boucle de réussite { i2c_wait(100); U1TXREG = i2cbyte; // observation : i2cbyte est toujours nul U1STAbits.UTXEN = 1; } } } StopI2C2(); //Send the Stop condition IdleI2C2(); //Wait to complete } }
N'hésitez pas à me demander des précisions qui pourraient vous éclairer sur mon problème.
Bonne journée à vous,
Le8nard
-----