Jump to content
    

Чтение\запись по SPI

Если можно "общаться" через один вывод, то зачем их делают 2?

C двумя линиями можно передавать данные в обе стороны одновременно.

 

Share this post


Link to post
Share on other sites

C двумя линиями можно передавать данные в обе стороны одновременно.

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

Edited by d7d1cd

Share this post


Link to post
Share on other sites

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

 

Это значит писать и читать данные одновременно. Например читать из RAM и писать в DAC ... вроде как быстрее получиться :)

Share this post


Link to post
Share on other sites

Понятно. То есть, в моем случае, я и читаю и записываю данные через пин SI. А делать то же самое через пин SO можно?

Share this post


Link to post
Share on other sites

То есть, в моем случае, я и читаю и записываю данные через пин SI. А делать то же самое через пин SO можно?

Если не используется аппаратный spi и SI и SO объединены, то читать и передавать мастер может через любой из них. Но slave может читать данные только с SI, а передавать в SO.

 

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Понятно. То есть, в моем случае, я и читаю и записываю данные через пин SI. А делать то же самое через пин SO можно?

Я не понял, кто и где вас так "нагрузил", но вы ошибаетесь. Причем ошибка уже в нарисованной вами схеме из корневого поста. М/c c интерфейсом SPI имеют раздельные входы и выходы данных. Нельзя прочитать данные через вход м/с SPI EEPROM. Для этого (попеременного чтения/записи) вход и выход данных м/с должны быть как минимум объединены между собой. Так что, в вашей схеме ошибка: а) нет линии связи между объединенными выходами м/с FRAM.EEPROM и каким-либо пином МК и б) поскольку на схеме раздельно объединены входы данных и выходы данных, то следовательно линии записи и чтения данных в МК тоже должны быть раздельными.

Share this post


Link to post
Share on other sites

Я не понял, кто и где вас так "нагрузил", но вы ошибаетесь. Причем ошибка уже в нарисованной вами схеме из корневого поста. М/c c интерфейсом SPI имеют раздельные входы и выходы данных. Нельзя прочитать данные через вход м/с SPI EEPROM. Для этого (попеременного чтения/записи) вход и выход данных м/с должны быть как минимум объединены между собой. Так что, в вашей схеме ошибка: а) нет линии связи между объединенными выходами м/с FRAM.EEPROM и каким-либо пином МК и б) поскольку на схеме раздельно объединены входы данных и выходы данных, то следовательно линии записи и чтения данных в МК тоже должны быть раздельными.

Спасибо за указание на ошибку в схеме. Действительно, на самом деле у меня в схеме выходы SI соединены с выходами SO.

Я планирую такой алгоритм работы (например чтение байта из м\с):

 

1. Отправляю в м\с инструкцию на чтение регистра статуса;

2. Читаю регистр статуса;

3. Если бит WIP в регистре статуса равен 1, то перехожу к пункту 2;

4. Отправляю в м\с инструкцию на чтение и адрес чтения;

5. Читаю байт информации

 

Вопрос такой: сколько раз необходимо выполнить цикл 2-3, перед тем, как сообщить, что чтение невозможно?

Edited by d7d1cd

Share this post


Link to post
Share on other sites

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

Вопрос такой: сколько раз необходимо выполнить цикл 2-3, перед тем, как сообщить, что чтение невозможно?
Готовность нужна при ожидании окончания записи. В datasheet M95256 указано максимальное время записи - 5мс. Вот в течение этого времени и нужно опрашивать готовность м/с EEPROM.

Share this post


Link to post
Share on other sites

Вопрос такой: сколько раз необходимо выполнить цикл 2-3, перед тем, как сообщить, что чтение невозможно?

Это перестраховка какая-то - память как правило либо работает либо нет.

Но если хочется можете секунду-другую задать время ожидания. Но нужно в даташит смотреть, какие там времена.

Share this post


Link to post
Share on other sites

Понятно. Еще вопрос возник относительно того, что у меня в м\с вывод SO и SI соединены вместе. Получается, что при получении данных из SO они (данные) одновременно будут воздействовать на SI.

Что, если при чтении данных из м\с будет читаться байт 0х05. Ведь в инструкциях м\с это чтение регистра статуса. Прочитав этот байт, м\с одновременно получит команду на выдачу регистра статуса и при дальнейшем тактировании выдаст на SO значение регистра статуса, а не следующий байт из массива данных. Подскажите, если я не прав в своих рассуждениях, то в чем я ошибаюсь?

Share this post


Link to post
Share on other sites

Подскажите, если я не прав в своих рассуждениях, то в чем я ошибаюсь?
Дык не надо рассуждать, коль имеете всего лишь смутные предположения о том, как все это работает :) Для вас основой должен стать datasheet м/с которую вы применяете. Изучите его досконально - вдоль и поперек, сверху вниз и снизу вверх. Ответы на 90% вопросов найдутся сами в ходе изучения. А вот остальные 10% ищите в других документах или спрашивайте окружающих.

Для того, чтобы вы отбросили свои беспокойства советую внимательно рассмотреть в datasheet M95256 временные диаграммы записи и чтения. Там вы можете заметить, что во время приема команды выход EEPROM находится в высокоимпедансном состоянии (Z-состояние) и не оказывает влияние на процесс приема команды. В то же время во время передачи данных самой м/с EEPROM она не чувствительна к входному битовому потоку данных. Конкретно по чтению регистра статуса см. Figure 10. Read Status Register (RDSR) sequence на стр.19.

Share this post


Link to post
Share on other sites

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

 

Хоть это верно? :blush:

Edited by d7d1cd

Share this post


Link to post
Share on other sites

Хоть это верно? :blush:
Да, это верно. SPI синхронный интерфейс. Прием/передача данных в нем происходит синхронно с тактовом сигналом. Но начало/конец битовой последовательности задается отдельным сигналом фреймовой синхронизации. В данной м/с им является CS. Кроме того, CS выполняет вторую функцию выбора кристалла. Пока CS не автивирован, интерфейс м/с индифферентен к входным сигналам. Каждый фрейм начинается с передачи м/с-ме EEPROM кода команды. Следом за командой могут транслироваться данные или данные может выдавать сама м/с EEPROM, если ей была принята соответствующая команда (чтение регистра или чтение данных). При выдаче данных м/с EEPROM уже не воспринимает битовый поток на своем входе до тех пор, пока сигнал фреймовой синхронизации не сигшнализирует ей о начале нового фрейма.

Share this post


Link to post
Share on other sites

Нк, слава транзистору! B) Спасибо за помощь. Пока вопросов нет. Приступил к реализации...

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...