Easyelectronics.ru

Электроника для всех
Текущее время: 29 июн 2022, 12:24

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 4 ] 
Автор Сообщение
 Заголовок сообщения: I2C acknowledge failure
СообщениеДобавлено: 04 июл 2021, 02:19 
Старожил
Аватара пользователя

Зарегистрирован: 18 июн 2011, 16:29
Сообщения: 2585
Откуда: Волноваха
Пытаюсь обработать ситуацию, когда на шине нет подчиненного устройства, соответственно, при передаче адреса мастер получает acknowledge failure:
Цитата:
Acknowledge failure (AF)
This error occurs when the interface detects a non-acknowledge bit. In this case,
• The AF bit is set and an interrupt is generated if the ITERREN bit is set
• A transmitter which receives a NACK must reset the communication:
– If slave: Lines are released by hardware
– If master: A stop condition or repeated start must be generated by software

Выглядит это у меня так
Код:
    I2C_GenerateSTART(ENABLE);                               
    while (!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT));  // EV5
    I2C_Send7bitAddress(0x48<<1, I2C_DIRECTION_TX);
    if(I2C_GetFlagStatus(I2C_FLAG_ACKNOWLEDGEFAILURE))          // if NO ACK
    {
      I2C_GenerateSTOP(ENABLE);                                 // RM0016, p. 301
      while(I2C->CR2 & I2C_CR2_STOP);                       // wait for STOP
      I2C_ClearFlag(I2C_FLAG_ACKNOWLEDGEFAILURE);
    }else
    {
      while (!I2C_CheckEvent(I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
      I2C_SendData(0x01);
      while(I2C_GetLastEvent() != I2C_EVENT_MASTER_BYTE_TRANSMITTING);
      I2C_GenerateSTOP(ENABLE);
      while(I2C->CR2 & I2C_CR2_STOP);
    }

На логическом анализаторе видно, что после NACK мастер не отпускает линию SCL и не генерирует STOP
Вложение:
2021-07-04_00-12-09.png
2021-07-04_00-12-09.png [ 16.53 Кб | Просмотров: 2416 ]
но если в отладчике эту часть кода прошагать вручную, то STOP генерируется после NACK, флаг BUSY сбрасывается, и цикл повторяется, как и задумано.
Что не так, как нормально отработать отсутствие слейва?
Проц STM8S105K6, слейв - LM75, если он на шине есть, то обмен нормально идет.

_________________
Хранитель форума


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: I2C acknowledge failure
СообщениеДобавлено: 04 июл 2021, 03:19 
Старожил

Зарегистрирован: 10 окт 2014, 00:48
Сообщения: 7945
К вопросу напрямую не относится, но что-то вспомнилось ...
Отлаживаю протокол, в кейле открыты регистры, в том числе USART (посекундный опрос). На пошаговой отладке протокол по COM'у валится. Все "вводные" дал, для желающих подумать - ответ в спойлере.
Show


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: I2C acknowledge failure
СообщениеДобавлено: 04 июл 2021, 05:10 
Старожил
Аватара пользователя

Зарегистрирован: 18 июн 2011, 16:29
Сообщения: 2585
Откуда: Волноваха
Так, разобрался. Жадные ST-шники пожалели выделить один бит в каком-нибудь статусном регистре для определения именно такой ситуации - когда слейв не отвечает на свой адрес.
Show Ну есть же свободный бит :)

Сначала была идея опрашивать I2C_FLAG_ACKNOWLEDGEFAILURE, как оно и сделано в первом сообщении. Но в таком варианте я его опрашиваю ДО передачи адреса(формально - _после_, но т.к. интерфейс довольно медлительный, то адрес еще в процессе выдачи на шину), соответственно, этот флаг не выставлен в момент опроса, а потом уже когда адрес передан, но слейв не ответил - весь обмен летит к чертям!
Потом попытался отслеживать момент окончания передачи адреса по биту ADDR
Цитата:
Bit 1 ADDR: Address sent (master mode)/matched (slave mode) (8)(9)
This bit is cleared by software reading SR1 register followed reading SR3, or by hardware when PE=0.
– Address matched (Slave)
0: Address mismatched or not received.
1: Received address matched.
– Set by hardware as soon as the received slave address matched with the OAR registers
content or a general call or a SMBus is recognized. (when enabled depending on
configuration).
– Address sent (Master)
0: No end of address transmission
1: End of address transmission
– For 10-bit addressing, the bit is set after the ACK of the 2nd byte.
For 7-bit addressing, the bit is set after the ACK of the byte.
Note: ADDR is not set after a NACK reception
но он не устанавливается, если слейв не ответил :((
С битом TXE тоже облом, он не участвует в передаче адреса.
Цитата:
Bit 7 TXE: Data register empty (transmitters) (1)
0: Data register not empty
1: Data register empty
– Set when DR is empty in transmission. TXE is not set during address phase

Пока помог костыль в виде экспериментально подобранной задержки между передачей адреса и опросом флага I2C_FLAG_ACKNOWLEDGEFAILURE:
Код:
I2C_GenerateSTART(ENABLE);                               
    while (!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT));  // EV5
    I2C_Send7bitAddress(0x48<<1, I2C_DIRECTION_TX);        // передаем адрес слейва
   
    delay(500);                                            // ждем, пока адрес будет передан! (задержка в тиках, не мс)
   
    if(I2C_GetFlagStatus(I2C_FLAG_ACKNOWLEDGEFAILURE))     // проверяем флаг ACKNOWLEDGEFAILURE
      {   
        I2C_ClearFlag(I2C_FLAG_ACKNOWLEDGEFAILURE);             // сбрасываем его
        I2C_GenerateSTOP(ENABLE);                                 // RM0016, p. 301
      }
    else
    {
      while (!I2C_CheckEvent(I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
      I2C_SendData(0xAA);
      while(I2C_GetLastEvent() != I2C_EVENT_MASTER_BYTE_TRANSMITTING);
      I2C_GenerateSTOP(ENABLE);
    } 

Теперь I2C не виснет даже если на ходу оторвать слейву ноги и прилепить потом обратно :)
Show Картинки с ЛА

Но хочется более изящного решения. У кого какие идеи будут?
Ps: вот поэтому оно в отладчике и работало:) я тоже думал что дело в чтении статусных регистров или типа того...

_________________
Хранитель форума


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: I2C acknowledge failure
СообщениеДобавлено: 19 окт 2021, 22:07 
Старожил
Аватара пользователя

Зарегистрирован: 18 июн 2011, 16:29
Сообщения: 2585
Откуда: Волноваха
Show Flag polling mode

оставлю здесь, чтобы не потерять
Вложение:
stm8-8bit-mcus-ic-optimized-examples-stmicroelectronics.pdf [396.45 Кб]
Скачиваний: 69
AN3281
Application note
STM8 8-bit MCUs I2C optimized examples

_________________
Хранитель форума


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 4 ] 


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB