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

 
 
5 страниц V  < 1 2 3 4 > »   
Reply to this topicStart new topic
> Чтение\запись по SPI
_Артём_
сообщение 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

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

 


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


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