Собственно, сабж. Процессор - Atmega8. Пока что тактируется от внутренней RC-цепочки. В эмуляторе работает, а в железяке совсем не хочет
Код:
#define EEPROM_BUS_ADDRESS 0xA0
unsigned char eep_read(unsigned char address1, unsigned char address2) { unsigned char data; //переменна¤ дл¤ прочитаных данных i2c_start(); //посылаем команду "старт" в шину i2c i2c_write(EEPROM_BUS_ADDRESS); //посылаем в шину адрес устройства i2c_write(address1); i2c_write(address2); //посылаем в шину адрес читаемой ¤чейки i2c_start(); //снова посылаем "старт" в шину i2c_write(EEPROM_BUS_ADDRESS | 1); //незнаю зачем но без этого не работает data=i2c_read(0); //принимаем данные с лини и сохран¤ем в переменную i2c_stop(); //посылаем команду "стоп" return data; //возврощаем значение прочитаного }
void eep_write(unsigned char address1, unsigned char address2, unsigned char data) { i2c_start(); //посылаем команду "старт" в шину i2c i2c_write(EEPROM_BUS_ADDRESS); //посылаем в шину адрес устройства i2c_write(address1); i2c_write(address2); //посылаем в шину адрес записываемой ¤чейки i2c_write(data); //посылаем данные дл¤ записи i2c_stop(); //посылаем команду "стоп" }
На второй день родилась догадка-вопрос. По даташиту память 16к не имеет адресующих пинов, адрес всегда будет A0.
Но, есть пины, отвечающие за адрес в памяти, так? А как они влияют, я понять пока не смог. Значение этих пинов влияет как-то на адрес ячейки? Если они все замкнуты на землю (==0), то как это повлияет на адрес?
_________________ — Да не боись, всего двенадцать вольт… и восемьсот ампер.
Заголовок сообщения: Re: Работа с внешней eeprom по i2c
Добавлено: Ср окт 25, 2017 13:38:31
Собутыльник Кота
Карма: 29
Рейтинг сообщений: 645
Зарегистрирован: Сб май 14, 2011 21:16:04 Сообщений: 2693 Откуда: г. Чайковский
Рейтинг сообщения:0 Медали: 1
Вы откуда такую картинку взяли? Я такую в ДШ не видел. В ДШ есть пункт что после сброса нужна сделать функцию инициализации. Возможно оно не важно, но лучше соблюсти протокол чтобы потом не думать.
Код:
i2c_write(EEPROM_BUS_ADDRESS); //посылаем в шину адрес устройства i2c_write(address1); i2c_write(address2);
Эти функции посылают три байта? Но ДШ говорит что адресуется данная память двумя байтами. В которые входят 4 бита идентификатора и бит-атрибут записи/чтения.
_________________ Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
]Эти функции посылают три байта? Но ДШ говорит что адресуется данная память двумя байтами. В которые входят 4 бита идентификатора и бит-атрибут записи/чтения.
Действительно, что-то я не так делаю... Если верить диаграмме в даташите,то должно быть так:
Код:
void eep_write(unsigned char address1, unsigned char address2, unsigned char data) { i2c_start(); //посылаем команду "старт" в шину i2c i2c_write(EEPROM_BUS_ADDRESS); //посылаем в шину адрес устройства i2c_write(address1);//адрес ячейки i2c_write(data); //посылаем данные для записи i2c_stop(); //посылаем команду "стоп" }
но так оно не работает в протеусе, продолжает не работать в железе, а еще я не понимаю как передавать адрес ячейки, когда он перевалит за 255?
Z_h_e писал(а):
после сброса нужна сделать функцию инициализации
Ткните, пожалуйста, носом. а то я похоже не понимаю, что есть инициализация
update: флешка 24C16N
_________________ — Да не боись, всего двенадцать вольт… и восемьсот ампер.
Качественное и безопасное устройство, работающее от аккумулятора, должно учитывать его физические и химические свойства, профили заряда и разряда, их изменение во времени и под влиянием различных условий, таких как температура и ток нагрузки. Мы расскажем о литий-ионных аккумуляторных батареях EVE и нескольких решениях от различных китайских компаний, рекомендуемых для разработок приложений с использованием этих АКБ. Представленные в статье китайские аналоги помогут заменить продукцию западных брендов с оптимизацией цены без потери качества.
Заголовок сообщения: Re: Работа с внешней eeprom по i2c
Добавлено: Ср окт 25, 2017 15:11:57
Собутыльник Кота
Карма: 29
Рейтинг сообщений: 645
Зарегистрирован: Сб май 14, 2011 21:16:04 Сообщений: 2693 Откуда: г. Чайковский
Рейтинг сообщения:0 Медали: 1
Сам сейчас долго искал где это я все увидел . Наконец то нашел с помощью истории браузера. Я не на тот чип поглядел ДШ, на 24с16D. Извиняюсь за путаницу.
_________________ Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Заголовок сообщения: Re: Работа с внешней eeprom по i2c
Добавлено: Ср окт 25, 2017 15:54:29
Собутыльник Кота
Карма: 29
Рейтинг сообщений: 645
Зарегистрирован: Сб май 14, 2011 21:16:04 Сообщений: 2693 Откуда: г. Чайковский
Рейтинг сообщения:0 Медали: 1
Но адресация происходит двумя байтами все равно.
WaL97 писал(а):
По даташиту память 16к не имеет адресующих пинов, адрес всегда будет A0. Изображение
Биты P2 P1 P0 - это номер страницы памяти. Можете считать что это старшие биты адреса ячейки памяти. Я так понял, что для памяти 16Кбит, А2 A1 A0 не используются Например Вам нужно записать по адресу 0x254 данные. 1. Формируете старт. 2. Отправляете девайс адрес. 0b10100100 - первые 4 бита идентификатор памяти, следующие 3 номер страницы 2, самый младший признак записи. 3. Отправляете адрес внутри страницы 0x54. 4. Отправляете данные. 5 Формируете стоп. По хорошему надо контролировать ACK. Может Ваши функции уже это делают.
Заголовок сообщения: Re: Работа с внешней eeprom по i2c
Добавлено: Ср окт 25, 2017 16:13:01
Собутыльник Кота
Карма: 29
Рейтинг сообщений: 645
Зарегистрирован: Сб май 14, 2011 21:16:04 Сообщений: 2693 Откуда: г. Чайковский
Рейтинг сообщения:0 Медали: 1
WaL97 писал(а):
как передавать адрес ячейки, когда он перевалит за 255?
С помощью P2 P1 P0
Добавлено after 9 minutes 38 seconds: А вот вариант чтения.
Обратите внимание, что при чтении данных в конце байта данных мастер формирует ACK. Если он равен 1, значит читать дальше не будет и затем формирует стоп. Если надо читать сразу блок данных, то мастер после каждого прочтения байта данных формирует ACK=0, тем самым говорит что хочет еще данных.
Я когда то давно на AVR I2C юзал, но не библиотекой. Управлял регистрами. А Вам наверное надо получше изучить библиотеку. Наверняка там есть готовые функции для всего этого.
Да, я понимаю как оно в теории работает, в принципе у всех и2ц обмен одинаковый, у меня с ними успешно получалось работать на stm32
В общем, проблему решил от проблемы избавился. Поскольку при создании платы подключил флешку к выводам SCL\SDA контроллера, то перешел к "железной" работе с i2c (по TWI). Битик успешно удалось записать и считать, но честно говоря, пока что не влезал внутрь, с целью вникнуть в работу.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 21
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения