d7d1cd
Jul 26 2012, 14:36
Привет всем! У меня в устройстве микроконтроллер MSP430F149, к которому подключены 3 микросхемы памяти (для четвертой есть место, но она сама отсутствует). Схему подключения привожу ниже.
Моя задача написать функцию чтения\записи одного байта информации из любой микросхемы по любому адресу. Основная проблема в том, что функцию надо написать на ассемблере. Думаю, что подобную функцию, написанную на С, перевести на ассемблер проблем не составит.
Подскажите, пожалуйста, с чего мне начать?
ut1wpr
Jul 26 2012, 15:47
Цитата(d7d1cd @ Jul 26 2012, 17:36)
Привет всем! У меня в устройстве микроконтроллер MSP430F149, к которому подключены 3 микросхемы памяти (для четвертой есть место, но она сама отсутствует). Схему подключения привожу ниже.
Моя задача написать функцию чтения\записи одного байта информации из любой микросхемы по любому адресу. Основная проблема в том, что функцию надо написать на ассемблере. Думаю, что подобную функцию, написанную на С, перевести на ассемблер проблем не составит.
Подскажите, пожалуйста, с чего мне начать?
1. С чтения ДШ на память XX-YY-zzz.
2. Чтение ДШ на МК MSP430F149.
3. Чтение описания протокола I2C.
4. После изучения (а не только прочтения) пп 2 и 3 реализовать протокол.
п.4 можно заменить рытьем и нытьем на форумах. Смотря какая цель преследуется.
Если сдать курсак назавтра и забыть, вариант выпросить-упросить написать наиболее предпочтителен.
Тут уж не до самолюбия.
А если действительно научится - тут уж никуда не денешься. Все три пункта по порядку...
PS Не совсем понятно по тексту поста, для кого перевод с Си на АСМ не составит проблем? Для топикстартера? Или это не вопрос а утверждение? Знака вопроса нет, значит ТС это утверждает. Так?
d7d1cd
Jul 26 2012, 16:20
Я конечно понимаю, что вы ошиблись, но 3 пункт здесь вообще не к месту. Изучаем протокол SPI. Это первое. Второе - это то, что мне надо именно научиться. Третье: да, я утверждаю, что перевод с С на АСМ - не проблема (по крайней мере это намного проще, чем перевести с АСМ на С).
На счет "рытья и нытья на форумах": скажите, а зачем же еще нужны форумы? Вы предлагаете тупо сидеть, читать ДШ, экспериментировать раз за разом и ни у кого ничего не спрашивать?
Ладно, все это не по теме. Я почитал описание протокола SPI. Понял как выбрать микросхему, с которой работать. Понял принцип отправки\получения данных. Не понятно как задать адрес, с которого производить чтение\запись.
_Артём_
Jul 26 2012, 16:34
Цитата(d7d1cd @ Jul 26 2012, 19:20)
перевод с С на АСМ - не проблема
Может это и не проблеиа, но наверняка напрасный труд. Зачем перевод нужен?
Цитата(d7d1cd @ Jul 26 2012, 19:20)
Не понятно как задать адрес, с которого производить чтение\запись.
Для того чтобы ответить на этот вопрос нужно знать тип микросхемы памяти и посмотреть соответствующую команды в ДШ.
Или угадать прикажете?
d7d1cd
Jul 26 2012, 16:48
Чтобы труд не был напрасным, буду сразу писать на АСМ. Можно я не буду говорить зачем мне такой геморрой?
Микросхема памяти, используемая в устройстве - FM25CL64.
И еще вопрос: при указанном подключении, можно ли использовать для чтения\записи какую-то периферию микроконтроллера? Я, по крайней мере, такой не нашел. Может все из-за неопытности...
_Артём_
Jul 26 2012, 17:05
Цитата(d7d1cd @ Jul 26 2012, 19:48)
Чтобы труд не был напрасным, буду сразу писать на АСМ. Можно я не буду говорить зачем мне такой геморрой?
Геморой - дело добровольное. Да и место Сизифа всегда вакантно.
Цитата(d7d1cd @ Jul 26 2012, 19:48)
Микросхема памяти, используемая в устройстве - FM25CL64.
А что не ясно то?
Чтение
CS=0
SendByte(0x03)
SendByte(addr/256) - посылка старшего байта адреса
SendByte(255) - посылка младшего байта адреса
ReadByte() сколько нужно раз
CS=1
Цитата(d7d1cd @ Jul 26 2012, 19:48)
И еще вопрос: при указанном подключении, можно ли использовать для чтения\записи какую-то периферию микроконтроллера?
Обычно для чтения\записи по SPI-интерфейсу используется SPI-периферия МК. Или это может быть USART в spi-режиме. Или программная эмуляция spi. Смотрите в ДШ на МК.
rezident
Jul 26 2012, 21:02
Цитата(d7d1cd @ Jul 26 2012, 21:48)
Микросхема памяти, используемая в устройстве - FM25CL64.
И еще вопрос: при указанном подключении, можно ли использовать для чтения\записи какую-то периферию микроконтроллера?
При
указанном подключении - нет. Для использования аппаратных возможностей MSP430, м/с SPI должны быть подключены к пинам МК, на которые выведены функции USART0 или USART1. USART нужно настроить для использования в режиме SPI. Подключение следующее
FM25CL64 --- MSP430F149IPW
=======================
CS --- любой пин GPIO
SO --- SOMIx
WP --- любой пин GPIO
SI --- SIMOx
SCL --- UCLKx
HOLD --- любой пин GPIO или подключить к VCC, как в вашей схеме
d7d1cd
Jul 27 2012, 02:56
К сожалению, схему подключения переделать нельзя. Придется "общаться" с микросхемами при существующем подключении, и реализовывать весь алгоритм "общения" "ручками". Что называется - программно реализовывать. Буду изучать ДШ микросхем памяти пока.
d7d1cd
Jul 27 2012, 16:20
Поизучал ДШ. Возник вопрос по режимам SPI. Сказано, что микросхема FM25CL64 поддерживает 2 режима: 0 и 3. А как выбрать тот или иной режим? Или я что-то недопонимаю?
И еще: выборка и установка данных обязательно должна происходить только во время смены одного уровня сигнала тактирования на другой или можно сменить уровень сигнала тактирования, сделать выборку (или установку) данных, снова сменить уровень сигнала, снова сделать выборку (установку) данных...
_Артём_
Jul 27 2012, 17:25
Цитата(d7d1cd @ Jul 27 2012, 19:20)
Возник вопрос по режимам SPI. Сказано, что микросхема FM25CL64 поддерживает 2 режима: 0 и 3. А как выбрать тот или иной режим?
Выбрать волевым решением.
Какой это будет режим 0 или 3, FM25 сам разберёт.
Цитата(d7d1cd @ Jul 27 2012, 19:20)
И еще: выборка и установка данных обязательно должна происходить только во время смены одного уровня сигнала тактирования на другой или можно сменить уровень сигнала тактирования, сделать выборку (или установку) данных, снова сменить уровень сигнала, снова сделать выборку (установку) данных...
Посмотрите по
ссылке..
Всё достаточно понятно, тем более вы реализуета spi-master, значит сами выбираете скорость тактирования.
d7d1cd
Jul 28 2012, 04:44
Ссылку я и ранее читал. Сейчас более подробно изучил временные диаграммы цикла синхронизации. Допустим, я волевым решением выбираю режим 0. Установку делаю так:
1. Изначально устанавливаю низкий уровень сигнала (НУС) на входе SCK (так сказать инициализация, так как неизвестно какой там был уровень сигнала). Думаю, что при этом на входе SI должен быть высокий уровень сигнала (ВУС), так как если до этого SCK имел ВУС, то, согласно режима 0 произойдет установка бита, который был в это время на входе SI. А так как любое "общение" начинается с отправки оп-кода (который, в свою очередь, всегда начинается с НУС), то начало "общения", начавшееся с ВУС, проигнорируется микросхемой.
2. Устанавливаю ВУС на входе SCK.
3. Устанавливаю на входе SI необходимый уровень установки (бит, который надо записать).
4. Устанавливаю НУС на входе SCK (то есть, по сути, произвожу запись бита в микросхему).
5. Если необходимо продолжить запись, перехожу к пункту 2.
Скажите, мой алгоритм правильный?
_Артём_
Jul 28 2012, 12:21
Цитата(d7d1cd @ Jul 28 2012, 07:44)
Скажите, мой алгоритм правильный?
Нет.
Цитата(d7d1cd @ Jul 28 2012, 07:44)
2. Устанавливаю ВУС на входе SCK.
3. Устанавливаю на входе SI необходимый уровень установки (бит, который надо записать).
4. Устанавливаю НУС на входе SCK (то есть, по сути, произвожу запись бита в микросхему).
По рисункам по ссылке и по даташиту видно что запись данных в режиме 0 происходит по фронту сигнала SCK, а установка сигнала SI происходит по срезу SCK.
То есть так:
Цитата
3. Устанавливаю на входе SI необходимый уровень установки (бит, который надо записать).
2. Устанавливаю ВУС на входе SCK(то есть, по сути, произвожу запись бита в микросхему).
4. Устанавливаю НУС на входе SCK .
5. Если необходимо продолжить запись, перехожу к пункту 2.
d7d1cd
Jul 28 2012, 12:57
Цитата(_Артём_ @ Jul 28 2012, 16:21)
То есть так:
3. Устанавливаю на входе SI необходимый уровень установки (бит, который надо записать).
2. Устанавливаю ВУС на входе SCK(то есть, по сути, произвожу запись бита в микросхему).
4. Устанавливаю НУС на входе SCK .
5. Если необходимо продолжить запись, перехожу к пункту 2.
А если до начала всех действий на входе SCK уже будет ВУС? Тогда все равно все будет правильно работать?
P.S. И, наверное, тогда все будет выглядеть так:
Код
1. Устанавливаю на входе SI необходимый уровень установки (бит, который надо записать).
2. Устанавливаю ВУС на входе SCK.
3. Устанавливаю НУС на входе SCK .
4. Если необходимо продолжить запись, перехожу к пункту 1.
_Артём_
Jul 28 2012, 13:04
Цитата(d7d1cd @ Jul 28 2012, 15:57)
А если до начала всех действий на входе SCK уже будет ВУС? Тогда все равно все будет правильно работать?
Наверное будет работать.
Но откуда там взяться 1? Сигнал на SCK формирует ваша программа. Вот и обеспечте правильную диаграмму:
Обмен начинается с SCK=0 (пишу только по SCK)
Обмен заканчивается срезом по выводе SCK.
d7d1cd
Jul 28 2012, 13:26
Спасибо за помощь. Еще такой момент: после отправки в микросхему памяти оп-кода на чтение, я начинаю считывать данные. Алгоритм должен быть такой?
...
1. Устанавливаю на входе SI уровень последнего бита адреса чтения;
2. Устанавливаю ВУС на входе SCK;
3. Устанавливаю НУС на входе SCK ;
4. Считываю с SO первый бит байта, адрес которого был в оп-коде;
5. Если необходимо продолжить чтение, переходим к пункту 2.
_Артём_
Jul 28 2012, 13:44
Цитата(d7d1cd @ Jul 28 2012, 16:26)
Еще такой момент: после отправки в микросхему памяти оп-кода на чтение, я начинаю считывать данные
Адрес не забудьте.
Цитата(d7d1cd @ Jul 28 2012, 16:26)
Алгоритм должен быть такой?
Не совсем: в режиме 0 чтение происходит по фронту SCK.
Цитата(d7d1cd @ Jul 28 2012, 16:26)
...
1. Устанавливаю НУС на входе SCK ;
2. Устанавливаю ВУС на входе SCK;
4. Считываю с SO первый бит байта, адрес которого был в оп-коде;
3. Устанавливаю НУС на входе SCK ;
5. Если необходимо продолжить чтение, переходим к пункту 2.
d7d1cd
Jul 29 2012, 12:42
Хочу изложить то, что я выяснил и понял как сделать (думаю, что я прав).
Первое относится к вопросу об изначальном уровне сигнала на входе SCK. Ведь можно сначала установить НУС на входе SCK, а только потом выбрать нужную микросхему (установить НУС на входе CS нужного чипа).
Второе это то, что я изучил дизасм программы, которая гарантированно производит запись в микросхемы. Из нее я выделил процедуру отправки байта в любую микросхему. Причем неважно какой это байт - оп-код, адрес или данные. Привожу его код:
Код
Регистр R4 хранит номер микросхемы, с которой происходит работа.
R4 = 0x08 - микросхема D7;
R4 = 0x04 - микросхема D8;
R4 = 0x02 - микросхема D9;
R4 = 0x01 - микросхема D10.
Регистр R5 хранит адрес регистра PxOUT (R5 = 0x29)
Регистр R8 хранит байт, который надо отправить в микросхему
902C F0D04000FA6F BIS.B #0040,002A Переключаем пин P2.6, соединенный с пинами SI микросхем памяти, на вывод
9032 C5C40000 BIC.B R4,0000(R5) Выбираем микросхему для работы с ней
9036 8810 SWPB R8
9038 7742 MOV.B #8,R7 Устанавливаем счетчик цикла на 8 раз
903A F0C08000EB6F BIC.B #0080,0029 Устанавливаем низкий уровень сигнала на пине P2.7 (вход SCK микросхем памяти)
9040 0858 ADD R8,R8
9042 0428 JNC 904C Если очередной бит байта, который надо записать, низкого уровня, то переходим к адресу 0x904C
9044 F0D04000E16F BIS.B #0040,0029 Устанавливаем высокий уровень сигнала на пине P2.6 (вход SI микросхем)
904A 033C JMP 9052 Переходим к адресу 0x9052
904C F0C04000D96F BIC.B #0040,0029 Устанавливаем низкий уровень сигнала на пине P2.6 (вход SI микросхем)
9052 0343 NOP
9054 F0D08000D16F BIS.B #0080,0029 Устанавливаем высокий уровень сигнала на пине P2.7 (вход SCK микросхем памяти)
905A 1783 SUB #1,R7 Если цикл передачи байта не закончился, то...
905C EE23 JNZ 903A ...переходим к адресу 0x903A
905E F0C04000C86F BIC.B #0040,002A Переключаем пин P2.6, соединенный с пинами SI микросхем памяти, на ввод
9064 F0C08000C16F BIC.B #0080,0029 Устанавливаем низкий уровень сигнала на пине P2.7 (вход SCK микросхем памяти)
906A 3041 RET Выходим из подпрограммы
Из первого и второго я понял, что мой алгоритм должен быть таким:
1. Устанавливаю НУС на входе SCK;
2. Устанавливаю НУС на входе CS той микросхемы, с которой хочу работать;
3. Устанавливаю на входе SI необходимый уровень установки (бит, который надо записать);
4. Выполняем команду NOP (вот это не знаю зачем...);
5. Устанавливаю ВУС на входе SCK;
6. Устанавливаю НУС на входе SCK;
7. Если необходимо продолжить запись, переходим к пункту 3.
Хотелось бы услышать ваши комментарии ко всему этому...
_Артём_
Jul 29 2012, 16:01
Цитата(d7d1cd @ Jul 29 2012, 15:42)
Ведь можно сначала установить НУС на входе SCK, а только потом выбрать нужную микросхему (установить НУС на входе CS нужного чипа).
Да, так можно.
Цитата(d7d1cd @ Jul 29 2012, 15:42)
Из нее я выделил процедуру отправки байта в любую микросхему. Причем неважно какой это байт - оп-код, адрес или данные.
Да - выделите отдельную функцию для посылки байта и для приёма.
Цитата(d7d1cd @ Jul 29 2012, 15:42)
1. Устанавливаю НУС на входе SCK;
2. Устанавливаю НУС на входе CS той микросхемы, с которой хочу работать;
3. Устанавливаю на входе SI необходимый уровень установки (бит, который надо записать);
4. Выполняем команду NOP (вот это не знаю зачем...);
5. Устанавливаю ВУС на входе SCK;
6. Устанавливаю НУС на входе SCK;
7. Если необходимо продолжить запись, переходим к пункту 3.
Так она может и выглядеть (только CS ни причём).
NOP - просто пауза, чтобы не слишком быстро.
d7d1cd
Jul 29 2012, 16:42
Цитата(_Артём_ @ Jul 29 2012, 20:01)
NOP - просто пауза, чтобы не слишком быстро.
А зачем замедлять? Мне кажется, что это необходимо для гарантированной установки уровня сигнала на SI.
Как видно из схемы, все микросхемы памяти своим выводом WP подсоединены к микроконтроллеру. Что необходимо делать с уровнем сигнала для записи или чтения информации?
И еще: правильно ли я понял, что оп-код WREN надо отправлять только если я хочу записать данные? Если же хочу прочитать, то его отправлять не надо? То есть запись делаю так:
1. Отправляю WREN;
2. Отправляю WRITE;
3. Отправляю адрес записи;
4. Отправляю байты для записи.
Чтение так:
1. Отправляю READ;
2. Отправляю адрес чтения;
3. Читаю байты.
d7d1cd
Sep 29 2012, 14:54
Подошел к необходимости работать с микросхемой памяти. Для чтения, например, необходимо сначала выбрать микросхему (установить низкий уровень сигнала на входе CS микросхемы), отправить в микросхему оп-код на чтение, потом отправить байты адреса, а потом, тактируя микросхему, считывать из нее данные по отправленному адресу. У меня такие вопросы:
1. Если я отправил оп-код, отправил байты адреса для чтения, а потом какое то время не считываю данные из микросхемы, то сколько времени можно ждать, а потом начать считывать данные, чтобы данные начали считываться именно с того адреса, который был отправлен изначально?
2. Если отправить оп-код, а потом установить на входе CS высокий уровень сигнала, то "задание" оп-кода будет утеряно?
_Артём_
Sep 29 2012, 15:33
Цитата(d7d1cd @ Sep 29 2012, 17:54)
Подошел к необходимости работать с микросхемой памяти.
С какой именно? Они разные.
Цитата(d7d1cd @ Sep 29 2012, 17:54)
1. Если я отправил оп-код, отправил байты адреса для чтения, а потом какое то время не считываю данные из микросхемы, то сколько времени можно ждать, а потом начать считывать данные, чтобы данные начали считываться именно с того адреса, который был отправлен изначально?
SPI - синхронный протокол - можно ставить практически любые задержки.
Цитата(d7d1cd @ Sep 29 2012, 17:54)
2. Если отправить оп-код, а потом установить на входе CS высокий уровень сигнала, то "задание" оп-кода будет утеряно?
Как правило да - будет утеряно.
d7d1cd
Sep 29 2012, 17:19
Работать планируется с микросхемой M95256. Изучив даташит, выяснил что запись в микросхему происходит не мгновенно. Ее окончание необходимо проверять по биту WIP. Получается, что перед каждой записью необходимо проверять, сброшен ли этот бит? И еще вопрос: если мне нужно произвести запись не одного байта, а нескольких, то готовность микросхемы к записи надо проверять после отправки каждого байта?
_Артём_
Sep 29 2012, 17:28
Цитата(d7d1cd @ Sep 29 2012, 20:19)
Получается, что перед каждой записью необходимо проверять, сброшен ли этот бит?
Это уже от вашего алгоритма зависит: может лучше после записи проверять или вообще не проверять.
Цитата(d7d1cd @ Sep 29 2012, 20:19)
И еще вопрос: если мне нужно произвести запись не одного байта, а нескольких, то готовность микросхемы к записи надо проверять после отправки каждого байта?
Думаю, что нет. Но нужно использовать соотв. команду (Page Write).
d7d1cd
Sep 29 2012, 17:42
Ну вообще не проверять я думаю не правильно. Вдруг запись внутри микросхемы еще идет (бит WIP установлен), а я без проверки попытаюсь записать туда еще данные.
И еще такой момент: что если программа, например, отправила оп-код на запись, отправила адрес записи и в этот момент произошло прерывание в котором делается попытка чтения из этой же микросхемы. Получится так, что прерывание отправит оп-код на чтение, отправит адрес, но так как ранее уже был отправлен оп-код на запись, то микросхема все это запишет в память. Как избавиться от таких накладок?
_Артём_
Sep 29 2012, 17:53
Цитата(d7d1cd @ Sep 29 2012, 20:42)
И еще такой момент: что если программа, например, отправила оп-код на запись, отправила адрес записи и в этот момент произошло прерывание в котором делается попытка чтения из этой же микросхемы. Получится так, что прерывание отправит оп-код на чтение, отправит адрес, но так как ранее уже был отправлен оп-код на запись, то микросхема все это запишет в память. Как избавиться от таких накладок?
Разграничивайте доступ к ресурсам. Используйте Mutex и тому подобное.
d7d1cd
Sep 30 2012, 05:46
Цитата(_Артём_ @ Sep 29 2012, 21:53)
Разграничивайте доступ к ресурсам. Используйте Mutex и тому подобное.
Думаю, что при работе функций записи и чтения микросхем памяти вне прерываний, необходимо запрещать прерывания.
_Артём_
Sep 30 2012, 13:30
Цитата(d7d1cd @ Sep 30 2012, 08:46)
Думаю, что при работе функций записи и чтения микросхем памяти вне прерываний, необходимо запрещать прерывания.
Не лучшая идея.
Зачем делать чтение-запись в разных местах? Да ещё и с запретом прерываний.
d7d1cd
Sep 30 2012, 15:06
Цитата(_Артём_ @ Sep 30 2012, 17:30)
Не лучшая идея.
Зачем делать чтение-запись в разных местах? Да ещё и с запретом прерываний.
Как понять зачем? А если у меня программа периодически скидывает данные в микросхему памяти и необходимо, при поступлении определенной команды по UART, считать оттуда данные и по UART отправить обратно?
_Артём_
Sep 30 2012, 15:33
Цитата(d7d1cd @ Sep 30 2012, 18:06)
Как понять зачем?
Зачем делать чтение-запись
в разных местах.
Вернее не "местах", а потоках исполнения.
Цитата(d7d1cd @ Sep 30 2012, 18:06)
А если у меня программа периодически скидывает данные в микросхему памяти и необходимо, при поступлении определенной команды по UART, считать оттуда данные и по UART отправить обратно?
Это можно сделать в основной программе. Если команды принимаются в прерывании, то нужно сообщить о приёме команды (установить флаг приёма), дальше пусть основная программа считывает данные и отправляет в UART.
С самом начале моего поста есть схема. На ней выводы SO микросхем памяти соединены вместе и замкнуты через резистор на питающий проводник. Запись и чтение данных производится через вывод SI. Если можно "общаться" через один вывод, то зачем их делают 2?
_Артём_
Oct 7 2012, 15:13
Цитата(d7d1cd @ Oct 7 2012, 16:15)
Если можно "общаться" через один вывод, то зачем их делают 2?
C двумя линиями можно передавать данные в обе стороны одновременно.
Цитата(_Артём_ @ Oct 7 2012, 19:13)
C двумя линиями можно передавать данные в обе стороны одновременно.
Что значит передавать данные в обе стороны одновременно?
Цитата(d7d1cd @ Oct 7 2012, 19:14)
Что значит передавать данные в обе стороны одновременно?
Это значит писать и читать данные одновременно. Например читать из RAM и писать в DAC ... вроде как быстрее получиться
Понятно. То есть, в моем случае, я и читаю и записываю данные через пин SI. А делать то же самое через пин SO можно?
_Артём_
Oct 8 2012, 20:02
Цитата(d7d1cd @ Oct 8 2012, 19:35)
То есть, в моем случае, я и читаю и записываю данные через пин SI. А делать то же самое через пин SO можно?
Если не используется аппаратный spi и SI и SO объединены, то читать и передавать мастер может через любой из них. Но slave может читать данные только с SI, а передавать в SO.
Еще есть вопрос. Перед тем как начать процедуру записи, я читаю регистр микросхемы памяти и проверяю там бит WIP, то есть определяю, не занята ли микросхема в настоящий момент записью, заданной ей в предыдущем сеансе. Подскажите, сколько раз следует читать регистр до выдачи ответа о том, что с микросхемой что-то не так? Вдруг микросхема неисправна и бит WIP всегда установлен...
rezident
Oct 9 2012, 19:02
Цитата(d7d1cd @ Oct 8 2012, 21:35)
Понятно. То есть, в моем случае, я и читаю и записываю данные через пин SI. А делать то же самое через пин SO можно?
Я не понял, кто и где вас так "нагрузил", но вы ошибаетесь. Причем ошибка уже в нарисованной вами схеме из корневого поста. М/c c интерфейсом SPI имеют
раздельные входы и выходы данных. Нельзя
прочитать данные через
вход м/с SPI EEPROM. Для этого (попеременного чтения/записи) вход и выход данных м/с должны быть как минимум
объединены между собой. Так что, в вашей схеме ошибка: а) нет линии связи между объединенными выходами м/с FRAM.EEPROM и каким-либо пином МК и б) поскольку на схеме
раздельно объединены входы данных и выходы данных, то следовательно линии записи и чтения данных в МК тоже должны быть
раздельными.
d7d1cd
Oct 10 2012, 16:08
Цитата(rezident @ Oct 9 2012, 23:02)
Я не понял, кто и где вас так "нагрузил", но вы ошибаетесь. Причем ошибка уже в нарисованной вами схеме из корневого поста. М/c c интерфейсом SPI имеют раздельные входы и выходы данных. Нельзя прочитать данные через вход м/с SPI EEPROM. Для этого (попеременного чтения/записи) вход и выход данных м/с должны быть как минимум объединены между собой. Так что, в вашей схеме ошибка: а) нет линии связи между объединенными выходами м/с FRAM.EEPROM и каким-либо пином МК и б) поскольку на схеме раздельно объединены входы данных и выходы данных, то следовательно линии записи и чтения данных в МК тоже должны быть раздельными.
Спасибо за указание на ошибку в схеме. Действительно, на самом деле у меня в схеме выходы SI соединены с выходами SO.
Я планирую такой алгоритм работы (например чтение байта из м\с):
1. Отправляю в м\с инструкцию на чтение регистра статуса;
2. Читаю регистр статуса;
3. Если бит WIP в регистре статуса равен 1, то перехожу к пункту 2;
4. Отправляю в м\с инструкцию на чтение и адрес чтения;
5. Читаю байт информации
Вопрос такой: сколько раз необходимо выполнить цикл 2-3, перед тем, как сообщить, что чтение невозможно?
rezident
Oct 10 2012, 16:21
Цитата(d7d1cd @ Oct 10 2012, 21:08)
Спасибо за указание на ошибку в схеме. Действительно, на самом деле у меня в схеме выходы SI соединены с выходами SO.
Тогда не забывайте, что перед чтением данных нужно менять
функцию пина МК, переводя его с режима вывода на режим ввода.
Цитата(d7d1cd @ Oct 10 2012, 21:08)
Вопрос такой: сколько раз необходимо выполнить цикл 2-3, перед тем, как сообщить, что чтение невозможно?
Готовность нужна при ожидании окончания записи. В
datasheet M95256 указано максимальное время записи - 5мс. Вот в течение этого времени и нужно опрашивать готовность м/с EEPROM.
_Артём_
Oct 10 2012, 16:26
Цитата(d7d1cd @ Oct 10 2012, 19:08)
Вопрос такой: сколько раз необходимо выполнить цикл 2-3, перед тем, как сообщить, что чтение невозможно?
Это перестраховка какая-то - память как правило либо работает либо нет.
Но если хочется можете секунду-другую задать время ожидания. Но нужно в даташит смотреть, какие там времена.
d7d1cd
Oct 10 2012, 17:16
Понятно. Еще вопрос возник относительно того, что у меня в м\с вывод SO и SI соединены вместе. Получается, что при получении данных из SO они (данные) одновременно будут воздействовать на SI.
Что, если при чтении данных из м\с будет читаться байт 0х05. Ведь в инструкциях м\с это чтение регистра статуса. Прочитав этот байт, м\с одновременно получит команду на выдачу регистра статуса и при дальнейшем тактировании выдаст на SO значение регистра статуса, а не следующий байт из массива данных. Подскажите, если я не прав в своих рассуждениях, то в чем я ошибаюсь?
rezident
Oct 10 2012, 17:51
Цитата(d7d1cd @ Oct 10 2012, 22:16)
Подскажите, если я не прав в своих рассуждениях, то в чем я ошибаюсь?
Дык не надо рассуждать, коль имеете всего лишь смутные предположения о том, как все это работает
Для вас основой должен стать datasheet м/с которую вы применяете. Изучите его досконально - вдоль и поперек, сверху вниз и снизу вверх. Ответы на 90% вопросов найдутся сами в ходе изучения. А вот остальные 10% ищите в других документах или спрашивайте окружающих.
Для того, чтобы вы отбросили свои беспокойства советую внимательно рассмотреть в datasheet M95256 временн
ые диаграммы записи и чтения. Там вы можете заметить, что во время приема команды выход EEPROM находится в высокоимпедансном состоянии (Z-состояние) и не оказывает влияние на процесс приема команды. В то же время во время передачи данных самой м/с EEPROM она не чувствительна к входному битовому потоку данных. Конкретно по чтению регистра статуса см.
Figure 10. Read Status Register (RDSR) sequence на стр.19.
d7d1cd
Oct 11 2012, 02:55
Как я понял, после выбора м\с (Chip Select = 0), она ждет 1 байта инструкции (например, чтение регистра статуса). При дальнейшем тактировании м\с выдает на SO байт регистра статуса. В этот момент ее вход как бы отключен и она не воспринимает команды по SI. Чтобы снова передать инструкцию в м\с необходимо снять выбор с м\с (Chip Select = 1), а затем заново ее выбрать (Chip Select = 0).
Хоть это верно?
rezident
Oct 11 2012, 09:15
Цитата(d7d1cd @ Oct 11 2012, 07:55)
Хоть это верно?
Да, это верно. SPI синхронный интерфейс. Прием/передача данных в нем происходит синхронно с тактовом сигналом. Но начало/конец битовой последовательности задается отдельным сигналом
фреймовой синхронизации. В данной м/с им является CS. Кроме того, CS выполняет вторую функцию
выбора кристалла. Пока CS не автивирован, интерфейс м/с индифферентен к входным сигналам. Каждый фрейм начинается с передачи м/с-ме EEPROM кода команды. Следом за командой могут транслироваться данные или данные может выдавать сама м/с EEPROM, если ей была принята соответствующая команда (чтение регистра или чтение данных). При выдаче данных м/с EEPROM уже не воспринимает битовый поток на своем входе до тех пор, пока сигнал фреймовой синхронизации не сигшнализирует ей о начале нового фрейма.
d7d1cd
Oct 12 2012, 02:50
Нк, слава транзистору!
Спасибо за помощь. Пока вопросов нет. Приступил к реализации...
d7d1cd
Jan 29 2013, 14:07
Снова вопрос. Я применяю микросхемы памяти FM25CL64, M95256 и M95128. Все они подключены по схеме, приведенной в начале (за исключением того, что выводы SI и SO соединены вместе). В английском не очень то силен, поэтому с чтением даташитов есть проблемы. Подскажите, пожалуйста, назначение вывода WP и какое значение должно быть на нем в отдельности при чтении из МС и записи в нее?
thodnev
Jan 30 2013, 18:32
Кхм, мне в голову пришел один дебильный вариант. Можно ведь использовать код, полученный в результате дизассемблирования.
Можно использовать, но при разборе оного вопросов возникает еще больше.
Цитата(d7d1cd @ Jan 29 2013, 18:07)
Снова вопрос. Я применяю микросхемы памяти FM25CL64, M95256 и M95128. Все они подключены по схеме, приведенной в начале (за исключением того, что выводы SI и SO соединены вместе). В английском не очень то силен, поэтому с чтением даташитов есть проблемы. Подскажите, пожалуйста, назначение вывода WP и какое значение должно быть на нем в отдельности при чтении из МС и записи в нее?
Вроде разобрался, что значение пина WP при чтении не имеет значения, а при записи должен быть равен 1.
Возвращаюсь к теме. Чтение из памяти по протоколу SPI я реализовал. Теперь мне необходимо реализовать запись. И тут возник вопрос.
Прежде чем отправить в МС оп-код на запись, необходимо отправить в нее оп-код Write Enable Latch, а потом, возможно, необходимо записать регистр статуса, чтобы снять блокировку записи. Вопрос в чем: если я выбрал МС, отправил оп-код WREN, после этого необходимо снимать выбор с МС или же можно дальше отправлять WRSR?
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.