Easyelectronics.ru

Электроника для всех
Текущее время: 25 июн 2018, 08:54

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



    • JLCPCB - Платы прототипов всего за 2$ c бесплатной доставкой (при первом заказе)
    • 10 PCBs за $2 для 2 слоев, $15 для 4 слойной, $74 для 6 слойной платы.
    • Крупнейший китайский производитель прототипных плат. 290000+ клиентов & 8000+ заказов в день!
    • LCSC - Крупнейший китайский онлайн магазин радиодеталей.

Начать новую тему Ответить на тему  [ Сообщений: 28 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: i2c & eeprom
СообщениеДобавлено: 09 мар 2014, 20:22 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 21 янв 2014, 23:13
Сообщения: 52
Откуда: Киев
Здравствуйте.
Предпринял попытку ознакомиться с i2c. Прочитал здесь статьи про i2c, решил написать кусок кода для работы c встроенным в плату eeprom. https://gist.github.com/rmnk/86cbd56270eb316552df.
Все это происходит на pinboard 2 с модулем avr8.
На начале файла код для дебажных выводов на сегментный индикатор, он всегда показывает 0x0f, то есть, никто не устанавливает 0 на SDA после каждой записи. 4 тумблера возле eeprom установлены в OFF (вниз). Пины PC4 и PC5 подсоединил к выводам SDA и SCL модуля микроконтроллера.
Не вижу, где я ошибся. Укажите, пожалуйста, на ошибку.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: i2c & eeprom
СообщениеДобавлено: 09 мар 2014, 20:43 
Администратор
Аватара пользователя

Зарегистрирован: 16 янв 2010, 06:09
Сообщения: 6244
Откуда: Челябинск
Сама епром то на адрес отзывается? На каком шаге автомата все встало?

_________________
Хозяин дома


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: i2c & eeprom
СообщениеДобавлено: 09 мар 2014, 20:51 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 21 янв 2014, 23:13
Сообщения: 52
Откуда: Киев
После передачи первого байта (https://gist.github.com/rmnk/86cbd56270eb316552df#file-i2c-eeprom-L158 - подсветил строчку), SDA никто не прижал. Или у меня ошибка в коде, или eeprom не отвечает, так ведь?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: i2c & eeprom
СообщениеДобавлено: 09 мар 2014, 22:30 
Администратор
Аватара пользователя

Зарегистрирован: 16 янв 2010, 06:09
Сообщения: 6244
Откуда: Челябинск
Возьми да проверь. Поставь выдержку между шагами в две секунды, повесь светодиоды на уровни и пронаблюдай за шиной. Гадать или тупить в код тут совсем не лучшая идея.

_________________
Хозяин дома


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: i2c & eeprom
СообщениеДобавлено: 12 мар 2014, 02:26 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 21 янв 2014, 23:13
Сообщения: 52
Откуда: Киев
Дебажил вольтметром и предложенным вами способом, но ничего подозрительного не заметил. Значения на шине в действительности повторяют то, что я написал в коде.
Хотелось бы уточнить момент, когда мастер ожидает подтверждения от слейва. Я делал следующим образом:
1) Поставил младший бит.
2) Поднял SCL.
3) Опустил SCL. (этот шаг я забыл сделать в коде, написанном ранее)
4) Поднял SDA.
5) Поднял SCL. (тут я жду когда слейв поставит ACK?)
6) Опустил SCL. (на этом шаге нужно значение ACK должно быть установлено?)
https://gist.github.com/rmnk/a2660faa4a946448e179 - процедура отправки байта.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: i2c & eeprom
СообщениеДобавлено: 12 мар 2014, 02:29 
Старожил
Аватара пользователя

Зарегистрирован: 03 сен 2010, 22:46
Сообщения: 5423
Откуда: Москва
rmnk писал(а):
Дебажил вольтметром и предложенным вами способом, но ничего подозрительного не заметил. Значения на шине в действительности повторяют то, что я написал в коде.
Хотелось бы уточнить момент, когда мастер ожидает подтверждения от слейва. Я делал следующим образом:
1) Поставил младший бит.
2) Поднял SCL.
3) Опустил SCL. (этот шаг я забыл сделать в коде, написанном ранее)
4) Поднял SDA.
5) Поднял SCL. (тут я жду когда слейв поставит ACK?)
6) Опустил SCL. (на этом шаге нужно значение ACK должно быть установлено?)
https://gist.github.com/rmnk/a2660faa4a946448e179 - процедура отправки байта.


Насколько я понял, I2C программный? На 4 шаге надо не поднимать SDA, а переключить GPIO на вход.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: i2c & eeprom
СообщениеДобавлено: 12 мар 2014, 03:11 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 21 янв 2014, 23:13
Сообщения: 52
Откуда: Киев
Да, так и делаю.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: i2c & eeprom
СообщениеДобавлено: 13 мар 2014, 15:54 
Администратор
Аватара пользователя

Зарегистрирован: 16 янв 2010, 06:09
Сообщения: 6244
Откуда: Челябинск
Кинь хекс, прошью у себя и погляжу осциллографом что там твоя прошивка творит.

_________________
Хозяин дома


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: i2c & eeprom
СообщениеДобавлено: 13 мар 2014, 16:15 
Старожил

Зарегистрирован: 04 окт 2012, 00:23
Сообщения: 2486
Откуда: Москва
Вот чувствую , что что-то здесь не так :)

Код:
#define I2C_DDR     DDRC
...............................................
void
i2c_set_scl(const uint8_t value)
{
    do {
        if (value) {
            I2C_DDR &= ~(1 << SCL);
        } else {
            I2C_DDR |= 1 << SCL;
        }
    } while (i2c_get_scl() != value);
}

void
i2c_set_sda(const uint8_t value)
{
    do {
        if (value) {
            I2C_DDR &= ~(1 << SDA);
        } else {
            I2C_DDR |= 1 << SDA;
        }
       
    } while (i2c_get_sda() != value);
}

Может все таки I2C_PORT , как минимум для SCL


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: i2c & eeprom
СообщениеДобавлено: 13 мар 2014, 16:22 
Старожил

Зарегистрирован: 15 янв 2013, 13:24
Сообщения: 5665
ILYAUL писал(а):
Вот чувствую , что что-то здесь не так :)

Код:
  I2C_DDR &= ~(1 << SCL);
  ... ...
  I2C_DDR |= 1 << SCL;
Может все таки I2C_PORT , как минимум для SCL
:-)

ТС, у I2C-Master'а линия SCL - всегда на вывод. Направлением линии (DDR) манипулируют только для SDA, но не SCL.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: i2c & eeprom
СообщениеДобавлено: 14 мар 2014, 01:29 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 21 янв 2014, 23:13
Сообщения: 52
Откуда: Киев
Перед написанием кода я читал некоторые материалы и способ установки значения на SCL брал оттуда.
http://easyelectronics.ru/interface-bus-iic-i2c.html
Show

http://radiohlam.ru/program/i2c_proc_avr.htm
Show

Действительно ли я должен устанавливать SCL через PORTn?
Значения на шине все равно стают нужные, даже если я неправильно их устанавливаю.


Последний раз редактировалось rmnk 14 мар 2014, 03:49, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: i2c & eeprom
СообщениеДобавлено: 14 мар 2014, 01:41 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 21 янв 2014, 23:13
Сообщения: 52
Откуда: Киев
hex:
Show


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: i2c & eeprom
СообщениеДобавлено: 14 мар 2014, 01:59 
Старожил

Зарегистрирован: 15 янв 2013, 13:24
Сообщения: 5665
rmnk писал(а):
Действительно ли я должен устанавливать SCL через PORTn?
Опасностью может грозить только очень медленный EEPROM при очень быстром I2C-Master'е.
Но дело в том, что EEPROM серии 24xx спокойно работают на частотах 400 кГц и выше, в то время как скорость программного I2C на AVR вряд ли удастся получить выше 100 килобит/сек. Ладно, чтобы не думалось :-) - манипулируйте SCL через DDR.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: i2c & eeprom
СообщениеДобавлено: 15 мар 2014, 00:28 
Старожил

Зарегистрирован: 04 окт 2012, 00:23
Сообщения: 2486
Откуда: Москва
Цитата:
Действительно ли я должен устанавливать SCL через PORTn?
Нет не надо. Моя ошибка.
Тут есть маленькая хитрость , которую я правда в Вашей инициализации не увидел. Что бы использовать DDRn для переключения SCL Вы должны включить подтягивающий резистор. Делается это записью в нужный бит 1 при условии , что DDRn настроен как вход . В этом случае получается схема с "открытым коллектором" для устройств на шине .
Вот в этом случае Вы можете использовать DDRn для формирования SCL.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: i2c & eeprom
СообщениеДобавлено: 15 мар 2014, 02:16 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 21 янв 2014, 23:13
Сообщения: 52
Откуда: Киев
Цитата:
Нет не надо. Моя ошибка.
Тут есть маленькая хитрость , которую я правда в Вашей инициализации не увидел. Что бы использовать DDRn для переключения SCL Вы должны включить подтягивающий резистор. Делается это записью в нужный бит 1 при условии , что DDRn настроен как вход . В этом случае получается схема с "открытым коллектором" для устройств на шине .
Вот в этом случае Вы можете использовать DDRn для формирования SCL.
А зачем нужно включать внутренний подтягивающий резистор? У меня ведь на шине висит уже по одному на каждый провод.
Открытый коллектор? Это значит что коллектор в воздухе? К сожалению, я нубас и не ориентируюсь в таких терминах. (Где можно получить доходчивое обяснение этому?)

Я представляю себе поведение i2c следующим образом:
Так как у меня есть внешние подтягивающие резисторы, то установка значений на шине осуществляется только переключением пина между состояними Sink и Hi-Z. При этом, значение на каждом проводе шины это логическое И от выставляемых на нее значений всех устройств.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: i2c & eeprom
СообщениеДобавлено: 15 мар 2014, 13:08 
Старожил

Зарегистрирован: 15 янв 2013, 13:24
Сообщения: 5665
ILYAUL писал(а):
Что бы использовать DDRn для переключения SCL Вы должны включить подтягивающий резистор. Делается это записью в нужный бит 1 при условии , что DDRn настроен как вход .
ILYAUL, на шину I2C всегда ставят внешние pullup-резисторы. Reference: любые схемы, какие найдёте.
При этом задействование внутреннего pullup теряет смысл, да ещё и усложняет переключение состояния пина (т.к.при выводе эта "единица в нужном бите" порта даст высокий логический уровень, что в 50% случаев не желательно).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: i2c & eeprom
СообщениеДобавлено: 15 мар 2014, 13:09 
Старожил

Зарегистрирован: 15 янв 2013, 13:24
Сообщения: 5665
rmnk писал(а):
Я представляю себе поведение i2c следующим образом:
Так как у меня есть внешние подтягивающие резисторы, то установка значений на шине осуществляется только переключением пина между состояними Sink и Hi-Z. При этом, значение на каждом проводе шины это логическое И от выставляемых на нее значений всех устройств.
Да, правильно понимаете.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: i2c & eeprom
СообщениеДобавлено: 15 мар 2014, 15:20 
Старожил

Зарегистрирован: 04 окт 2012, 00:23
Сообщения: 2486
Откуда: Москва
Цитата:
ILYAUL, на шину I2C всегда ставят внешние pullup-резисторы. Reference: любые схемы, какие найдёте.
При этом задействование внутреннего pullup теряет смысл, да ещё и усложняет переключение состояния пина (т.к.при выводе эта "единица в нужном бите" порта даст высокий логический уровень, что в 50% случаев не желательно).

Да , я имел ввиду при неиспользовании внешнего pull. Но даже если , он подключён , то получается схема с двумя параллельно подключенными резисторами. И влияние на работу схемы не скажется.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: i2c & eeprom
СообщениеДобавлено: 15 мар 2014, 19:41 
Старожил

Зарегистрирован: 15 янв 2013, 13:24
Сообщения: 5665
Сопротивление внутренней подтяжки намного выше, чем требуется для I2C. В данном случае (для I2C, TWI) внешний резистор всяко лучше работает.
У меня был случай, когда I2C на ATmega8 не хотел работать с одними внутренними pullup'ами, а со стандартными внешними заработало ОК, да и код получился проще.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: i2c & eeprom
СообщениеДобавлено: 21 мар 2014, 06:26 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 21 янв 2014, 23:13
Сообщения: 52
Откуда: Киев
Проблема частично решена. Построил i2c на Breadboard'е, вытащил из Pinboard EEPROM и втыкнул туда. Пришлось исправить одну программную ошибку (я ждал, когда подымется SDA, в то время, когда EEPROM хотела поставить ACK). Теперь все работает, удалось записать и считать значения. Тем не менее, на Pinboard никто не отзывается, и на шине все время остается NACK. В чем может быть проблема?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: i2c & eeprom
СообщениеДобавлено: 21 мар 2014, 14:34 
Заглядывает иногда

Зарегистрирован: 21 мар 2014, 14:22
Сообщения: 93
Откуда: Тверь
Обратите внимание на следующее: в тех описании на PB2 есть схема подключения eeprom, там линии А2-А0 и WP подтянуты к питанию. Если у вас выключатель по всем позициям в положении OFF, т.е. контакты разомкнуты выходит что у вас адрес НЕ 0xA0 к томуже запрещена запись, т.к. WP в лог 1. В общем проверьте адрес, и защиту записи согласно даташиту на конкретную микросхему памяти.

_________________
В начале было слово! И слово было два байта...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: i2c & eeprom
СообщениеДобавлено: 21 мар 2014, 17:23 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 21 янв 2014, 23:13
Сообщения: 52
Откуда: Киев
ppram5 писал(а):
Обратите внимание на следующее: в тех описании на PB2 есть схема подключения eeprom, там линии А2-А0 и WP подтянуты к питанию. Если у вас выключатель по всем позициям в положении OFF, т.е. контакты разомкнуты выходит что у вас адрес НЕ 0xA0 к томуже запрещена запись, т.к. WP в лог 1. В общем проверьте адрес, и защиту записи согласно даташиту на конкретную микросхему памяти.

Спасибо, с PB2 дело было именно в этом. Мне показалось логичным обратное, а описание полностью не вкурил.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: i2c & eeprom
СообщениеДобавлено: 22 мар 2014, 22:33 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 21 янв 2014, 23:13
Сообщения: 52
Откуда: Киев
Не смог найти достоверную информацию про необходимую задержку между stop и start последовательностями. В некоторых источниках пишут ставить 2 мкс, но у меня уже не работает при ~2800 мкс. Это как-то слишком много ждать приходится, не хорошо. Возможно, у меня что-то сделано не так?
Show


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: i2c & eeprom
СообщениеДобавлено: 25 мар 2014, 19:29 
Администратор
Аватара пользователя

Зарегистрирован: 16 янв 2010, 06:09
Сообщения: 6244
Откуда: Челябинск
А чего не аппаратно? Пусть сам молотит, а ты прерывания лови.

_________________
Хозяин дома


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: i2c & eeprom
СообщениеДобавлено: 25 мар 2014, 21:26 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 21 янв 2014, 23:13
Сообщения: 52
Откуда: Киев
DI HALT писал(а):
А чего не аппаратно? Пусть сам молотит, а ты прерывания лови.

Хочется все ручками пощупать, я думаю, что так можно глубже вникнуть и понять происходящее. Конечно, дальше разберусь с аппаратным I2C.
Возникла еще одна проблема. Есть китайский набор датчиков GY-80, там 4 прибора на i2c шине, но я не могу к ним достучаться. Пробегаю по всем адресам, но никто не отвечает, кроме уже упомянутой EEPROM на PB2. В чем может быть дело? При следующей попытке заставить их работать попробую запаять соединяющие штыри в отверстия платы, возможно плохой контакт.


Последний раз редактировалось rmnk 26 мар 2014, 19:31, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 28 ]  На страницу 1, 2  След.

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


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

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


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

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

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