Перейти к содержанию
    

Как работать с SPI?

Там для чего-то сделали отдельные прерывания приемника и передатчика. Но ведь это одно и то же! Допустим, я принимаю данные с устроства, для этого я сначала должен ему что-то передать. Могу ли я в прерывании передатчика считывать байт из DR? Есть ли гарантия, что он там уже есть? Ведь если байт передан, то это автоматически означает что и байт с устройства принят. И наоборот - если произошло прерывание премника и я считал байт, значит ли это, что SPI готов передавать следующий?

Изменено пользователем 777777

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть буфер передачи, и есть сдвиговый регистр. Прерывание передатчика возникает при опустошении буфера. Сдвиговый регистр в это время ещё не пуст, и передача ещё идёт. Это обеспечивает непрерывность передачи. Соответственно, считывать принятый байт надо в прерывании от приёмника, в прерывании от передатчика он ещё не готов.

Добавлю, что сбрасывать чипселект нужно чуть позже, чем возникнет прерывание от приёмника последнего байта. Потому что в момент этого прерывания клок ещё не дотикал.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Чипселект можно снимать при получении последнего RXNE.

Еще перед началом передачи стоит вычитывать DR дабы удостовериться, что прерывание RXNE не возникнет сразу после включения SPI.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть буфер передачи, и есть сдвиговый регистр. Прерывание передатчика возникает при опустошении буфера. Сдвиговый регистр в это время ещё не пуст, и передача ещё идёт. Это обеспечивает непрерывность передачи.

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

Добавлю, что сбрасывать чипселект нужно чуть позже, чем возникнет прерывание от приёмника последнего байта. Потому что в момент этого прерывания клок ещё не дотикал.

А почему же прерывание возникло если последний клок не дотикал? Об этом написано в даташите? В любом случае, я полагаю, что пока программа войдет в прерывание, он уже дотикает? Частота SPI 1.25 МГц.

 

Еще перед началом передачи стоит вычитывать DR дабы удостовериться, что прерывание RXNE не возникнет сразу после включения SPI.

У меня сложилось впечатление, что если его не вычитывать, то новая передача не начинается вообще.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Да.

 

А почему же прерывание возникло если последний клок не дотикал? Об этом написано в даташите? В любом случае, я полагаю, что пока программа войдет в прерывание, он уже дотикает? Частота SPI 1.25 МГц.

Потому что прерывание возникает сразу же, как только защёлкнется последний бит байта. То есть, при CHPA=0 - по первому перепаду SCK. Даташит про это явно не говорит. Это - практические грабли:)

Успеет или нет дотикать за время входа в прерывание - посмотрите по осциллографу. Думаю, что придётся добавить несколько NOP-ов.

 

Чипселект можно снимать при получении последнего RXNE.

Нет. См. выше.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Потому что прерывание возникает сразу же, как только защёлкнется последний бит байта. То есть, при CHPA=0 - по первому перепаду SCK. Даташит про это явно не говорит. Это - практические грабли:)

А, понятно, но ведь это уже не страшно - последний бит уже защелкнулся, а что там будет с устройством при убирании чипселекта - нас уже не интересует. Впрочем, зависит от устройства.

Успеет или нет дотикать за время входа в прерывание - посмотрите по осциллографу. Думаю, что придётся добавить несколько NOP-ов.

Несколько NOP-ов не страшно, у меня же проблема хуже - у меня тут дурная микросхема ADS1282, там даташит требует чтобы между байтами были паузы не меньше 6 мкс. А у меня при синхронизации по RXNE паузы получились 1,5...2 мкс. Вот не знаю как их обеспечить - задержку в обработчике прерывания лепить некрасиво, а заряжать таймер на 6 микросекунд - тоже глупо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А, понятно, но ведь это уже не страшно - последний бит уже защелкнулся, а что там будет с устройством при убирании чипселекта - нас уже не интересует. Впрочем, зависит от устройства.

При чтении действительно не важно. А вот при записи... Что если устройство ещё не успело защёлкнуть последний бит? Или ему непременно нужны все такты клока для того чтобы обработать команду? Не, тут лучше перестраховаться.

 

заряжать таймер на 6 микросекунд - тоже глупо.
Почему же глупо? Это очень приличное время по меркам 72МГц, 432 такта. Вполне можно зарядить.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...