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

 
 
> Как работать с SPI?, STM32F103
777777
сообщение Sep 1 2011, 04:37
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357



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

Сообщение отредактировал 777777 - Sep 1 2011, 04:41
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
AHTOXA
сообщение Sep 1 2011, 05:51
Сообщение #2


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



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


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
777777
сообщение Sep 1 2011, 07:45
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357



Цитата(AHTOXA @ Sep 1 2011, 09:51) *
Есть буфер передачи, и есть сдвиговый регистр. Прерывание передатчика возникает при опустошении буфера. Сдвиговый регистр в это время ещё не пуст, и передача ещё идёт. Это обеспечивает непрерывность передачи.

Значит можно пользоваться только прерыванием приемника? Максимум что от этого будет - промежутки в передаче байтов.
Цитата(AHTOXA @ Sep 1 2011, 09:51) *
Добавлю, что сбрасывать чипселект нужно чуть позже, чем возникнет прерывание от приёмника последнего байта. Потому что в момент этого прерывания клок ещё не дотикал.

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

Цитата(Flexz @ Sep 1 2011, 10:06) *
Еще перед началом передачи стоит вычитывать DR дабы удостовериться, что прерывание RXNE не возникнет сразу после включения SPI.

У меня сложилось впечатление, что если его не вычитывать, то новая передача не начинается вообще.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Sep 1 2011, 07:56
Сообщение #4


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(777777 @ Sep 1 2011, 13:45) *
Значит можно пользоваться только прерыванием приемника? Максимум что от этого будет - промежутки в передаче байтов.

Да.

Цитата(777777 @ Sep 1 2011, 13:45) *
А почему же прерывание возникло если последний клок не дотикал? Об этом написано в даташите? В любом случае, я полагаю, что пока программа войдет в прерывание, он уже дотикает? Частота SPI 1.25 МГц.

Потому что прерывание возникает сразу же, как только защёлкнется последний бит байта. То есть, при CHPA=0 - по первому перепаду SCK. Даташит про это явно не говорит. Это - практические граблиsm.gif
Успеет или нет дотикать за время входа в прерывание - посмотрите по осциллографу. Думаю, что придётся добавить несколько NOP-ов.

Цитата(Flexz @ Sep 1 2011, 12:06) *
Чипселект можно снимать при получении последнего RXNE.

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


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
777777
сообщение Sep 1 2011, 08:06
Сообщение #5


Профессионал
*****

Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357



Цитата(AHTOXA @ Sep 1 2011, 11:56) *
Потому что прерывание возникает сразу же, как только защёлкнется последний бит байта. То есть, при CHPA=0 - по первому перепаду SCK. Даташит про это явно не говорит. Это - практические граблиsm.gif

А, понятно, но ведь это уже не страшно - последний бит уже защелкнулся, а что там будет с устройством при убирании чипселекта - нас уже не интересует. Впрочем, зависит от устройства.
Цитата(AHTOXA @ Sep 1 2011, 11:56) *
Успеет или нет дотикать за время входа в прерывание - посмотрите по осциллографу. Думаю, что придётся добавить несколько NOP-ов.

Несколько NOP-ов не страшно, у меня же проблема хуже - у меня тут дурная микросхема ADS1282, там даташит требует чтобы между байтами были паузы не меньше 6 мкс. А у меня при синхронизации по RXNE паузы получились 1,5...2 мкс. Вот не знаю как их обеспечить - задержку в обработчике прерывания лепить некрасиво, а заряжать таймер на 6 микросекунд - тоже глупо.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Sep 1 2011, 08:22
Сообщение #6


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(777777 @ Sep 1 2011, 14:06) *
А, понятно, но ведь это уже не страшно - последний бит уже защелкнулся, а что там будет с устройством при убирании чипселекта - нас уже не интересует. Впрочем, зависит от устройства.

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

Цитата(777777 @ Sep 1 2011, 14:06) *
заряжать таймер на 6 микросекунд - тоже глупо.
Почему же глупо? Это очень приличное время по меркам 72МГц, 432 такта. Вполне можно зарядить.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 19:57
Рейтинг@Mail.ru


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