ARM9 Stdlib: I2C Ack problem

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Rick81
Inlägg: 755
Blev medlem: 30 december 2005, 13:07:09

ARM9 Stdlib: I2C Ack problem

Inlägg av Rick81 »

Jag har ett projekt där jag jobbar med en ARMSTR912 processor, GCC kompilator och ST mjukvarubibliotek för STR91X.

Problemet är att jag kan skicka och ta emot meddelanden över I2C men dessvärre kan jag inte detektera om slaven på I2C ackar eller inte. Så om jag skickar till en I2C adress som inte finns så kommer jag bara att få en massa ettor som svar eftersom inget drar ned spänningen på bussen.

Min kod ser som följande:

Kod: Markera allt

I2C_GenerateStart(I2C0, ENABLE);
if( PF_I2C_WaitForAck(I2C_EVENT_MASTER_MODE_SELECT) != PF_OK )
{
   return PF_ERROR;
}

I2C_Send7bitAddress(I2C0, SlaveAddress, I2C_MODE_TRANSMITTER);
if( PF_I2C_WaitForAck(I2C_EVENT_MASTER_MODE_SELECTED) != PF_OK )
{
   return PF_ERROR;
}
I2C_Cmd(I2C0, ENABLE);
for(Index=0;Index
{
   I2C_SendData(I2C0, Data[Index]);
   if( PF_I2C_WaitForAck(I2C_EVENT_MASTER_BYTE_TRANSMITTED) != PF_OK)
   {
      return PF_ERROR;
   }
   if(I2C_CheckEvent(I2C0, I2C_EVENT_SLAVE_ACK_FAILURE) == SUCCESS)
   {
      PF_PutStringSC0_SCI((uint8 *)"ACK failed");
      return PF_ERROR;
   }
}

if(GenerateStop == TRUE)
{
   I2C_GenerateSTOP(I2C0, ENABLE);
}
Funktionen PF_I2C_WaitForAck() väntar på ett I2C Event och ger upp efter 100 ms.

I2C sätts upp genom:

Kod: Markera allt

SCU_APBPeriphClockConfig(__I2C0,ENABLE);
I2C_DeInit(I2C0);
I2C_Struct.I2C_CLKSpeed = I2C_CLK_SPEED;
I2C_Struct.I2C_OwnAddress = I2C_MASTER_ADDRESS;
I2C_Struct.I2C_GeneralCall = I2C_GeneralCall_Disable;
I2C_Struct.I2C_Ack = I2C_Ack_Enable;
I2C_Init(I2C0, &I2C_Struct);
I2C_ITConfig(I2C0, DISABLE);
Hur ska man använda I2C_EVENT_SLAVE_ACK_FAILURE för att märka att ingen slav ackar???