Привет!
Sat Jan 06 2007 15:37, Nickita A Startcev wrote to Jurgis Armanavichius:
JA>> Hаиболее очевидный и простой вариант - любая микросхема памяти из JA>> ряда 24CXX на 256 байт. Один в один :-) Суть: передается Старт, байт JA>> адресации (с битом WR), адрес ячейки (т.е. нужный номер регистра), JA>> байт данных (это на запись), Стоп. NAS> то есть, пишем адрес, пишем байт(ы) по этому адресу. NAS> итого, грубо, передается 3 байта.
Первый байт - адрес устройства, с которым мы собрались работать (а также команда: запись/считывание). Далее - грубо говоря, данные. Однако, если нам нужно записать в конкретный регистр (ячейку) данного устройства, то подразумевается, что вторым байтом идет адрес этого регистра (ячейки). Это как раз отлично просматривается в микросхемах памяти. Более того, если ячеек больше 256, то старшие биты номера ячейки тоже передаются (например, если память на 32 или 64 КБ, то для начального адреса ячейки используется уже два байта: второй и третий). Есть и более экзотические случаи, когда старшие биты задвигаются в первый байт (т.е. в байт адреса устройства).
JA>> Hа считывание: Старт, байт JA>> адресации (с битом WR), адрес ячейки, далее повторный Старт, байт JA>> адресации (уже с битом RD), считывается байт данных, Стоп. NAS> то есть, пишем адрес, повторно стартуем, повторно указываем NAS> адрес_устройства, читаем байт(ы) по этому адресу. NAS> Итого, грубо, передается 4 байта.
В общем, да. При этом следует помнить, что адрес ячейки передается только при записи байта (байт) данных. Т.е. при повторном старте считается, что адрес ячейки запомнился во внутреннем регистре микросхемы. Кроме того, применяется автоинкремент этого адреса для последовательного считывания (и записи) данных из микросхемы.
NAS> Итого, при любом обмене первая команда запись адреса, а вторая NAS> действия по этому адресу.
Именно так. Т.е. <адрес устройства с битом RD/WR>, <один или несколько байт адреса ячейки>, <данные>. При этом считается, что считывание всегда производится начиная с _текущего_ адреса ячейки, поэтому для цикла считывания адрес ячейки не передается (если нужно прочитать не из текущего адреса ячейки, то этот адрес задается в предшествующем ему цикле записи, который выполняется не полностью, а прерывается повторным стартом).
NAS> Это стандартизированное поведение? в спеке на и2ц о нем сказано?
Hу так почитай :-) Я дал тебе ссылку на документ. Кроме того, очень хорошо вся эта кухня расписана в I2C-памятях от Atmel.
NAS> Аффтары и2ц не додумались до того, что у одного устройства может NAS> быть более одного 8битного регистра?
Hу так это же и есть в микросхемах памяти! AT24C01 - 128 ячеек (как бы регистров), AT24C02 - 256 ячеек и т.д.
Если рассудить логически, то небольшая избыточность в этой шине нужна для работы с несколькими устройствами, поэтому первым байтом и идет байт адреса устройства. Если регистр в устройстве один - то не надо дополнительного байта номера регистра, т.е. адрес устройства и далее непосредственно данные. А если регистров несколько, то вполне логично передать еще и номер того регистра (вторым байтом после адреса девайса), с которым мы будем взаимодействовать. IMHO, а как иначе?
Юргис