0 / 0 / 0
Регистрация: 17.01.2014
Сообщений: 38
|
|
1 | |
i2c & eeprom08.03.2014, 20:35. Показов 15051. Ответов 27
Метки нет (Все метки)
Здравствуйте.
Предпринял попытку ознакомиться с y2s. Прочитал здесь статьи про y2s, решил написать кусок кода для работы c встроенным в плату eeprom. https://gist.github.som/rmmk/86cbd56270eb316552df. Все это происходит на pinboard 2 с модулем avr8. На начале файла код для дебажных выводов на сегментный индикатор, он всегда показывает 0x0f, то есть, никто не устанавливает 0 на SDA после каждой записи. 4 тумблера возле eeprom установлены в OFF (вниз). Пины PC4 и PC5 подсоединил к выводам SDA и SCL модуля микроконтроллера. Не вижу, где я ошибся. Укажите, пожалуйста, на ошибку.
0
|
08.03.2014, 20:35 | |
Ответы с готовыми решениями:
27
Программатор eeprom I2C на pinboard? Конвертер i2c в usb - MIKROE-1421, FTDI click USB 2.0 to I2C для ПК AtmelStudio 6.0 - сохранение EEPROM JTAG ICE и EEPROM |
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
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); }
0
|
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
|
|
12.03.2014, 16:35 | 10 |
Сообщение от YTYOUT
... ... 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
Но дело в том, что EEPROM серии 24xx спокойно работают на частотах 400 кГц и выше, в то время как скорость программного I2C на AVR вряд ли удастся получить выше 100 килобит/сек. Ладно, чтобы не думалось :-) - манипулируйте SCL через DDR.
0
|
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
|
|
14.03.2014, 00:41 | 14 |
Тут есть маленькая хитрость , которую я правда в Вашей инициализации не увидел. Что бы использовать DDRn для переключения SCL Вы должны включить подтягивающий резистор. Делается это записью в нужный бит 1 при условии , что DDRn настроен как вход . В этом случае получается схема с "открытым коллектором" для устройств на шине . Вот в этом случае Вы можете использовать DDRn для формирования SCL.
0
|
0 / 0 / 0
Регистрация: 17.01.2014
Сообщений: 38
|
|
14.03.2014, 02:29 | 15 |
Открытый коллектор? Это значит что коллектор в воздухе? К сожалению, я нубас и не ориентируюсь в таких терминах. (Где можно получить доходчивое обяснение этому?) Я представляю себе поведение y2s следующим образом: Так как у меня есть внешние подтягивающие резисторы, то установка значений на шине осуществляется только переключением пина между состояними Sink и Hi-Z. При этом, значение на каждом проводе шины это логическое И от выставляемых на нее значений всех устройств.
0
|
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
|
|
14.03.2014, 13:21 | 16 |
Сообщение от YTYOUT
При этом задействование внутреннего pullup теряет смысл, да ещё и усложняет переключение состояния пина (т.к.при выводе эта "единица в нужном бите" порта даст высокий логический уровень, что в 50% случаев не желательно).
0
|
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
|
|
14.03.2014, 13:22 | 17 |
Сообщение от rmmk
0
|
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
|
|
14.03.2014, 15:33 | 18 |
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 | |
20.03.2014, 06:39 | |
Помогаю со студенческими работами здесь
20
I2C программатор на базе FT2232D PB2, EEPROM, не могу соединиться i2c, uart, spi sniffer на макетку USB-преобразователь UART, RS232, I2C, CAN Софтварный I2C под арм ADUC702x Pinboard2, I2C, правильность соединений (вопросец) Как происходят сбои во FLASH и EEPROM? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |