Форум программистов, компьютерный форум, киберфорум
Электроника и радиотехника
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.70/77: Рейтинг темы: голосов - 77, средняя оценка - 4.70
0 / 0 / 0
Регистрация: 17.01.2014
Сообщений: 38
1

i2c & eeprom

08.03.2014, 20:35. Показов 15051. Ответов 27
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте.
Предпринял попытку ознакомиться с y2s. Прочитал здесь статьи про y2s, решил написать кусок кода для работы c встроенным в плату eeprom. https://gist.github.som/rmmk/86cbd56270eb316552df.
Все это происходит на pinboard 2 с модулем avr8.
На начале файла код для дебажных выводов на сегментный индикатор, он всегда показывает 0x0f, то есть, никто не устанавливает 0 на SDA после каждой записи. 4 тумблера возле eeprom установлены в OFF (вниз). Пины PC4 и PC5 подсоединил к выводам SDA и SCL модуля микроконтроллера.
Не вижу, где я ошибся. Укажите, пожалуйста, на ошибку.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.03.2014, 20:35
Ответы с готовыми решениями:

Программатор eeprom I2C на pinboard?
День добрый. На pinboard есть полноценный FT232 c bitbang, поэтому y2s можно с лёгкостью...

Конвертер i2c в usb - MIKROE-1421, FTDI click USB 2.0 to I2C для ПК
Подскажите как подключить устройство с интерфейсом i2c к компьютеру. Требуется управление с...

AtmelStudio 6.0 - сохранение EEPROM
Доброго дня. Проблемка в том, что при отладке на эмуляторе, при каждом запуске проекта EEPROM...

JTAG ICE и EEPROM
Всем здравствуйте! Столкнулся вот с чем: При инициализации периферии чтение двойного слова из...

27
0 / 0 / 1
Регистрация: 22.01.2010
Сообщений: 4,000
08.03.2014, 20:56 2
Сама епром то на адрес отзывается? На каком шаге автомата все встало?
0
0 / 0 / 0
Регистрация: 17.01.2014
Сообщений: 38
08.03.2014, 21:04 3
После передачи первого байта (https://gist.github.som/rmmk/8... eprom-L158 - подсветил строчку), SDA никто не прижал. Или у меня ошибка в коде, или eeprom не отвечает, так ведь?
0
0 / 0 / 1
Регистрация: 22.01.2010
Сообщений: 4,000
08.03.2014, 22:43 4
Возьми да проверь. Поставь выдержку между шагами в две секунды, повесь светодиоды на уровни и пронаблюдай за шиной. Гадать или тупить в код тут совсем не лучшая идея.
0
0 / 0 / 0
Регистрация: 17.01.2014
Сообщений: 38
11.03.2014, 02:39 5
Дебажил вольтметром и предложенным вами способом, но ничего подозрительного не заметил. Значения на шине в действительности повторяют то, что я написал в коде.
Хотелось бы уточнить момент, когда мастер ожидает подтверждения от слейва. Я делал следующим образом:
1) Поставил младший бит.
2) Поднял SCL.
3) Опустил SCL. (этот шаг я забыл сделать в коде, написанном ранее)
4) Поднял SDA.
5) Поднял SCL. (тут я жду когда слейв поставит ACK?)
6) Опустил SCL. (на этом шаге нужно значение ACK должно быть установлено?)
https://gist.github.som/rmmk/a2660faa4a946448e179 - процедура отправки байта.
0
1 / 1 / 0
Регистрация: 30.08.2010
Сообщений: 3,379
11.03.2014, 02:42 6
Цитата Сообщение от rmmk
Дебажил вольтметром и предложенным вами способом, но ничего подозрительного не заметил. Значения на шине в действительности повторяют то, что я написал в коде.
Хотелось бы уточнить момент, когда мастер ожидает подтверждения от слейва. Я делал следующим образом:
1) Поставил младший бит.
2) Поднял SCL.
3) Опустил SCL. (этот шаг я забыл сделать в коде, написанном ранее)
4) Поднял SDA.
5) Поднял SCL. (тут я жду когда слейв поставит ACK?)
6) Опустил SCL. (на этом шаге нужно значение ACK должно быть установлено?)
https://gist.github.som/rmmk/a2660faa4a946448e179 - процедура отправки байта.
Насколько я понял, I2C программный? На 4 шаге надо не поднимать SDA, а переключить GPIO на вход.
0
0 / 0 / 0
Регистрация: 17.01.2014
Сообщений: 38
11.03.2014, 03:24 7
Да, так и делаю.
0
0 / 0 / 1
Регистрация: 22.01.2010
Сообщений: 4,000
12.03.2014, 16:07 8
Кинь хекс, прошью у себя и погляжу осциллографом что там твоя прошивка творит.
0
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
12.03.2014, 16:28 9
Вот чувствую , что что-то здесь не так :)

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

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

} while (y2s_get_sda() != value);
}
Может все таки I2C_PORT , как минимум для SCL
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
12.03.2014, 16:35 10
Цитата Сообщение от YTYOUT
Вот чувствую , что что-то здесь не так :)

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

ТС, у I2C-Masterа линия SCL - всегда на вывод. Направлением линии (DDR) манипулируют только для SDA, но не SCL.
0
0 / 0 / 0
Регистрация: 17.01.2014
Сообщений: 38
13.03.2014, 01:42 11
Перед написанием кода я читал некоторые материалы и способ установки значения на SCL брал оттуда.
http://iosyitistromyss.ru/inte... c-y2s.html
Ни в коем случае нельзя переключать вывод микроконтроллера в OUT и дергать ногу на +5. Можно запросто словить КЗ и пожечь либо контроллер либо какой-нибудь девайс на шине. Мало ли кто там линию придавит.
http://rodyohlam.ru/program/y2s_proc_avr.htm
Для установки линии в ноль - необходимо переключить её на "выход" и записать в защёлку 0. Ноль в защёлку можно записать один раз при инициализации и в дальнейшем менять только направление работы порта. Для установки линии в Z-состояние - достаточно переключить её на вход (в защёлке у нас ноль, так что подтягивающий резистор отключен).
Действительно ли я должен устанавливать SCL через PORTn?
Значения на шине все равно стают нужные, даже если я неправильно их устанавливаю.
0
0 / 0 / 0
Регистрация: 17.01.2014
Сообщений: 38
13.03.2014, 01:54 12
hex:
:1000000012C024C023C022C021C020C01FC01EC0F7
:100010001DC01CC01BC01AC019C018C017C016C014
:1000200015C014C013C011241FBECFE5D4E0DEBF3D
:10003000CDBF10E0A0E6B0E0EEEAF1E002C005902E
:100040000D92A037B107D9F79FD0AFC0D9CF9FEF9E
:1000500091BB97B321E030E001C0220F8A95EAF707
:10006000922B97BB88B3887F88BB88B3822B88BBD1
:10007000E62FF0E0E05AFF4F808182BB089583B302
:1000800082958170089583B385FB882780F9089550
:10009000CF93C82F2FE78AE196E02150804090400F
:1000A000E1F700C00000CC2311F0A59801C0A59A8B
:1000B000EADF8C13F8CFCF910895CF93C82F2FE7A5
:1000C0008AE196E0215080409040E1F700C00000B6
:1000D000CC2311F0A49801C0A49AD1DF8C13F8CFDF
:1000E000CF91089581E0E9DF81E0D2DF80E0E5CFC4
:1000F00080E0E3DF81E0CCDF81E0DFCF0F931F936F
:10010000CF93DF93C7E0D0E0082F10E080E0C0DF9E
:10011000C8010C2E02C0959587950A94E2F781706C
:10012000CCDF81E0B5DF219788F780E0B1DF81E0A7
:10013000C4DF81E0ADDFDF91CF911F910F919FCFA1
:100140000F931F93CF93DF93082F81E0B6DFC7E0B3
:10015000D0E010E080E09CDF81E09ADF90DF282F84
:100160000C2E01C0220F0A94EAF7122B219790F768
:1001700080E08EDF802FA1DF81E08ADF812FDF9199
:10018000CF911F910F91089585B38F7C85BBAADF16
:1001900080EAB4DFC82F6C2F80E059DF89EF90E050
:0E01A0000197F1F700C00000F6CFF894FFCFF2
:1001AE00EB28B3BA78DADBA8FBFAF95BC33BD3D101
:00000001FF
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
13.03.2014, 02:12 13
Цитата Сообщение от rmmk
Действительно ли я должен устанавливать SCL через PORTn?
Опасностью может грозить только очень медленный EEPROM при очень быстром I2C-Masterе.
Но дело в том, что EEPROM серии 24xx спокойно работают на частотах 400 кГц и выше, в то время как скорость программного I2C на AVR вряд ли удастся получить выше 100 килобит/сек. Ладно, чтобы не думалось :-) - манипулируйте SCL через DDR.
0
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
14.03.2014, 00:41 14
Действительно ли я должен устанавливать SCL через PORTn?
Нет не надо. Моя ошибка.
Тут есть маленькая хитрость , которую я правда в Вашей инициализации не увидел. Что бы использовать DDRn для переключения SCL Вы должны включить подтягивающий резистор. Делается это записью в нужный бит 1 при условии , что DDRn настроен как вход . В этом случае получается схема с "открытым коллектором" для устройств на шине .
Вот в этом случае Вы можете использовать DDRn для формирования SCL.
0
0 / 0 / 0
Регистрация: 17.01.2014
Сообщений: 38
14.03.2014, 02:29 15
Нет не надо. Моя ошибка.
Тут есть маленькая хитрость , которую я правда в Вашей инициализации не увидел. Что бы использовать DDRn для переключения SCL Вы должны включить подтягивающий резистор. Делается это записью в нужный бит 1 при условии , что DDRn настроен как вход . В этом случае получается схема с "открытым коллектором" для устройств на шине .
Вот в этом случае Вы можете использовать DDRn для формирования SCL.
А зачем нужно включать внутренний подтягивающий резистор? У меня ведь на шине висит уже по одному на каждый провод.
Открытый коллектор? Это значит что коллектор в воздухе? К сожалению, я нубас и не ориентируюсь в таких терминах. (Где можно получить доходчивое обяснение этому?)

Я представляю себе поведение y2s следующим образом:
Так как у меня есть внешние подтягивающие резисторы, то установка значений на шине осуществляется только переключением пина между состояними Sink и Hi-Z. При этом, значение на каждом проводе шины это логическое И от выставляемых на нее значений всех устройств.
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
14.03.2014, 13:21 16
Цитата Сообщение от YTYOUT
Что бы использовать DDRn для переключения SCL Вы должны включить подтягивающий резистор. Делается это записью в нужный бит 1 при условии , что DDRn настроен как вход .
YTYOUT, на шину I2C всегда ставят внешние pullup-резисторы. Reference: любые схемы, какие найдёте.
При этом задействование внутреннего pullup теряет смысл, да ещё и усложняет переключение состояния пина (т.к.при выводе эта "единица в нужном бите" порта даст высокий логический уровень, что в 50% случаев не желательно).
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
14.03.2014, 13:22 17
Цитата Сообщение от rmmk
Я представляю себе поведение y2s следующим образом:
Так как у меня есть внешние подтягивающие резисторы, то установка значений на шине осуществляется только переключением пина между состояними Sink и Hi-Z. При этом, значение на каждом проводе шины это логическое И от выставляемых на нее значений всех устройств.
Да, правильно понимаете.
0
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
14.03.2014, 15:33 18
YTYOUT, на шину I2C всегда ставят внешние pullup-резисторы. Reference: любые схемы, какие найдёте.
При этом задействование внутреннего pullup теряет смысл, да ещё и усложняет переключение состояния пина (т.к.при выводе эта "единица в нужном бите" порта даст высокий логический уровень, что в 50% случаев не желательно).
Да , я имел ввиду при неиспользовании внешнего pull. Но даже если , он подключён , то получается схема с двумя параллельно подключенными резисторами. И влияние на работу схемы не скажется.
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
14.03.2014, 19:54 19
Сопротивление внутренней подтяжки намного выше, чем требуется для I2C. В данном случае (для I2C, TWI) внешний резистор всяко лучше работает.
У меня был случай, когда I2C на ATmega8 не хотел работать с одними внутренними pullupами, а со стандартными внешними заработало ОК, да и код получился проще.
0
0 / 0 / 0
Регистрация: 17.01.2014
Сообщений: 38
20.03.2014, 06:39 20
Проблема частично решена. Построил y2s на Breadboardе, вытащил из Pinboard EEPROM и втыкнул туда. Пришлось исправить одну программную ошибку (я ждал, когда подымется SDA, в то время, когда EEPROM хотела поставить ACK). Теперь все работает, удалось записать и считать значения. Тем не менее, на Pinboard никто не отзывается, и на шине все время остается NACK. В чем может быть проблема?
0
20.03.2014, 06:39
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.03.2014, 06:39
Помогаю со студенческими работами здесь

I2C программатор на базе FT2232D
Потребовалось прошить кучку 24С02, не парясь сразу же к PBII обратился и упёрся - не знаю как. Рою...

PB2, EEPROM, не могу соединиться
Добрый день. С работы не взял ни мультиметра, ни осциллографа. Попробовал связаться STM32 на PB2 с...

i2c, uart, spi sniffer на макетку
Всем привет! Вчера заказал вот такую штуковину:...

USB-преобразователь UART, RS232, I2C, CAN
Давно занимаюсь робототехникой, начинал давно, где-то в 11 классе еще. Всегда интересовала область...

Софтварный I2C под арм ADUC702x
С аппаратным I2C не разобрался. Хотя есть исходник от аналог девайса. Его побывал применить но...

Pinboard2, I2C, правильность соединений (вопросец)
Прикладываю картинку. Для удобства объяснений, все необходимые пины пометил красными цифрами,...

Как происходят сбои во FLASH и EEPROM?
При возникновении сбоев в работе FLASH или EEPROM (я так понимаю, как внутренней, так и внешней)...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru