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

 
 
 
Reply to this topicStart new topic
> Как работать с 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
AHTOXA
сообщение Sep 1 2011, 05:51
Сообщение #2


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

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



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


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


Местный
***

Группа: Свой
Сообщений: 252
Регистрация: 9-10-08
Из: Московская обл.
Пользователь №: 40 797



Чипселект можно снимать при получении последнего RXNE.
Еще перед началом передачи стоит вычитывать DR дабы удостовериться, что прерывание RXNE не возникнет сразу после включения SPI.
Go to the top of the page
 
+Quote Post
777777
сообщение Sep 1 2011, 07:45
Сообщение #4


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

Группа: Участник
Сообщений: 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
Сообщение #5


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

Группа: Свой
Сообщений: 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
Сообщение #6


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

Группа: Участник
Сообщений: 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
Сообщение #7


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

Группа: Свой
Сообщений: 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 Текстовая версия Сейчас: 20th July 2025 - 09:52
Рейтинг@Mail.ru


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