реклама на сайте
подробности

 
 
5 страниц V  « < 2 3 4 5 >  
Reply to this topicStart new topic
> Чтение\запись по SPI
d7d1cd
сообщение Jan 29 2013, 14:07
Сообщение #46


Местный
***

Группа: Участник
Сообщений: 442
Регистрация: 26-11-10
Пользователь №: 61 199



Снова вопрос. Я применяю микросхемы памяти FM25CL64, M95256 и M95128. Все они подключены по схеме, приведенной в начале (за исключением того, что выводы SI и SO соединены вместе). В английском не очень то силен, поэтому с чтением даташитов есть проблемы. Подскажите, пожалуйста, назначение вывода WP и какое значение должно быть на нем в отдельности при чтении из МС и записи в нее?
Go to the top of the page
 
+Quote Post
thodnev
сообщение Jan 30 2013, 18:32
Сообщение #47


Участник
*

Группа: Участник
Сообщений: 44
Регистрация: 20-01-13
Из: Украина, Киев
Пользователь №: 75 259



Кхм, мне в голову пришел один дебильный вариант. Можно ведь использовать код, полученный в результате дизассемблирования.
Go to the top of the page
 
+Quote Post
d7d1cd
сообщение Feb 3 2013, 16:39
Сообщение #48


Местный
***

Группа: Участник
Сообщений: 442
Регистрация: 26-11-10
Пользователь №: 61 199



Можно использовать, но при разборе оного вопросов возникает еще больше.
Go to the top of the page
 
+Quote Post
d7d1cd
сообщение Feb 5 2013, 17:28
Сообщение #49


Местный
***

Группа: Участник
Сообщений: 442
Регистрация: 26-11-10
Пользователь №: 61 199



Цитата(d7d1cd @ Jan 29 2013, 18:07) *
Снова вопрос. Я применяю микросхемы памяти FM25CL64, M95256 и M95128. Все они подключены по схеме, приведенной в начале (за исключением того, что выводы SI и SO соединены вместе). В английском не очень то силен, поэтому с чтением даташитов есть проблемы. Подскажите, пожалуйста, назначение вывода WP и какое значение должно быть на нем в отдельности при чтении из МС и записи в нее?

Вроде разобрался, что значение пина WP при чтении не имеет значения, а при записи должен быть равен 1.

Go to the top of the page
 
+Quote Post
d7d1cd
сообщение Mar 6 2013, 17:55
Сообщение #50


Местный
***

Группа: Участник
Сообщений: 442
Регистрация: 26-11-10
Пользователь №: 61 199



Возвращаюсь к теме. Чтение из памяти по протоколу SPI я реализовал. Теперь мне необходимо реализовать запись. И тут возник вопрос.
Прежде чем отправить в МС оп-код на запись, необходимо отправить в нее оп-код Write Enable Latch, а потом, возможно, необходимо записать регистр статуса, чтобы снять блокировку записи. Вопрос в чем: если я выбрал МС, отправил оп-код WREN, после этого необходимо снимать выбор с МС или же можно дальше отправлять WRSR?
Go to the top of the page
 
+Quote Post
rezident
сообщение Mar 6 2013, 19:03
Сообщение #51


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(d7d1cd @ Mar 6 2013, 22:55) *
Теперь мне необходимо реализовать запись. И тут возник вопрос.

Ответ на ваш вопрос есть в моем сообщении полугодовой давности #44.
Go to the top of the page
 
+Quote Post
d7d1cd
сообщение Mar 7 2013, 02:42
Сообщение #52


Местный
***

Группа: Участник
Сообщений: 442
Регистрация: 26-11-10
Пользователь №: 61 199



rezident, из Вашего ответа я понял, что перед отправкой любого оп-кода необходимо сигнализировать микросхеме, что ей отправляется новая команда (оп-код). Сигналом служит изменение уровня на CS с высокого на низкий. Спасибо за напоминание!
Go to the top of the page
 
+Quote Post
d7d1cd
сообщение Mar 11 2013, 14:31
Сообщение #53


Местный
***

Группа: Участник
Сообщений: 442
Регистрация: 26-11-10
Пользователь №: 61 199



Возник такой вопрос: с какой целью создана команда WRDI, то есть включение запрета на запись? Ведь после отправки команды WREN следует либо команда на запись регистра статуса (WRSR), либо запись в память (WRITE) (для этого команда WREN и отправлялась). А после завершения команд WRSR или WRITE запрет на запись включается автоматически.
Go to the top of the page
 
+Quote Post
rezident
сообщение Mar 11 2013, 16:30
Сообщение #54


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(d7d1cd @ Mar 11 2013, 19:31) *
Ведь после отправки команды WREN следует либо команда на запись регистра статуса (WRSR), либо запись в память (WRITE)

Не следует, а может следовать. А может и не следовать. Это же программный алгоритм, а не аппаратный. Вот для того, чтобы можно было безопасно прочитать после разрешения записи и нужна команда, отменяющая это разрешение.
Go to the top of the page
 
+Quote Post
d7d1cd
сообщение Mar 11 2013, 16:37
Сообщение #55


Местный
***

Группа: Участник
Сообщений: 442
Регистрация: 26-11-10
Пользователь №: 61 199



Цитата(rezident @ Mar 11 2013, 20:30) *
Не следует, а может следовать. А может и не следовать. Это же программный алгоритм, а не аппаратный. Вот для того, чтобы можно было безопасно прочитать после разрешения записи и нужна команда, отменяющая это разрешение.


Теперь у меня 2 вопроса:

1. Что значит программный алгоритм? Разве не я определяю какая команда за какой будет идти?
2. Если я разрешил запись, то я не могу прочитать память? Обязательно надо отменять разрешение записи?

Сообщение отредактировал d7d1cd - Mar 11 2013, 16:37
Go to the top of the page
 
+Quote Post
rezident
сообщение Mar 12 2013, 09:35
Сообщение #56


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(d7d1cd @ Mar 11 2013, 21:37) *
1. Что значит программный алгоритм? Разве не я определяю какая команда за какой будет идти?
Именно это и означает программный алгоритм. Вот если бы для записи требовалось последовательно передать WREN и WRITE и никак иначе, то это был бы аппаратный алгоритм. А так вслед за WREN вы можете и не передавать WRITE.
Цитата(d7d1cd @ Mar 11 2013, 21:37) *
2. Если я разрешил запись, то я не могу прочитать память? Обязательно надо отменять разрешение записи?
Я же написал - безопасное чтение. Можете не отменять, но возможность неразрушающего чтения не гарантируется.
Я вообще вашей заморочки не понимаю. Ну есть команда отменяющая разрешение записи. Чем она вас не устраивает-то? Это же полностью логично - разрешить запись и отменить разрешение. Что вас смущает? Если устройство выполняет, например, функции логгирования, то вполне возможна ситуация, когда от разных процессов поступают запросы на чтение и на запись одновременно. Причем чтение информации обычно процесс более приоритетный. В частности вот для такого случая и нужна команда отмены разрешения записи.
Go to the top of the page
 
+Quote Post
d7d1cd
сообщение Mar 12 2013, 16:57
Сообщение #57


Местный
***

Группа: Участник
Сообщений: 442
Регистрация: 26-11-10
Пользователь №: 61 199



Понял вас, rezident! Можете же грамотно пояснить! Спасибо.

Итак, запись... Моя схема подключения микросхем памяти (МП) к микроконтроллеру приведена в начале топика, за исключением того, что выводы МП SI и SO соединены вместе. Функцию чтения из МП я написал. В этой функции через параметры передаются из какой МП читать, по какому адресу, сколько байт, а так же указывается адрес в ОЗУ, куда надо поместить прочитанные байты. Тестирование этой функции показало, что работает она правильно, то есть читает байты из любой МП по любому (доступному в МП) адресу.

Далее я написал функцию записи. По аналогии с функцией чтения в ее параметрах указывается в какую МП писать, по какому адресу, сколько байт и указывается адрес, откуда брать байты для записи. Однако тестирование показало следующее: запись в МП D7 происходит успешно, а вот в D8 и D9 запись не производится вообще.

В функции записи и в функции чтения используются одни и те же подпрограммы отправки и чтения одного байта. То есть, как я полагаю, на них грешить не следует, ведь в функции чтения они работают. Кроме того, запись МП D7 происходит успешно.

Подскажите, пожалуйста, в чем может быть причина отказа в записи МП D8 и D9.

P.S. D7 - FM25CL64, D8 - M95256, D9 - M95512
P.S.S Все МП исправны: программатором запись и чтение проходят на ура.

Сообщение отредактировал d7d1cd - Mar 12 2013, 17:01
Go to the top of the page
 
+Quote Post
rezident
сообщение Mar 13 2013, 09:56
Сообщение #58


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Вы бы для начала выложили наконец корректную схему подключения. Ибо еще в начале топика выяснили, что схема из вашего корневого сообщения не соответствует реальности.
Go to the top of the page
 
+Quote Post
d7d1cd
сообщение Mar 13 2013, 14:49
Сообщение #59


Местный
***

Группа: Участник
Сообщений: 442
Регистрация: 26-11-10
Пользователь №: 61 199



Цитата(rezident @ Mar 13 2013, 13:56) *
Вы бы для начала выложили наконец корректную схему подключения. Ибо еще в начале топика выяснили, что схема из вашего корневого сообщения не соответствует реальности.


Понял. Вот корректная схема:




Go to the top of the page
 
+Quote Post
rezident
сообщение Mar 13 2013, 15:43
Сообщение #60


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Сигналами CS, надеюсь, при записи в разные кристаллы вы разными управляете?
Основное отличие FM25CL64 от M95xxx в том, что первая м/с это FRAM, а остальные это EEPROM. FRAM не требует циклов ожидания, т.к. у памяти FRAM запись происходит при каждом обращении к ней. Даже при чтении содержимого FRAM происходит перезапись считываемой информации. У м/с EEPROM же запись может происходить только небольшими блоками. Т.е. вначале данные попадают в буфер и только после дезактивации CS включается генератор стирания/записи и происходит запись. Для M95256 буфер размером 64 байта, для M95512 буфер - 128 байт.
Поэтому, во-первых, перед записью нужно проверять готовность EEPROM к записи путем чтения регистра статуса и проверки битов WEL (1 - когда выполнена команда WREN и запись разрешена, 0 - запись запрещена) и WIP (1 - когда идет процесс записи и новую запись делать нельзя, 0 - когда запись возможна).
Во-вторых, адресация внутри буфера осуществляется счетчиком ограниченной разрядности (64 байта - 6-битный счетчик, 128 байт - 7-битный счетчик). Поэтому при записи блока нужно выравнивать размер записи на границу размера буфера. Иначе происходит переполнение счетчика и запись в буфер происходит по кольцу. Для вычисления адреса начала буфера достаточно адрес начала записи поделить, а затем умножить на размер буфера (или наложить маску той же размерности, что и размер буфера). Соответственно для вычисления адреса конца буфера нужно прибавить к адресу начала буфера его размер.

Пример.
Пускай буфер у нас будет всего 4 байта. Нам нужно записать 6 байт (0x01, 0x02, 0x03, 0x04, 0x05, 0x06) в "чистую" м/с EEPROM (заполнена 0xFF), начиная с адреса 0x0003.
Предполагаем, что после записи содержимое должно быть таким
0x0000 0xFF
0x0001 0xFF
0x0002 0xFF
0x0003 0x01
0x0004 0x02
0x0005 0x03
0x0006 0x04
0x0007 0x05
0x0008 0x06
0x0009 0xFF
0x000A 0xFF
Если будем писать сразу 6 байт, то получится переполнение буфера и запись будет такая
0x0000 0x06
0x0001 0x03
0x0002 0x04
0x0003 0x05
0x0004 0xFF
0x0005 0xFF
0x0006 0xFF
0x0007 0xFF
0x0008 0xFF
0x0009 0xFF
0x000A 0xFF
Если сократим запись до размера буфера (4 байта), то все равно будет нарушение записи
0x0000 0x02
0x0001 0x03
0x0002 0x04
0x0003 0x01
0x0004 0xFF
0x0005 0xFF
0x0006 0xFF
0x0007 0xFF
0x0008 0xFF
0x0009 0xFF
0x000A 0xFF
Корректная запись будет только, если мы разобьем запись на три блока
первая запись с начального адреса 0x0003 0x01 (1 байт, запись выравнена по концу буфера на его размер, адресация буфера 0x0000-0x0003)
вторая запись с начального адреса 0x0004 0x02 0x03 0x04 0x05 (4 байта, запись выравнена на полный размер буфера, адресация буфера 0x0004-0x0007)
третья запись с начального адреса 0x0008 0x06 (1 байт, запись выравнена по началу буфера, адресация буфера 0x0008-0x000B)
Резюмируя.
1) перед записью нужно проверять готовность м/с к записи.
2) при записи нужно ограничивать количество байт данных так, чтобы не произошел переход адреса (переполнение счетчика буфера) через конец буфера в его начало.
Go to the top of the page
 
+Quote Post

5 страниц V  « < 2 3 4 5 >
Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 28th June 2025 - 05:31
Рейтинг@Mail.ru


Страница сгенерированна за 0.0146 секунд с 7
ELECTRONIX ©2004-2016