реклама на сайте
подробности

 
 
> STR91xFA ARM9 и I2C
Zandy
сообщение Apr 30 2010, 16:20
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 153
Регистрация: 5-03-05
Из: Москва
Пользователь №: 3 098



Контроллер работает в режиме "Master receiver". Надо принять один байт. Т. е. после приема первого байта выставить "non-acknowledge" и передать стоповую посылку. В документации по поводу "non-acknowledge" сказано следующее: (цитата) "Note: In order to generate the non-acknowledge pulse after the last received data byte, the ACK bit must be cleared just before reading the second last data byte."
Так вот, в чем вопрос. Когда надо очищать 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;

В случае единичного байта BUFFER_SIZE = 1 и соответственно условие if ( Rx_Idx == BUFFER_SIZE-2 ) никогда не будет выполняться и отсутствие подтверждения никогда не будет передано.
Так как же быть? Читать два байта, а второй не принимать во внимание?
Два байта принимается нормально, но чтение второго байта уже идет с инкрементированного адреса. (читаю настройки аудиокодека).

Сообщение отредактировал rezident - Apr 30 2010, 20:57
Причина редактирования: Оформление цитаты исходника.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 08:07
Рейтинг@Mail.ru


Страница сгенерированна за 0.01389 секунд с 7
ELECTRONIX ©2004-2016