Так вот, в чем вопрос. Когда надо очищать ACK бит? Ведь принимаемый байт всего один.
Привожу кусок из примера драйвера I2C (нашел в примерах к Keilу)
Код
case I2C_EVENT_MASTER_BYTE_RECEIVED: // EV7
if ( Rx_Idx == BUFFER_SIZE-2 )
{
// Send STOP Condition
I2C_AcknowledgeConfig (I2C1, DISABLE);
}
if ( Rx_Idx == BUFFER_SIZE-1 )
// Send STOP Condition
I2C_GenerateSTOP(I2C1, ENABLE);
I2C1_Buffer_Rx[Rx_Idx] = I2C_ReceiveData(I2C1);
Rx_Idx++;
break;
if ( Rx_Idx == BUFFER_SIZE-2 )
{
// Send STOP Condition
I2C_AcknowledgeConfig (I2C1, DISABLE);
}
if ( Rx_Idx == BUFFER_SIZE-1 )
// Send STOP Condition
I2C_GenerateSTOP(I2C1, ENABLE);
I2C1_Buffer_Rx[Rx_Idx] = I2C_ReceiveData(I2C1);
Rx_Idx++;
break;
В случае единичного байта BUFFER_SIZE = 1 и соответственно условие if ( Rx_Idx == BUFFER_SIZE-2 ) никогда не будет выполняться и отсутствие подтверждения никогда не будет передано.
Так как же быть? Читать два байта, а второй не принимать во внимание?
Два байта принимается нормально, но чтение второго байта уже идет с инкрементированного адреса. (читаю настройки аудиокодека).