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);