Перейти к содержанию
    

I2c. не могу начать прием.

всем добрый день. ситуация следующая. имеется плата stm32f4discovery и датчик давления bmp085. при попытке считать данные с него, не устанавливается старт_бит. потому что стоит флаг busy, то есть шина занята, причем на SCL высокий уровень, а на SDA низкий. как я понимаю, шину занимает Slave, пытаясь передать данные, не принятые с прошлого включения. причем, если при этом подключен цифровой анализатор, то в 80% случаях, прием стартует нормально, без него в 90% шина занята. все это происходит при отладке. флаг busy сбрасывал, не помогает. куда еще можно покопать? как при перегрузке контроллера, объяснить slave, что передача больше не требуется? а то при подаче питания, похоже он прижимает SDA, и не дает выставить SB

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

как ... объяснить slave, что передача больше не требуется?

 

Стандартное решение: дать ему "выговориться" :-)

Выдать на SCL 9 импульсов (до 8 данных и 1 ack), но не подтверждать приём. После этого NAK'а слейв должен отпустить шину.

 

Одна проблема - я не знаю контроллеров, которые могут сделать подобный манёвр без передачи START.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Одна проблема - я не знаю контроллеров, которые могут сделать подобный манёвр без передачи START.

Видимо нужно проделывать процедуру с отключённым I2C.

А насколько необходима такая процедура? Или это перестраховка?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Стандартное решение: дать ему "выговориться" :-)

Выдать на SCL 9 импульсов (до 8 данных и 1 ack), но не подтверждать приём. После этого NAK'а слейв должен отпустить шину.

 

Одна проблема - я не знаю контроллеров, которые могут сделать подобный манёвр без передачи START.

 

Думал над эти уже...

Но что-то как-то через одно место получается...

Да и насильно его (SCL) садить на землю боязно как-то...

Может кто знает, при подаче питанния на Slave, если до отключения питания он не закончил передачу, он сразу начинает пихать байты, или ждет старта от Mastera ?

Любопытно, почему при подключении логического анализатора зачастую все Ок...

 

Видимо нужно проделывать процедуру с отключённым I2C.

А насколько необходима такая процедура? Или это перестраховка?

 

Поясню более подробно ситуацию.

Я нахожусь в отладке (IAR), программа гоняется по кругу, идет опрос барометра, смотрю его показания, все ок. Решаю внести изменения в прошивку, жму Rebild, заливаю прошивку в контроллер. Если в момент перезагрузки работал Slave, то он не получил NACK от камня и пытается ему передать то, что не успел. Соответственно после прошивки не могу достучаться до slave, так как шина занята (SDA прижат на землю).

 

Ну или возьмем другую ситуацию, все работает оот батарейки. Батарейка села, поменяли, если в момен отключения контроллера slave ему что-то слал, то после замены батарейки до Slave уже не достучаться, потму что как только появиться питание, он тут же прижмет линию SDA.

Изменено пользователем Geniok

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да и насильно его (SCL) садить на землю боязно как-то...

Не бойтесь, он не кусается :-)

И вообще, шину I2C можно одновременно "садить на землю" хоть с 10 одновременно подключенных устройств. Схема "открытый коллектор" этому не препятствует.

 

как только появиться питание, он тут же прижмет линию SDA

Работает что-то явно не так. Если с этого барометра тоже снимали питание, то сразу после старта он шину не займёт - он просто не помнит, что "в прошлой жизни" что-то передавал.

 

Перечитал первый пост. Очень странно, что лог.анализатор на что-то влияет. Осциллограмму обмена есть возможность посмотреть? И номиналы подтягивающих резисторов интересуют.

 

 

А насколько необходима такая процедура? Или это перестраховка?

У нас была железяка на LPC2138, которая регулярно опрашивала I2C EEPROM. Особенность LPC213x - вход в загрузчик по ноге, на которую выведен I2C. И дотошные тестировщики научились так щелкать выключателем питания, что контроллер перезагружался, а eeprom продолжала передавать. В итоге контроллер попадал в загрузчик.

Но я так ничего и не сделал - тут или алгоритмы работы полностью переделывать, или схемотехнику менять (с потерей совместимости).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не бойтесь, он не кусается :-)

И вообще, шину I2C можно одновременно "садить на землю" хоть с 10 одновременно подключенных устройств. Схема "открытый коллектор" этому не препятствует.

 

 

Работает что-то явно не так. Если с этого барометра тоже снимали питание, то сразу после старта он шину не займёт - он просто не помнит, что "в прошлой жизни" что-то передавал.

 

Перечитал первый пост. Очень странно, что лог.анализатор на что-то влияет. Осциллограмму обмена есть возможность посмотреть? И номиналы подтягивающих резисторов интересуют.

 

Действительно не так. Ошибка была в том. что если Slave не отвечал, то через определенное количество попыток достучаться до него выходил из цикла не отправив STOP, тогда как START был уже выставлен. Таким образом при следующем включении (изменении прошивки) шина была занята. Выходит Slave был не при чем.

 

Хотя странно, при снятии и подаче питания по идее ни МК, ни Slave не должны были ничего "помнить"...

Понаблюдаю еще.

 

Влияние лог. анализатора пока так и не выяснил, понаблюдаю еще за поведением.

 

Номиналы резисторов ЕМНИП 10К, с осцилограммой проблемы, так как под рукой осцилографа нет. :(

 

Спасибо всем, кто откликнулся и помог!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Увы, проблема так и не решилась!

Все по-прежнему, с подключеным Лог. Анализатором все прекрасно работает, как только его отключаю работать не хочет.

На всякий случай Лог. анализатор используется U-Logic, подключен к GND, SDA и SCL.

Уже и не знаю, на что думать...

 

Причем неважно, нахожусь ли я в режиме снятия показаний с SDA и SCL, или просто Лог. анализатр "висит" на ножках, все прекрасно работает. Как только снимаю ег с ножек, жму Reset, или не могу выставить SB, или Slave не отзывается на передачу его его адреса. (ADDR)

 

Опытным путем выяснил, что затык получается если отцепить U-Logic с ножки SCL.

Снятие с ножек GND и SDA никак не влияет на работу. Опрос Барометра продолжается в штатном режиме. Как только отцепляю U-Logic с ножки SCL, передача тут же прекращается.

 

Причем, даже снятие питания с U-Logic не мешает прекрасной работе. Лишь бы на ножке SCL он висел.

 

Куда хоть копать ?

Изменено пользователем Geniok

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Куда хоть копать ?

имхо, иголки ловите, а входная емкость анализатора их сглаживает

поставите у мастера на SCL последовательно резистор ом на 100

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

имхо, иголки ловите, а входная емкость анализатора их сглаживает

поставите у мастера на SCL последовательно резистор ом на 100

 

Похоже на правду. Плата с датчиком BMP085 присоединена к контроллеру тонкими проводами длинной сантиметров 10.

Если цепляю провод от Лог. анализатора на тот же выход (просто провод, в сам анализатор он не воткнут даже) то все Ок.

Снимаю провод анализатора с конца, оставляя только провод до платы с датчиком, передачи нет...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...