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

 
 
5 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> Чтение\запись по SPI
d7d1cd
сообщение Jul 26 2012, 14:36
Сообщение #1


Местный
***

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



Привет всем! У меня в устройстве микроконтроллер MSP430F149, к которому подключены 3 микросхемы памяти (для четвертой есть место, но она сама отсутствует). Схему подключения привожу ниже.

Моя задача написать функцию чтения\записи одного байта информации из любой микросхемы по любому адресу. Основная проблема в том, что функцию надо написать на ассемблере. Думаю, что подобную функцию, написанную на С, перевести на ассемблер проблем не составит.

Подскажите, пожалуйста, с чего мне начать?


Сообщение отредактировал d7d1cd - Jul 26 2012, 14:40
Go to the top of the page
 
+Quote Post
ut1wpr
сообщение Jul 26 2012, 15:47
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 98
Регистрация: 20-06-05
Пользователь №: 6 150



Цитата(d7d1cd @ Jul 26 2012, 17:36) *
Привет всем! У меня в устройстве микроконтроллер MSP430F149, к которому подключены 3 микросхемы памяти (для четвертой есть место, но она сама отсутствует). Схему подключения привожу ниже.

Моя задача написать функцию чтения\записи одного байта информации из любой микросхемы по любому адресу. Основная проблема в том, что функцию надо написать на ассемблере. Думаю, что подобную функцию, написанную на С, перевести на ассемблер проблем не составит.

Подскажите, пожалуйста, с чего мне начать?

1. С чтения ДШ на память XX-YY-zzz.
2. Чтение ДШ на МК MSP430F149.
3. Чтение описания протокола I2C.
4. После изучения (а не только прочтения) пп 2 и 3 реализовать протокол.

п.4 можно заменить рытьем и нытьем на форумах. Смотря какая цель преследуется.
Если сдать курсак назавтра и забыть, вариант выпросить-упросить написать наиболее предпочтителен.
Тут уж не до самолюбия.
А если действительно научится - тут уж никуда не денешься. Все три пункта по порядку... sm.gif
PS Не совсем понятно по тексту поста, для кого перевод с Си на АСМ не составит проблем? Для топикстартера? Или это не вопрос а утверждение? Знака вопроса нет, значит ТС это утверждает. Так?
Go to the top of the page
 
+Quote Post
d7d1cd
сообщение Jul 26 2012, 16:20
Сообщение #3


Местный
***

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



Я конечно понимаю, что вы ошиблись, но 3 пункт здесь вообще не к месту. Изучаем протокол SPI. Это первое. Второе - это то, что мне надо именно научиться. Третье: да, я утверждаю, что перевод с С на АСМ - не проблема (по крайней мере это намного проще, чем перевести с АСМ на С).
На счет "рытья и нытья на форумах": скажите, а зачем же еще нужны форумы? Вы предлагаете тупо сидеть, читать ДШ, экспериментировать раз за разом и ни у кого ничего не спрашивать?
Ладно, все это не по теме. Я почитал описание протокола SPI. Понял как выбрать микросхему, с которой работать. Понял принцип отправки\получения данных. Не понятно как задать адрес, с которого производить чтение\запись.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Jul 26 2012, 16:34
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(d7d1cd @ Jul 26 2012, 19:20) *
перевод с С на АСМ - не проблема

Может это и не проблеиа, но наверняка напрасный труд. Зачем перевод нужен?

Цитата(d7d1cd @ Jul 26 2012, 19:20) *
Не понятно как задать адрес, с которого производить чтение\запись.

Для того чтобы ответить на этот вопрос нужно знать тип микросхемы памяти и посмотреть соответствующую команды в ДШ.
Или угадать прикажете?
Go to the top of the page
 
+Quote Post
d7d1cd
сообщение Jul 26 2012, 16:48
Сообщение #5


Местный
***

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



Чтобы труд не был напрасным, буду сразу писать на АСМ. Можно я не буду говорить зачем мне такой геморрой?
Микросхема памяти, используемая в устройстве - FM25CL64.
И еще вопрос: при указанном подключении, можно ли использовать для чтения\записи какую-то периферию микроконтроллера? Я, по крайней мере, такой не нашел. Может все из-за неопытности...

Сообщение отредактировал d7d1cd - Jul 26 2012, 16:54
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Jul 26 2012, 17:05
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(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. Смотрите в ДШ на МК.
Go to the top of the page
 
+Quote Post
rezident
сообщение Jul 26 2012, 21:02
Сообщение #7


Гуру
******

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



Цитата(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, как в вашей схеме

Go to the top of the page
 
+Quote Post
d7d1cd
сообщение Jul 27 2012, 02:56
Сообщение #8


Местный
***

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



К сожалению, схему подключения переделать нельзя. Придется "общаться" с микросхемами при существующем подключении, и реализовывать весь алгоритм "общения" "ручками". Что называется - программно реализовывать. Буду изучать ДШ микросхем памяти пока.
Go to the top of the page
 
+Quote Post
d7d1cd
сообщение Jul 27 2012, 16:20
Сообщение #9


Местный
***

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



Поизучал ДШ. Возник вопрос по режимам SPI. Сказано, что микросхема FM25CL64 поддерживает 2 режима: 0 и 3. А как выбрать тот или иной режим? Или я что-то недопонимаю?
И еще: выборка и установка данных обязательно должна происходить только во время смены одного уровня сигнала тактирования на другой или можно сменить уровень сигнала тактирования, сделать выборку (или установку) данных, снова сменить уровень сигнала, снова сделать выборку (установку) данных...

Сообщение отредактировал d7d1cd - Jul 27 2012, 16:31
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Jul 27 2012, 17:25
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(d7d1cd @ Jul 27 2012, 19:20) *
Возник вопрос по режимам SPI. Сказано, что микросхема FM25CL64 поддерживает 2 режима: 0 и 3. А как выбрать тот или иной режим?

Выбрать волевым решением.
Какой это будет режим 0 или 3, FM25 сам разберёт.

Цитата(d7d1cd @ Jul 27 2012, 19:20) *
И еще: выборка и установка данных обязательно должна происходить только во время смены одного уровня сигнала тактирования на другой или можно сменить уровень сигнала тактирования, сделать выборку (или установку) данных, снова сменить уровень сигнала, снова сделать выборку (установку) данных...


Посмотрите по ссылке..
Всё достаточно понятно, тем более вы реализуета spi-master, значит сами выбираете скорость тактирования.
Go to the top of the page
 
+Quote Post
d7d1cd
сообщение Jul 28 2012, 04:44
Сообщение #11


Местный
***

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



Ссылку я и ранее читал. Сейчас более подробно изучил временные диаграммы цикла синхронизации. Допустим, я волевым решением выбираю режим 0. Установку делаю так:
1. Изначально устанавливаю низкий уровень сигнала (НУС) на входе SCK (так сказать инициализация, так как неизвестно какой там был уровень сигнала). Думаю, что при этом на входе SI должен быть высокий уровень сигнала (ВУС), так как если до этого SCK имел ВУС, то, согласно режима 0 произойдет установка бита, который был в это время на входе SI. А так как любое "общение" начинается с отправки оп-кода (который, в свою очередь, всегда начинается с НУС), то начало "общения", начавшееся с ВУС, проигнорируется микросхемой.
2. Устанавливаю ВУС на входе SCK.
3. Устанавливаю на входе SI необходимый уровень установки (бит, который надо записать).
4. Устанавливаю НУС на входе SCK (то есть, по сути, произвожу запись бита в микросхему).
5. Если необходимо продолжить запись, перехожу к пункту 2.

Скажите, мой алгоритм правильный?

Сообщение отредактировал d7d1cd - Jul 28 2012, 04:44
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Jul 28 2012, 12:21
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(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.

Go to the top of the page
 
+Quote Post
d7d1cd
сообщение Jul 28 2012, 12:57
Сообщение #13


Местный
***

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



Цитата(_Артём_ @ Jul 28 2012, 16:21) *
То есть так:

3. Устанавливаю на входе SI необходимый уровень установки (бит, который надо записать).
2. Устанавливаю ВУС на входе SCK(то есть, по сути, произвожу запись бита в микросхему).
4. Устанавливаю НУС на входе SCK .
5. Если необходимо продолжить запись, перехожу к пункту 2.


А если до начала всех действий на входе SCK уже будет ВУС? Тогда все равно все будет правильно работать?

P.S. И, наверное, тогда все будет выглядеть так:


Код
1. Устанавливаю на входе SI необходимый уровень установки (бит, который надо записать).
2. Устанавливаю ВУС на входе SCK.
3. Устанавливаю НУС на входе SCK .
4. Если необходимо продолжить запись, перехожу к пункту 1.


Сообщение отредактировал d7d1cd - Jul 28 2012, 13:02
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Jul 28 2012, 13:04
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(d7d1cd @ Jul 28 2012, 15:57) *
А если до начала всех действий на входе SCK уже будет ВУС? Тогда все равно все будет правильно работать?

Наверное будет работать.
Но откуда там взяться 1? Сигнал на SCK формирует ваша программа. Вот и обеспечте правильную диаграмму:
Обмен начинается с SCK=0 (пишу только по SCK)
Обмен заканчивается срезом по выводе SCK.

Go to the top of the page
 
+Quote Post
d7d1cd
сообщение Jul 28 2012, 13:26
Сообщение #15


Местный
***

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



Спасибо за помощь. Еще такой момент: после отправки в микросхему памяти оп-кода на чтение, я начинаю считывать данные. Алгоритм должен быть такой?

...
1. Устанавливаю на входе SI уровень последнего бита адреса чтения;
2. Устанавливаю ВУС на входе SCK;
3. Устанавливаю НУС на входе SCK ;
4. Считываю с SO первый бит байта, адрес которого был в оп-коде;
5. Если необходимо продолжить чтение, переходим к пункту 2.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Jul 28 2012, 13:44
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(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.


Go to the top of the page
 
+Quote Post
d7d1cd
сообщение Jul 29 2012, 12:42
Сообщение #17


Местный
***

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



Хочу изложить то, что я выяснил и понял как сделать (думаю, что я прав).
Первое относится к вопросу об изначальном уровне сигнала на входе 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.




Хотелось бы услышать ваши комментарии ко всему этому...



Сообщение отредактировал d7d1cd - Jul 29 2012, 12:54
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Jul 29 2012, 16:01
Сообщение #18


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(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 - просто пауза, чтобы не слишком быстро.
Go to the top of the page
 
+Quote Post
d7d1cd
сообщение Jul 29 2012, 16:42
Сообщение #19


Местный
***

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



Цитата(_Артём_ @ Jul 29 2012, 20:01) *
NOP - просто пауза, чтобы не слишком быстро.


А зачем замедлять? Мне кажется, что это необходимо для гарантированной установки уровня сигнала на SI.

Как видно из схемы, все микросхемы памяти своим выводом WP подсоединены к микроконтроллеру. Что необходимо делать с уровнем сигнала для записи или чтения информации?

И еще: правильно ли я понял, что оп-код WREN надо отправлять только если я хочу записать данные? Если же хочу прочитать, то его отправлять не надо? То есть запись делаю так:
1. Отправляю WREN;
2. Отправляю WRITE;
3. Отправляю адрес записи;
4. Отправляю байты для записи.

Чтение так:
1. Отправляю READ;
2. Отправляю адрес чтения;
3. Читаю байты.

Сообщение отредактировал d7d1cd - Jul 29 2012, 18:00
Go to the top of the page
 
+Quote Post
d7d1cd
сообщение Sep 29 2012, 14:54
Сообщение #20


Местный
***

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



Подошел к необходимости работать с микросхемой памяти. Для чтения, например, необходимо сначала выбрать микросхему (установить низкий уровень сигнала на входе CS микросхемы), отправить в микросхему оп-код на чтение, потом отправить байты адреса, а потом, тактируя микросхему, считывать из нее данные по отправленному адресу. У меня такие вопросы:

1. Если я отправил оп-код, отправил байты адреса для чтения, а потом какое то время не считываю данные из микросхемы, то сколько времени можно ждать, а потом начать считывать данные, чтобы данные начали считываться именно с того адреса, который был отправлен изначально?

2. Если отправить оп-код, а потом установить на входе CS высокий уровень сигнала, то "задание" оп-кода будет утеряно?
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Sep 29 2012, 15:33
Сообщение #21


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(d7d1cd @ Sep 29 2012, 17:54) *
Подошел к необходимости работать с микросхемой памяти.

С какой именно? Они разные.

Цитата(d7d1cd @ Sep 29 2012, 17:54) *
1. Если я отправил оп-код, отправил байты адреса для чтения, а потом какое то время не считываю данные из микросхемы, то сколько времени можно ждать, а потом начать считывать данные, чтобы данные начали считываться именно с того адреса, который был отправлен изначально?

SPI - синхронный протокол - можно ставить практически любые задержки.

Цитата(d7d1cd @ Sep 29 2012, 17:54) *
2. Если отправить оп-код, а потом установить на входе CS высокий уровень сигнала, то "задание" оп-кода будет утеряно?

Как правило да - будет утеряно.
Go to the top of the page
 
+Quote Post
d7d1cd
сообщение Sep 29 2012, 17:19
Сообщение #22


Местный
***

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



Работать планируется с микросхемой M95256. Изучив даташит, выяснил что запись в микросхему происходит не мгновенно. Ее окончание необходимо проверять по биту WIP. Получается, что перед каждой записью необходимо проверять, сброшен ли этот бит? И еще вопрос: если мне нужно произвести запись не одного байта, а нескольких, то готовность микросхемы к записи надо проверять после отправки каждого байта?
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Sep 29 2012, 17:28
Сообщение #23


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(d7d1cd @ Sep 29 2012, 20:19) *
Получается, что перед каждой записью необходимо проверять, сброшен ли этот бит?

Это уже от вашего алгоритма зависит: может лучше после записи проверять или вообще не проверять.

Цитата(d7d1cd @ Sep 29 2012, 20:19) *
И еще вопрос: если мне нужно произвести запись не одного байта, а нескольких, то готовность микросхемы к записи надо проверять после отправки каждого байта?

Думаю, что нет. Но нужно использовать соотв. команду (Page Write).
Go to the top of the page
 
+Quote Post
d7d1cd
сообщение Sep 29 2012, 17:42
Сообщение #24


Местный
***

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



Ну вообще не проверять я думаю не правильно. Вдруг запись внутри микросхемы еще идет (бит WIP установлен), а я без проверки попытаюсь записать туда еще данные.
И еще такой момент: что если программа, например, отправила оп-код на запись, отправила адрес записи и в этот момент произошло прерывание в котором делается попытка чтения из этой же микросхемы. Получится так, что прерывание отправит оп-код на чтение, отправит адрес, но так как ранее уже был отправлен оп-код на запись, то микросхема все это запишет в память. Как избавиться от таких накладок?

Сообщение отредактировал d7d1cd - Sep 29 2012, 17:48
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Sep 29 2012, 17:53
Сообщение #25


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(d7d1cd @ Sep 29 2012, 20:42) *
И еще такой момент: что если программа, например, отправила оп-код на запись, отправила адрес записи и в этот момент произошло прерывание в котором делается попытка чтения из этой же микросхемы. Получится так, что прерывание отправит оп-код на чтение, отправит адрес, но так как ранее уже был отправлен оп-код на запись, то микросхема все это запишет в память. Как избавиться от таких накладок?

Разграничивайте доступ к ресурсам. Используйте Mutex и тому подобное.
Go to the top of the page
 
+Quote Post
d7d1cd
сообщение Sep 30 2012, 05:46
Сообщение #26


Местный
***

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



Цитата(_Артём_ @ Sep 29 2012, 21:53) *
Разграничивайте доступ к ресурсам. Используйте Mutex и тому подобное.

Думаю, что при работе функций записи и чтения микросхем памяти вне прерываний, необходимо запрещать прерывания.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Sep 30 2012, 13:30
Сообщение #27


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(d7d1cd @ Sep 30 2012, 08:46) *
Думаю, что при работе функций записи и чтения микросхем памяти вне прерываний, необходимо запрещать прерывания.

Не лучшая идея.
Зачем делать чтение-запись в разных местах? Да ещё и с запретом прерываний.

Go to the top of the page
 
+Quote Post
d7d1cd
сообщение Sep 30 2012, 15:06
Сообщение #28


Местный
***

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



Цитата(_Артём_ @ Sep 30 2012, 17:30) *
Не лучшая идея.
Зачем делать чтение-запись в разных местах? Да ещё и с запретом прерываний.

Как понять зачем? А если у меня программа периодически скидывает данные в микросхему памяти и необходимо, при поступлении определенной команды по UART, считать оттуда данные и по UART отправить обратно?
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Sep 30 2012, 15:33
Сообщение #29


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(d7d1cd @ Sep 30 2012, 18:06) *
Как понять зачем?

Зачем делать чтение-запись в разных местах.
Вернее не "местах", а потоках исполнения.

Цитата(d7d1cd @ Sep 30 2012, 18:06) *
А если у меня программа периодически скидывает данные в микросхему памяти и необходимо, при поступлении определенной команды по UART, считать оттуда данные и по UART отправить обратно?

Это можно сделать в основной программе. Если команды принимаются в прерывании, то нужно сообщить о приёме команды (установить флаг приёма), дальше пусть основная программа считывает данные и отправляет в UART.
Go to the top of the page
 
+Quote Post
d7d1cd
сообщение Oct 7 2012, 13:15
Сообщение #30


Местный
***

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



С самом начале моего поста есть схема. На ней выводы SO микросхем памяти соединены вместе и замкнуты через резистор на питающий проводник. Запись и чтение данных производится через вывод SI. Если можно "общаться" через один вывод, то зачем их делают 2?
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Oct 7 2012, 15:13
Сообщение #31


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(d7d1cd @ Oct 7 2012, 16:15) *
Если можно "общаться" через один вывод, то зачем их делают 2?

C двумя линиями можно передавать данные в обе стороны одновременно.
Go to the top of the page
 
+Quote Post
d7d1cd
сообщение Oct 7 2012, 16:14
Сообщение #32


Местный
***

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



Цитата(_Артём_ @ Oct 7 2012, 19:13) *
C двумя линиями можно передавать данные в обе стороны одновременно.

Что значит передавать данные в обе стороны одновременно?

Сообщение отредактировал d7d1cd - Oct 7 2012, 16:26
Go to the top of the page
 
+Quote Post
hash20
сообщение Oct 8 2012, 10:19
Сообщение #33


Участник
*

Группа: Участник
Сообщений: 24
Регистрация: 24-01-12
Пользователь №: 69 858



Цитата(d7d1cd @ Oct 7 2012, 19:14) *
Что значит передавать данные в обе стороны одновременно?


Это значит писать и читать данные одновременно. Например читать из RAM и писать в DAC ... вроде как быстрее получиться sm.gif
Go to the top of the page
 
+Quote Post
d7d1cd
сообщение Oct 8 2012, 16:35
Сообщение #34


Местный
***

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



Понятно. То есть, в моем случае, я и читаю и записываю данные через пин SI. А делать то же самое через пин SO можно?
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Oct 8 2012, 20:02
Сообщение #35


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(d7d1cd @ Oct 8 2012, 19:35) *
То есть, в моем случае, я и читаю и записываю данные через пин SI. А делать то же самое через пин SO можно?

Если не используется аппаратный spi и SI и SO объединены, то читать и передавать мастер может через любой из них. Но slave может читать данные только с SI, а передавать в SO.
Go to the top of the page
 
+Quote Post
d7d1cd
сообщение Oct 9 2012, 15:47
Сообщение #36


Местный
***

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



Еще есть вопрос. Перед тем как начать процедуру записи, я читаю регистр микросхемы памяти и проверяю там бит WIP, то есть определяю, не занята ли микросхема в настоящий момент записью, заданной ей в предыдущем сеансе. Подскажите, сколько раз следует читать регистр до выдачи ответа о том, что с микросхемой что-то не так? Вдруг микросхема неисправна и бит WIP всегда установлен...
Go to the top of the page
 
+Quote Post
rezident
сообщение Oct 9 2012, 19:02
Сообщение #37


Гуру
******

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



Цитата(d7d1cd @ Oct 8 2012, 21:35) *
Понятно. То есть, в моем случае, я и читаю и записываю данные через пин SI. А делать то же самое через пин SO можно?

Я не понял, кто и где вас так "нагрузил", но вы ошибаетесь. Причем ошибка уже в нарисованной вами схеме из корневого поста. М/c c интерфейсом SPI имеют раздельные входы и выходы данных. Нельзя прочитать данные через вход м/с SPI EEPROM. Для этого (попеременного чтения/записи) вход и выход данных м/с должны быть как минимум объединены между собой. Так что, в вашей схеме ошибка: а) нет линии связи между объединенными выходами м/с FRAM.EEPROM и каким-либо пином МК и б) поскольку на схеме раздельно объединены входы данных и выходы данных, то следовательно линии записи и чтения данных в МК тоже должны быть раздельными.
Go to the top of the page
 
+Quote Post
d7d1cd
сообщение Oct 10 2012, 16:08
Сообщение #38


Местный
***

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



Цитата(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, перед тем, как сообщить, что чтение невозможно?

Сообщение отредактировал d7d1cd - Oct 10 2012, 16:08
Go to the top of the page
 
+Quote Post
rezident
сообщение Oct 10 2012, 16:21
Сообщение #39


Гуру
******

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



Цитата(d7d1cd @ Oct 10 2012, 21:08) *
Спасибо за указание на ошибку в схеме. Действительно, на самом деле у меня в схеме выходы SI соединены с выходами SO.
Тогда не забывайте, что перед чтением данных нужно менять функцию пина МК, переводя его с режима вывода на режим ввода.
Цитата(d7d1cd @ Oct 10 2012, 21:08) *
Вопрос такой: сколько раз необходимо выполнить цикл 2-3, перед тем, как сообщить, что чтение невозможно?
Готовность нужна при ожидании окончания записи. В datasheet M95256 указано максимальное время записи - 5мс. Вот в течение этого времени и нужно опрашивать готовность м/с EEPROM.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Oct 10 2012, 16:26
Сообщение #40


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(d7d1cd @ Oct 10 2012, 19:08) *
Вопрос такой: сколько раз необходимо выполнить цикл 2-3, перед тем, как сообщить, что чтение невозможно?

Это перестраховка какая-то - память как правило либо работает либо нет.
Но если хочется можете секунду-другую задать время ожидания. Но нужно в даташит смотреть, какие там времена.
Go to the top of the page
 
+Quote Post
d7d1cd
сообщение Oct 10 2012, 17:16
Сообщение #41


Местный
***

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



Понятно. Еще вопрос возник относительно того, что у меня в м\с вывод SO и SI соединены вместе. Получается, что при получении данных из SO они (данные) одновременно будут воздействовать на SI.
Что, если при чтении данных из м\с будет читаться байт 0х05. Ведь в инструкциях м\с это чтение регистра статуса. Прочитав этот байт, м\с одновременно получит команду на выдачу регистра статуса и при дальнейшем тактировании выдаст на SO значение регистра статуса, а не следующий байт из массива данных. Подскажите, если я не прав в своих рассуждениях, то в чем я ошибаюсь?
Go to the top of the page
 
+Quote Post
rezident
сообщение Oct 10 2012, 17:51
Сообщение #42


Гуру
******

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



Цитата(d7d1cd @ Oct 10 2012, 22:16) *
Подскажите, если я не прав в своих рассуждениях, то в чем я ошибаюсь?
Дык не надо рассуждать, коль имеете всего лишь смутные предположения о том, как все это работает sm.gif Для вас основой должен стать datasheet м/с которую вы применяете. Изучите его досконально - вдоль и поперек, сверху вниз и снизу вверх. Ответы на 90% вопросов найдутся сами в ходе изучения. А вот остальные 10% ищите в других документах или спрашивайте окружающих.
Для того, чтобы вы отбросили свои беспокойства советую внимательно рассмотреть в datasheet M95256 временные диаграммы записи и чтения. Там вы можете заметить, что во время приема команды выход EEPROM находится в высокоимпедансном состоянии (Z-состояние) и не оказывает влияние на процесс приема команды. В то же время во время передачи данных самой м/с EEPROM она не чувствительна к входному битовому потоку данных. Конкретно по чтению регистра статуса см. Figure 10. Read Status Register (RDSR) sequence на стр.19.
Go to the top of the page
 
+Quote Post
d7d1cd
сообщение Oct 11 2012, 02:55
Сообщение #43


Местный
***

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



Как я понял, после выбора м\с (Chip Select = 0), она ждет 1 байта инструкции (например, чтение регистра статуса). При дальнейшем тактировании м\с выдает на SO байт регистра статуса. В этот момент ее вход как бы отключен и она не воспринимает команды по SI. Чтобы снова передать инструкцию в м\с необходимо снять выбор с м\с (Chip Select = 1), а затем заново ее выбрать (Chip Select = 0).

Хоть это верно? blush.gif

Сообщение отредактировал d7d1cd - Oct 11 2012, 02:55
Go to the top of the page
 
+Quote Post
rezident
сообщение Oct 11 2012, 09:15
Сообщение #44


Гуру
******

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



Цитата(d7d1cd @ Oct 11 2012, 07:55) *
Хоть это верно? blush.gif
Да, это верно. SPI синхронный интерфейс. Прием/передача данных в нем происходит синхронно с тактовом сигналом. Но начало/конец битовой последовательности задается отдельным сигналом фреймовой синхронизации. В данной м/с им является CS. Кроме того, CS выполняет вторую функцию выбора кристалла. Пока CS не автивирован, интерфейс м/с индифферентен к входным сигналам. Каждый фрейм начинается с передачи м/с-ме EEPROM кода команды. Следом за командой могут транслироваться данные или данные может выдавать сама м/с EEPROM, если ей была принята соответствующая команда (чтение регистра или чтение данных). При выдаче данных м/с EEPROM уже не воспринимает битовый поток на своем входе до тех пор, пока сигнал фреймовой синхронизации не сигшнализирует ей о начале нового фрейма.
Go to the top of the page
 
+Quote Post
d7d1cd
сообщение Oct 12 2012, 02:50
Сообщение #45


Местный
***

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



Нк, слава транзистору! cool.gif Спасибо за помощь. Пока вопросов нет. Приступил к реализации...
Go to the top of the page
 
+Quote Post
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
d7d1cd
сообщение Mar 13 2013, 16:16
Сообщение #61


Местный
***

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



Какой развернутый ответ... Готовность микросхемы я проверяю. Более того, я делаю запись регистра статуса (все биты 0) для разрешения записи во всю МС. На WP при этом у меня 1.

Цитата
...при записи блока нужно выравнивать размер записи на границу размера буфера. Иначе происходит переполнение счетчика и запись в буфер происходит по кольцу. Для вычисления адреса начала буфера достаточно адрес начала записи поделить, а затем умножить на размер буфера (или наложить маску той же размерности, что и размер буфера). Соответственно для вычисления адреса конца буфера нужно прибавить к адресу начала буфера его размер.


Вот это немного сложно пока. Даже примеры пока не спасают. Давайте представим, что я хочу записать 10 байт в микросхему M95512 по адресу FFF0. Адрес начала буфера - FFF0 \ 80 = 1FF * 80 = FF80. Адрес конца буфера - FF80 + 7F = FFFF. То есть, буфер от FF80 до FFFF.

Получается, что отправив в МС адрес FFF0 реально произойдет запись начиная с адреса FF80 что ли?

Сообщение отредактировал d7d1cd - Mar 13 2013, 16:51
Go to the top of the page
 
+Quote Post
rezident
сообщение Mar 13 2013, 18:02
Сообщение #62


Гуру
******

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



Цитата(d7d1cd @ Mar 13 2013, 21:16) *
Получается, что отправив в МС адрес FFF0 реально произойдет запись начиная с адреса FF80 что ли?
Нет конечно! Посмотрите Figure 4. Block diagram в datasheet M95512. Видите там прямоугольник с надписью Address register and counter? Вот в этот регистр записывается начальный адрес, который вы передаете в команде записи. Младшие 7 бит этого адреса автоматически инкрементируются при последовательной записи данных в буфер (размером 128 байт), начиная от начального адреса. Если побитно рассматривать, то адрес выглядит как XXXX XXXX XCCC CCCC, где биты X, транслированные в м/с EEPROM после кода команды, не меняются, а биты C инкрементируются при записи каждого последующего байта данных. Если вы запишете в буфер больше, чем позволяет разрядность его счетчика, то этот счетчик переполнится и адрес вернется вновь к началу буфера. При побайтной записи (один байт на каждую команду записи) можно писать по какому угодно адресу. Но при блочной записи необходимо выравнивать данные так, чтобы счетчик адреса не переполнился.
Go to the top of the page
 
+Quote Post
d7d1cd
сообщение Mar 14 2013, 02:51
Сообщение #63


Местный
***

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



Понял. Со счетчиком все ясно. Вернувшись к моей задаче (о записи 10 байт по адресу FFF0) получается, что все 10 байт, по идее, должны записаться в память. Однако этого не происходит.
Готовность МС к записи я определяю путем чтения регистра статуса и проверки бита WIP (должен быть 0). Далее я отправляю WREN, потом WRITE, адрес и байты. rezident, Вы писали, что надо проверять биты WIP и WEL. Может быть мне сначала проверить бит WIP, отправить команду WREN, проверить бит WEL и только тогда приступать к записи?
Go to the top of the page
 
+Quote Post
rezident
сообщение Mar 14 2013, 05:29
Сообщение #64


Гуру
******

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



Да, именно так и нужно.
1.Читаете регистр статуса (команда RDSR). Если WIP=1, то повторяете чтение регистра статуса до тех пор, пока WIP не станет = 0.
1а.при необходимости изменения состояния битов BPx в регистре статуса (изменение размеров области памяти, защищенной от записи) переводите вывод WP в неактивное состояние (= 1)
1б.проверяете, что в регистре статуса бит SRWD = 0 (запись в регистр статуса разрешена)
1в.сбрасываете/устанавливаете биты BPx в регистре статуса (производите запись в регистр статуса соответствующей командой WRSR), чтобы снять блокировку записи с требуемых секторов EEPROM
2.Отправляете команду WREN.
3.Читаете регистр статуса, чтобы убедиться, что WEL = 1.
4.Отправляете на запись данные командой WRITE с учетом границы буфера.
5.Читаете регистр статуса, проверяя WIP до тех пор пока он не станет = 0.
Если нужно еще дописать, то переходите к п.2. Если нет, то
6. при необходимости защиты от записи секторов EEPROM устанавливаете биты BPx в регистра статуса (командой WRSR).
6а. WP переводите в активное состояние (= 0) для установки защиты от записи регистра статуса
Если защиту от записи не используете, то пункты манипуляций с WP и BPx (1а, 1б, 1в, 6, 6а) можно пропустить
Go to the top of the page
 
+Quote Post
d7d1cd
сообщение Mar 14 2013, 16:46
Сообщение #65


Местный
***

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



А если в пункте 1б SRWD равен 1? В своей реализации записи я делаю так:
1. Устанавливаю WP = 1.
2. Читаю регистр статуса.
2. Если бит WIP равен 1, то перехожу к пункту 2.
3. Отправляю команду WREN.
4. Записываю в регистр статуса байт 0х00 (разрешаю запись в любую область памяти, сбрасываю бит SRWD).
5. Отправляю команду WREN.
6. Отправляю команду WRITE.
7. Отправляю адрес.
8. Отправляю байты для записи.

Я дополнительно не проверяю установился ли бит WEL. Он может не установиться после команды WREN?
Go to the top of the page
 
+Quote Post
rezident
сообщение Mar 14 2013, 18:41
Сообщение #66


Гуру
******

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



Да, в моем описании алгоритма я почему-то упустил необходимость подачи команды WREN перед записью в регистр статуса и контроль окончания выполнения записи в него (анализ бита WIP).
Цитата(d7d1cd @ Mar 14 2013, 21:46) *
Я дополнительно не проверяю установился ли бит WEL. Он может не установиться после команды WREN?

Может, если, например, вы попытаетесь транслировать команду WREN до окончания выполнения записи. Или, если во время (после) подачи команды WREN произойдет "провал" в питании EEPROM, который она воспримет как условие Power-up. Или CS сняли не вовремя.
Go to the top of the page
 
+Quote Post
d7d1cd
сообщение Mar 15 2013, 02:48
Сообщение #67


Местный
***

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



Цитата
необходимость подачи команды WREN перед записью в регистр статуса и контроль окончания выполнения записи в него (анализ бита WIP)

Цитата
...если, например, вы попытаетесь транслировать команду WREN до окончания выполнения записи.


А я в своем алгоритме после записи регистра статуса (байт 0х00), сразе же отправляю команду WREN (почему то я подумал, что регистр статуса пишется "мгновенно" и проверять WIP нет необходимости). Возможно, что ошибка именно тут: регистр статуса еще "пишется", а я снова отправляю команду на разрешение записи. Конечно она не проходит. Это как раз и объясняет почему микросхема FRAM пишется, а EEPROM нет.

Сегодня, если будет время, обязательно это все проверю.

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


Гуру
******

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



Циатата из datasheet M95512
Цитата
While the Write Status Register cycle is in progress, the Status Register may still be read to
check the value of the Write In Progress (WIP) bit. The Write In Progress (WIP) bit is 1
during the self-timed Write Status Register cycle
, and is 0 when it is completed. When the
cycle is completed, the Write Enable Latch (WEL) is reset.

Я бы на вашем месте попробовал пока вообще не использовать защиту записи и проверить саму запись. И только после отладки записи добавить процедуры защиты записи.
Go to the top of the page
 
+Quote Post
IVN2013
сообщение Mar 22 2015, 18:51
Сообщение #69


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 12-08-13
Пользователь №: 77 889



Доброго времени суток! Начал осваивать работу с FRAM FM25CL64B. Контроллер -AVR mega16, копмилятор Написал тестовую программу записи / считывания (при отправке на mega16 по USART любого байта пишу и считываю). Только вот приходят одни нули. На MISO FRAM - низкий уровень, в то время как осуществляю чтение. Выкладываю код программки, может кто что подскажет. Заранее спасибо!
Код
#include <iom16v.h>
#include <macros.h>
#include <eeprom.h>
#include <string.h>

#pragma interrupt_handler UART_RX_interrupt:12

#define ToggleBit(x, bit) (x^=(1<<bit))

static volatile unsigned char readdata=0x00;
static volatile unsigned char readdata1=0x00;
static volatile unsigned char readdata2=0x00;

void InitUART(void)
{
    UBRRL = 0X03;        // baud rate = 115200
    UBRRH = 0x00;
    UCSRA = 0x00;
    UCSRB = (1<<RXEN)|(1<<TXEN);
    UCSRC = (3<<UCSZ0)|(0<<USBS)|(1<<URSEL);
     /* Set frame format: 8data, 1stop bit */
    UCSRC = (1<<URSEL)|0x06;
}

void SPI_MasterInit(void)
{
/* Set MOSI, chip select and SCK (clock) output, MISO - input */
DDRB |= (1<<PB7)|(0<<PB6)|(1<<PB5)|(1<<PB4);
PORTB |= 0b01000000; // подтягиваем пин входа

/* Enable SPI, Master, set clock rate fck/16 */
SPCR |= (1<<SPE)|(1<<MSTR)|(1<<SPR0);                    //SPI Enable, SCK frequency = fosc/16

//SPCR |=(0x0C);
}

void SPI_MasterTransmit(unsigned char cData)
{
/* Start transmission */
SPDR = cData;
/* Wait for transmission complete */
while(!(SPSR & (1<<SPIF)));
}

void UART_RX_interrupt( void )
{  
     // отправляю данные  
     PORTB &= ~0b00010000;   // chip select в 0
     SPI_MasterTransmit(0b00000110);//wren
     SPI_MasterTransmit(0b00000010); //write
     SPI_MasterTransmit(0b00000011); //address
     SPI_MasterTransmit(0b00000011); //address
     SPI_MasterTransmit(0b01011100); //data
     SPI_MasterTransmit(0b00001111); //data
     SPI_MasterTransmit(0b11110000); //data
     PORTB |= 0b00010000;    // chip select в 1
     ////////////////////////////////////////////
    
    // считываю
    PORTB &= ~0b00010000;   // chip select в 0
    SPI_MasterTransmit(0b00000110); //wren
    SPI_MasterTransmit(0b00000011); //read
    SPI_MasterTransmit(0b00000011); //address
    SPI_MasterTransmit(0b00000011); //address
        
    //SPCR |=(0x0C);
    SPI_MasterTransmit(0xff);   // бросаем данные чтобы генерировались такты на sck
    readdata= SPDR;//            // считываю данные
    SPI_MasterTransmit(0xff);
    readdata1= SPDR;
    SPI_MasterTransmit(0xff);
    readdata2= SPDR;
    PORTB |= 0b00010000;            // chip select в 1
    /////////////////////////////////////////////////////////////////
    
     while(!( UCSRA & (1 << UDRE)));
        UDR = readdata;                    //передаю на PC по USART
        while(!( UCSRA & (1 << UDRE)));
        UDR = readdata1;
        while(!( UCSRA & (1 << UDRE)));
        UDR = readdata2;
        
    ToggleBit(DDRC,7);        //мигаю диодом
        
}  

void main(void)
{
    SPI_MasterInit();
    InitUART();
    UCSRB |= (1<<RXCIE); // enable UART interrupts
    
     while(1)
        {
                 SEI();    
                
        }

}
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 25th August 2025 - 06:34
Рейтинг@Mail.ru


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