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

 
 
> Один SPI на два дивайса
Oleg_IT
сообщение Nov 23 2015, 07:17
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 922
Регистрация: 3-06-05
Из: Москва
Пользователь №: 5 709



STM32F417. Есть два дивайса, датчик температуры и управляемый резистор, из первого нужно только читать данные, во второй только писать, выводы MOSI, MISO развожу по соответствующим девайсам, CS понятно разные. SPI2 назначать как Full-Duplex Master?
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 16)
arhiv6
сообщение Nov 23 2015, 07:23
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 633
Регистрация: 21-05-10
Из: Томск
Пользователь №: 57 423



Да, это будет случай Full-Duplex Master.


--------------------
Go to the top of the page
 
+Quote Post
Oleg_IT
сообщение Nov 23 2015, 07:39
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 922
Регистрация: 3-06-05
Из: Москва
Пользователь №: 5 709



Спасибо.
Go to the top of the page
 
+Quote Post
Oleg_IT
сообщение Dec 11 2015, 08:55
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 922
Регистрация: 3-06-05
Из: Москва
Пользователь №: 5 709



Так не получается. Проект генерю из STM32CubeMx. Пока работаю только с датчиком температуры, подключены SO, SCK и CS. Если конфигурить SPI как Full-Duplex Master то программа виснет на чтении данных, если как Receive Only Msster то данные идут, но не полностью.
SPI сконфигурю с DMA, когда наступает момент чтения температуры вызываю функции
Код
    uint16_t Temp; // Значение измеренной температуры
…………………………………………………
    HAL_GPIO_WritePin(GPIOA,CS_Termo_Pin,GPIO_PIN_RESET);
    HAL_SPI_Receive_DMA(&hspi1,(uint8_t*)&Temp,2);

По окончанию работы DMA вызывается прерывание со статусом HAL_DMA_STATE_READY_MEM0, поднимаю пин CS
Код
    HAL_GPIO_WritePin(GPIOA,CS_Termo_Pin,GPIO_PIN_SET);


Но по осциллографу вижу, что CS отключает датчик температуры ровно посередине второго байта. Соответственно первый байт приходит, видно он меняется, второго байта нет. Почему так может быть? В какой момент отключать CS?

Как правильно работать с несколькими девайсами ни одном SPI? Нужно и одно чтение и одна запись и Full-Duplex Master для третьего девайса.
Go to the top of the page
 
+Quote Post
Obam
сообщение Dec 11 2015, 09:29
Сообщение #5


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663



"…Как правильно работать с несколькими девайсами ни одном SPI?…"

Каждому ведомому свой отдельный CS. MOSI, MISO общие для всех ведомых. В каждый конкретный момент времени общение идёт с одним конкретным ведомым (активен только один CS).


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
Oleg_IT
сообщение Dec 11 2015, 09:46
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 922
Регистрация: 3-06-05
Из: Москва
Пользователь №: 5 709



Цитата(Obam @ Dec 11 2015, 13:29) *
Каждому ведомому свой отдельный CS. MOSI, MISO общие для всех ведомых. В каждый конкретный момент времени общение идёт с одним конкретным ведомым (активен только один CS).

Я так и делаю, у меня пока один девайс с одной линией SO и с Full-Duplex Master не работает. Наверное придётся переключать Full-Duplex Master <-> Receive Only Msster <-> Transmit Only Msster
Go to the top of the page
 
+Quote Post
Obam
сообщение Dec 11 2015, 10:50
Сообщение #7


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663



Цитата(Oleg_IT @ Dec 11 2015, 12:55) *
SPI сконфигурю с DMA, когда наступает момент чтения температуры вызываю функции
Код
    uint16_t Temp; // Значение измеренной температуры
…………………………………………………
    HAL_GPIO_WritePin(GPIOA,CS_Termo_Pin,GPIO_PIN_RESET);
    HAL_SPI_Receive_DMA(&hspi1,(uint8_t*)&Temp,2);

По окончанию работы DMA вызывается прерывание со статусом HAL_DMA_STATE_READY_MEM0, поднимаю пин CS
Код
    HAL_GPIO_WritePin(GPIOA,CS_Termo_Pin,GPIO_PIN_SET);


Но по осциллографу вижу, что CS отключает датчик температуры ровно посередине второго байта. Соответственно первый байт приходит, видно он меняется, второго байта нет. Почему так может быть? В какой момент отключать CS?

Как правильно работать с несколькими девайсами ни одном SPI? Нужно и одно чтение и одна запись и Full-Duplex Master для третьего девайса.


CS снимается, когда DMA записал последний байт в DR, а должен сниматься когда вычитан последний байт из DR. Вообще странно: цикл SPI это одновременное запись-чтение и надёжным признаком является заполнение DR принятым.
Может есть другой более подходящий статус HAL_DMA_STATE_****


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
scifi
сообщение Dec 11 2015, 10:58
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(Oleg_IT @ Dec 11 2015, 11:55) *
Так не получается. Проект генерю из STM32CubeMx.

По-моему, вывод очевиден. Куб - в топку. Накодить всё самостоятельно, как принято у настоящих мущщин laughing.gif
Go to the top of the page
 
+Quote Post
Oleg_IT
сообщение Dec 11 2015, 13:34
Сообщение #9


Знающий
****

Группа: Свой
Сообщений: 922
Регистрация: 3-06-05
Из: Москва
Пользователь №: 5 709



Цитата(scifi @ Dec 11 2015, 14:58) *
По-моему, вывод очевиден. Куб - в топку.

А что таково в нём плохого? Открытый код делает, что не нравится можно менять, дорабатывать, знать бы что, где.
Go to the top of the page
 
+Quote Post
Obam
сообщение Dec 11 2015, 14:19
Сообщение #10


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663



Вот тут-то и парадокс: когда знаешь что и где "кубы" без надобности.

Так почему DMA, не приняв последний байт, отваливался?


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
Oleg_IT
сообщение Dec 11 2015, 14:40
Сообщение #11


Знающий
****

Группа: Свой
Сообщений: 922
Регистрация: 3-06-05
Из: Москва
Пользователь №: 5 709



Цитата(Obam @ Dec 11 2015, 18:19) *
Вот тут-то и парадокс: когда знаешь что и где "кубы" без надобности.

Так почему DMA, не приняв последний байт, отваливался?

Да ни какого парадокса, просто экономия времени и можно посмотреть как люди программы пишут, если опыта мало.

А с DMA пока не пойму. в прерывания он входит только с HAL_DMA_STATE_READY_MEM0, сконфигурил я его так. Я вот думаю, может в SPI флаг окончания приёма контролировать, в основном цикле и когда прерывание от DMA пришло. Кривовато это как-то.
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Dec 12 2015, 01:07
Сообщение #12


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

Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439



Цитата(Oleg_IT @ Dec 11 2015, 17:40) *
Да ни какого парадокса, просто экономия времени и можно посмотреть как люди программы пишут, если опыта мало.

А с DMA пока не пойму. в прерывания он входит только с HAL_DMA_STATE_READY_MEM0, сконфигурил я его так. Я вот думаю, может в SPI флаг окончания приёма контролировать, в основном цикле и когда прерывание от DMA пришло. Кривовато это как-то.


Контролировать в цикле неправильно.
Во первых есть аппаратный CS, который праввильно поведет себя.
Если совсем нет выбора, а надо подключить несколько SPI устройств, то можно включить их последовательно. Поищите по ключевым словам daisy chain.
SPI устройство это регистр сдвига, который защелкивает информацию по положительному фронту CS. Для записи в устройство в конце цепочки вам придется формировать посылку из нескольких слов, чтобы нужное дошло.
Ну вот например так как здесь описано:
https://en.wikipedia.org/wiki/Serial_Periph...l_Interface_Bus

Есть и другие способы, но это уже если устройство их поддерживает.

А куб мне пока нравится.
Go to the top of the page
 
+Quote Post
Oleg_IT
сообщение Dec 13 2015, 14:18
Сообщение #13


Знающий
****

Группа: Свой
Сообщений: 922
Регистрация: 3-06-05
Из: Москва
Пользователь №: 5 709



Заметил особенность, при увеличении BaudRatePrescaler общее время приёма растёт быстрее чем время нахождения CS в открытом состоянии, т.е. при BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2(4, 8, 16) приём укладывается в CS == 0, а когда BaudRatePrescaler больше, приём обрезается. Похоже DMA живёт отдельно от SPI.

CS аппаратный не подходит, для каждого девайса у меня он свой. Теорию SPI я знаю, но сейчас не в ней проблема.
Go to the top of the page
 
+Quote Post
Oleg_IT
сообщение Dec 14 2015, 06:41
Сообщение #14


Знающий
****

Группа: Свой
Сообщений: 922
Регистрация: 3-06-05
Из: Москва
Пользователь №: 5 709



Цитата(Tarbal @ Dec 12 2015, 05:07) *
Контролировать в цикле неправильно.

Не правильно, но работает. Почему прерывание раньше происходит так и не понял, может так задумано.
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Dec 14 2015, 14:26
Сообщение #15


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

Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439



Цитата(Oleg_IT @ Dec 14 2015, 10:41) *
Не правильно, но работает. Почему прерывание раньше происходит так и не понял, может так задумано.


Пренебрежение опытом -- источник "необъяснимых" чудес в поведении разрабатываемого устройства.

Бывает, что несколько событий могут вызвать прерывание по одному и тому же вектору.
Если это так, то прочитайте в прерывании флаги и определите то ли прерывание произошло, которого вы ожидали. Если не то, то покинте (если вам его не надо обрабатывать) обработчик.
Go to the top of the page
 
+Quote Post
Oleg_IT
сообщение Dec 15 2015, 05:42
Сообщение #16


Знающий
****

Группа: Свой
Сообщений: 922
Регистрация: 3-06-05
Из: Москва
Пользователь №: 5 709



Цитата(Tarbal @ Dec 14 2015, 18:26) *
Пренебрежение опытом -- источник "необъяснимых" чудес в поведении разрабатываемого устройства.

Бывает, что несколько событий могут вызвать прерывание по одному и тому же вектору.
Если это так, то прочитайте в прерывании флаги и определите то ли прерывание произошло, которого вы ожидали. Если не то, то покинте (если вам его не надо обрабатывать) обработчик.

Не мой случай, это прерывание возникает только один раз за период обмена, проверено.
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Dec 15 2015, 12:09
Сообщение #17


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

Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439



Цитата(Oleg_IT @ Dec 15 2015, 08:42) *
Не мой случай, это прерывание возникает только один раз за период обмена, проверено.


Вопрос стоит не сколько раз происходит прерывание, а какие флаги разрешения прерывания и какие флаги событий установлены. Вы ведь хотите понять что происходит. Так начинайте расследование планомерно и тщательно. Если хотите отгадать или чтобы вам кто-нибудь другой отгадал в чем дело, то игнорируйте мои рекомендации.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 24th July 2025 - 03:20
Рейтинг@Mail.ru


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