ARM9 Stdlib: I2C Ack problem
Postat: 22 april 2008, 10:23:37
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:
Funktionen PF_I2C_WaitForAck() väntar på ett I2C Event och ger upp efter 100 ms.
I2C sätts upp genom:
Hur ska man använda I2C_EVENT_SLAVE_ACK_FAILURE för att märka att ingen slav ackar???
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);
}
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);