|
STR91xFA ARM9 и I2C |
|
|
|
Apr 30 2010, 16:20
|

Частый гость
 
Группа: Свой
Сообщений: 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
Причина редактирования: Оформление цитаты исходника.
|
|
|
|
|
 |
Ответов
|
May 3 2010, 18:28
|

наблюдаю..
  
Группа: Свой
Сообщений: 291
Регистрация: 11-12-06
Из: Украина
Пользователь №: 23 369

|
Цитата(Zandy @ May 3 2010, 20:05)  Прошу прощения, мой вопрос настолько бездарно глуп и очевиден, что никто не отвечает, или просто надо ждать, когда подтянутся более сведующие в этом вопросе товарищи?  а мы все ждали, что Вы загуглите  Ладно.. В спецификации указано, что передача одного байта имеет такой формат(на пальцах): ведущий формирует сигнал СТАРТ-бит, потом происходит передача байта(8 бит  ), потом один бит подтверждение ACK - приемник удерживает линию в низком состоянии. Подтверждение обязательное. В конце передачи идет СТОП-бит. Цитата Если в пересылке участвует ведущий-приёмник, то он должен сообщить об окончании передачи ведомому-передатчику путем не подтверждения последнего байта. http://www.itt-ltd.com/reference/ref_i2c.html
|
|
|
|
|
May 3 2010, 19:44
|

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

|
Savrik, спасибо, конечно, но вы не совсем поняли вопрос. Речь не о передаче, а о приеме мастером, а точнее, о второй фазе приема после рестарта. Там расклад такой: Сначала мастер дает "рестарт", потом посылает слейв-адрес, бит "чтение", ждет acknowledge от slave. Далее идет прием первого байта. После него уже мастер посылает acknowledge. Далее прием второго байта, опять посылка 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 bit в случае приема одного единственного байта???!!! Не очищать его я тоже не могу. Ведь ACK bit устанавливается в 1 автоматически и на зануленной SDA линии STOP просто не пройдет. Вот в чем вопрос. Именно тут у меня в мозгах замутнение.
Сообщение отредактировал Zandy - May 3 2010, 19:55
|
|
|
|
|
May 11 2010, 14:21
|
Участник

Группа: Участник
Сообщений: 36
Регистрация: 10-02-06
Пользователь №: 14 185

|
Цитата(Zandy @ May 3 2010, 23:44)  "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 bit в случае приема одного единственного байта???!!! Наверное, флаг посылки ACK в этом случае вообще выставлять не надо. "Наверное" - потому, что нормально запустить I2C у нас так и не получилось. Уж больно они намудрили с контроллером i2c, пришлось делать дерганьем ножек. :-(
|
|
|
|
|
May 19 2010, 12:03
|

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

|
Цитата(Kane @ May 11 2010, 18:21)  Наверное, флаг посылки ACK в этом случае вообще выставлять не надо. "Наверное" - потому, что нормально запустить I2C у нас так и не получилось. Уж больно они намудрили с контроллером i2c, пришлось делать дерганьем ножек. :-( Я разобрался-таки. Нашел примерчик работы с EEPROMом по I2C. Non-ack передавать конечно надо, иначе прием циклится. А передавать его надо сразу после первого события EV5 при передаче адреса читаемого регистра. Насчет дергания ножками, это уж слишком... круто.
|
|
|
|
|
May 19 2010, 18:12
|
Участник

Группа: Участник
Сообщений: 36
Регистрация: 10-02-06
Пользователь №: 14 185

|
Можно подробнее, как вы передаете non-ack, заодно может примерчик покажете? В контроллере управление сигналом ack ведётся через бит ACK регистра I2C_CR. В моем понимании, нулевое значение бита и есть отправка сигнала non-ack. Поэтому при чтении одного байта, сразу после отправки i2c-адреса с битом чтения, мы бит ACK не устанавливаем.
|
|
|
|
|
May 20 2010, 07:35
|

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

|
Цитата(Kane @ May 19 2010, 22:12)  Можно подробнее, как вы передаете non-ack, заодно может примерчик покажете? В контроллере управление сигналом ack ведётся через бит ACK регистра I2C_CR. В моем понимании, нулевое значение бита и есть отправка сигнала non-ack. Поэтому при чтении одного байта, сразу после отправки i2c-адреса с битом чтения, мы бит ACK не устанавливаем. Вот посмотрите примерчик. https://my.st.com/public/STe2ecommunities/m.../I2C_EEPROM.zip Сделано по-дубовому, но все, как на ладони. Конкретно ответ содержится в функции void I2C_EE_BufferRead(u8* pBuffer, u8 ReadAddr, u16 NumByteToRead) из файла i2c_ee.c
|
|
|
|
|
May 26 2010, 13:27
|
Участник

Группа: Участник
Сообщений: 36
Регистрация: 10-02-06
Пользователь №: 14 185

|
Смотрел этот пример ранее - у меня он не работает. :-) Закопипастил их код, попробовал вызвать функцию I2C_EE_BufferRead. При чтении буфера виснет на самых первых строках: Код /* Send START condition */ I2C_GenerateStart (I2C0, ENABLE); /* Test on EV5 and clear it */ while(!I2C_CheckEvent(I2C0,I2C_EVENT_MASTER_MODE_SELECT)); Дело в том, что у меня почему-то выставляется другая комбинация бит в событии. По их примеру должны выставиться (I2C_FLAG_EVF | I2C_FLAG_BUSY | I2C_FLAG_M_SL | I2C_FLAG_SB), на самом деле у меня выставляются (I2C_FLAG_EVF | I2C_FLAG_M_SL | I2C_FLAG_SB). Почему так без понятия, если смотреть осциллографом команда start генерится, pull-up резисторы есть.
|
|
|
|
|
May 31 2010, 08:12
|

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

|
Цитата(Kane @ May 26 2010, 17:27)  Смотрел этот пример ранее - у меня он не работает. :-) Закопипастил их код, попробовал вызвать функцию I2C_EE_BufferRead. При чтении буфера виснет на самых первых строках: Код /* Send START condition */ I2C_GenerateStart (I2C0, ENABLE); /* Test on EV5 and clear it */ while(!I2C_CheckEvent(I2C0,I2C_EVENT_MASTER_MODE_SELECT)); Дело в том, что у меня почему-то выставляется другая комбинация бит в событии. По их примеру должны выставиться (I2C_FLAG_EVF | I2C_FLAG_BUSY | I2C_FLAG_M_SL | I2C_FLAG_SB), на самом деле у меня выставляются (I2C_FLAG_EVF | I2C_FLAG_M_SL | I2C_FLAG_SB). Почему так без понятия, если смотреть осциллографом команда start генерится, pull-up резисторы есть. У меня все прекрасно работает. К чему вы цепляете I2C? У вас не выставляется I2C_FLAG_BUSY. А это значит, что шина занята чем-то другим и соединение со slave - ус-вом не может быть установлено. Так что, скорее всего надо искать проблему не внутри контроллера, а снаружи. Все-таки посмотрите более внимательно на посылку старта двухлучевиком. Какая у вас скорость? какие стоят резисторы? какая общая емкость на шине I2C?
|
|
|
|
Сообщений в этой теме
Zandy STR91xFA ARM9 и I2C Apr 30 2010, 16:20 Zandy Прошу прощения, мой вопрос настолько бездарно глуп... May 3 2010, 17:05        Kane Цитата(Zandy @ May 31 2010, 12:12) У вас ... Jun 2 2010, 12:51         Zandy Да, действительно, I2C работает как-то не так.
Я в... Jun 3 2010, 10:56          Kane Сталкивались и с таким. :-) Дело в том, что сначал... Jun 3 2010, 13:02           Zandy Цитата(Kane @ Jun 3 2010, 17:02) Сталкива... Jun 7 2010, 14:41
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|