by phillou » Wed May 30, 2007 12:00 am
Après avoir questionné le forum de chez Matrix, J’ai reçu comme réponse ceci.
Une étude est en cour pour avoir une (des) macro (s) pour cette communication en i2c.
En attendant il m’a laisser ce code provisoirement pour dépannage.
Mais je me pose la question, faut-il placer tout ce code a l’ intérieur d’ une même cellule ou bien faut-il en créer plusieurs en séparant les éléments ?
Merci pour vos réponses.
//prototypes
char I2C_Initialize();
char MAC_MaskFromBit(char bit);
void MAC_SendI2CByte(char val);
void MAC_SendI2CStart();
void MAC_SendI2CStop();
char I2C_Initialize()
{
//initialise i2c
#define I2C_TRIS trisc
#define I2C_SDA 4
#define I2C_SCL 3
set_bit(I2C_TRIS, MX_I2C_SDA);
set_bit(I2C_TRIS, MX_I2C_SCL);
sspadd=48; //48 = 100kHz, 11 = 400kHz (@ 19.6608MHz)
sspstat = 0;
set_bit(sspstat,SMP);
sspcon2 = 0;
//i2c master mode, SPEN
sspcon = 0;
set_bit(sspcon,SSPM3);
set_bit(sspcon,CKP);
set_bit(sspcon,SSPEN);
}
char I2C_MaskFromBit(char bit)
{
char retVal = 0;
switch (bit)
{
case 0:
retVal = 0x01;
break;
case 1:
retVal = 0x02;
break;
case 2:
retVal = 0x04;
break;
case 3:
retVal = 0x08;
break;
case 4:
retVal = 0x10;
break;
case 5:
retVal = 0x20;
break;
case 6:
retVal = 0x40;
break;
case 7:
retVal = 0x80;
break;
}
return (retVal);
}
char I2C_ReadByte(char lastbyte)
{
char retVal = 0;
char mask;
//wait until the bus is idle...
mask = I2C_MaskFromBit(R_W);
while (sspstat & mask); // tx in progress?
mask = I2C_MaskFromBit(ACKEN);
mask = mask | I2C_MaskFromBit(RCEN);
mask = mask | I2C_MaskFromBit(PEN);
mask = mask | I2C_MaskFromBit(RSEN);
mask = mask | I2C_MaskFromBit(SEN);
while (sspcon2 & mask); // bus busy?
//set RCEN and wait for it to clear
mask = I2C_MaskFromBit(RCEN);
sspcon2 |= mask;
while ((sspcon2 & mask) == mask);
if (lastbyte == 0)
{
clear_bit(sspcon2, ACKDT);
} else {
set_bit(sspcon2, ACKDT);
}
//set ACKEN and wait for it to clear
mask = I2C_MaskFromBit(ACKEN);
sspcon2 |= mask;
while ((sspcon2 & mask) == mask);
retVal = sspbuf;
return (retVal);
}
void I2C_SendByte(char val)
{
char rw_mask = I2C_MaskFromBit(R_W);
char mask;
//wait until the bus is idle...
while (sspstat & rw_mask); // tx in progress?
mask = I2C_MaskFromBit(ACKEN);
mask = mask | I2C_MaskFromBit(RCEN);
mask = mask | I2C_MaskFromBit(PEN);
mask = mask | I2C_MaskFromBit(RSEN);
mask = mask | I2C_MaskFromBit(SEN);
while (sspcon2 & mask); // bus busy?
mask = I2C_MaskFromBit(BF);
while (sspstat & mask); // buffer still full?
sspbuf = val;
while (sspstat & rw_mask); // tx in progress?
return;
}
void I2C_SendStart()
{
//set SEN and wait for it to clear
char mask = I2C_MaskFromBit(SEN);
sspcon2 |= mask;
while ((sspcon2 & mask) == mask);
return;
}
void I2C_SendStop()
{
//set PEN and wait for it to clear
char mask = I2C_MaskFromBit(PEN);
sspcon2 |= mask;
while ((sspcon2 & mask) == mask);
return;
}