Bonjour,
J'ai besoin de votre aide car ça fait un sacré moment que je sèche sur mon projet. Je dois effectuer une communication I2c maitre-esclave entre 2 MCU PIC18F452 mais ça coince... En effet, en exécutant pas à pas côté maître, j'ai pu constater que le maître ne reçoit jamais d'acquittement. Pourriez-vous m'aiguiller svp ? Petite précision, mon code est en langage C.
Code côté Maître :
#include "scI2C_PIC18.h"
#include <pic18.h>
#define I2C_SLAVE_WRITE 0xDE /* 11011110b */
#define I2C_SLAVE_READ 0xDF /* 11011111b */
#define I2C_TC74CMD 0x54 /* character 'T' */
#define I2C_ADCMD_0 0x30 /* character '0' */
#define I2C_ADCMD_7 0x37 /* character '7' */
/****************************** *****************************/
int main(void)
/* Main application
****************************** ******************************/
{
char l_cValue = 0; // To stock the result
i2c_init(1); // Master mode
i2c_start();
i2c_write(I2C_SLAVE_WRITE);
if (ACKSTAT) // test received ack bit state *********** DEJA ICI, IL NE RECOIT AUCUN ACQUITTEMENT...
{
i2c_stop();
return 0; // bus device responded with NOT ACK
}
i2c_write(I2C_TC74CMD);
if (ACKSTAT) // test received ack bit state
{
i2c_stop();
return 0; // bus device responded with NOT ACK
}
i2c_restart();
i2c_write(I2C_SLAVE_READ);
l_cValue = i2c_read();
i2c_nack();
i2c_stop();
return 0;
}
Côté esclave :
#include "scAD_PIC18.h"
#include "scI2C_PIC18.h"
#include "scTC74_I2C.h"
#define I2C_TC74CMD 0x54 /* character 'T' */
#define I2C_ADCMD_0 0x30 /* character '0' */
#define I2C_ADCMD_7 0x37 /* character '7' */
/****************************** *****************************/
int main(void)
/* Main application
****************************** ******************************/
{
char l_cCmd = 0;
i2c_init(0); // Slave mode
while(1)
{
// RECEPTION -----------------------------
i2c_read_slave(); // Receive the address
l_cCmd = i2c_read_slave(); // Receive the command
if (l_cCmd == I2C_TC74CMD)
{
l_cCmd = 66;
}
else
l_cCmd = 88;
// TRANSMISSION -----------------------------
i2c_write_slave(l_cCmd);
}
return 0;
}
Dans la fonction Init du côté esclave, j'ai mis l'adresse 0x6F dans SSPADD et j'ai bien mis RC3 et RC4 à 1.
Si besoin je peux joindre le corps des fonctions.
Est-ce qu'avec ceci vous pourriez déjà éventuellement m'indiquer si une grossière erreur est visible ?
Un grand merci d'avance.
-----