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

 
 
 
Reply to this topicStart new topic
> SPI SAM7X256 в режиме slave и при использовании PDC, поиск момента синхронизации
bookevg
сообщение Nov 10 2008, 06:26
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 320
Регистрация: 13-09-06
Пользователь №: 20 348



Ситуация:
Есть DSP-процессора и процессор SAM7X256. Общение между ними по SPI каналу в режиме DMA (PDC в случае с SAM7X256) большим потоком данных - 1кбайт, при этом SAM7X256 в режиме slave.
Проблематика:
Для того, чтобы SAM7X256 правильно начал принимать весь пакет - он должен запустить SPI-DMA перед тем, как DSP начнет передавать данные, иначе он все равно примет эти данные (если нет таймаута по приему), т.к. посылка закольцована, но структура принятых/переданных данных будет неправильной.
Задача:
Настроить алгоритм поиска момента активазиции режима slave SPI-DMA SAM7X256.
Решение.
1-ый способ.
Он основан на том, что существует какая-то временная пауза (пусть она составляет 5 мс) в общении двух процессоров
1) запускаем таймер на 2 мс;
2) разрешаем прерывание по поиску полож.фронта выбор slave SPI SAM7X256 (прерывание NSS Rising Interrupt);
3) в случае возникновения прерывания NSS Rising Interrupt перезапускаем таймер на 2 мс;
4) в случае срабатывания таймера разрешаем работу slave SPI-DMA;
5) после работы slave SPI-DMA возвращаемся в п.1 или просто разрешаем повторный slave SPI-DMA
2-ой способ.
Надо думать как еще сделать. Возможно использование допол.ножек.

Какие еще будут предложения?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 10 2008, 07:07
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(bookevg @ Nov 10 2008, 09:26) *
Общение между ними по SPI каналу в режиме DMA (PDC в случае с SAM7X256) большим потоком данных - 1кбайт, при этом SAM7X256 в режиме slave.

1кБайт - это объем, поток какой?

Цитата(bookevg @ Nov 10 2008, 09:26) *
Какие еще будут предложения?

Придумать протокол верхнего уровня для восстановления синхронизации - это куда лучший способ, чем ловить паузы.
И в связке с DSP, ИМХО, логичнее использовать SSC.
Go to the top of the page
 
+Quote Post
VslavX
сообщение Nov 10 2008, 07:39
Сообщение #3


embarrassed systems engineer
*****

Группа: Свой
Сообщений: 1 083
Регистрация: 24-10-05
Из: Осокорки
Пользователь №: 10 038



Хм, я чего-то недопонял - если SAM7 в режиме Slave - то тактовая на SPI вроде должна генерироваться вторым процессором? И пока тактовая на SPI не пойдет - то данных SAM7 принимать по SPI не будет - автоматически будет ждать начала пакета. Так в чем именно проблема?
Go to the top of the page
 
+Quote Post
_dem
сообщение Nov 10 2008, 07:40
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 263
Регистрация: 2-02-07
Из: CN, Ukraine
Пользователь №: 24 970



Вам надо из синхронного протокола сделать асинхронный. В таком случае либо SSC, либо городите свой мини-протокол более высокого уровня. Хотя, если с SPI у вас возникают проблемы такого плана, то SSC ситуацию не спасет.

Правда, возникает ряд вопросов -
- почему SAM - slave ?
- почему, если это ваша система, Вы не знаете, на какой размер данных нужно запускать PDC ?
- почему, если SAM - slave, возникают-таки проблемы с PDC ? Он же работает по клоку от мастера, т.е. зарядили PDC, дождались окончания приема, зарядили следующий буфер...
Go to the top of the page
 
+Quote Post
bookevg
сообщение Nov 10 2008, 09:28
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 320
Регистрация: 13-09-06
Пользователь №: 20 348



Цитата(VslavX @ Nov 10 2008, 10:39) *
Хм, я чего-то недопонял - если SAM7 в режиме Slave - то тактовая на SPI вроде должна генерироваться вторым процессором? И пока тактовая на SPI не пойдет - то данных SAM7 принимать по SPI не будет - автоматически будет ждать начала пакета. Так в чем именно проблема?

Попробую уточнить проблему:
Предположим подали питание на оба процессора, они проинициализировались, но каждый по разному. Предположим master быстрее и начал передавать данные размером 1024 байт, а slave не успел. Пусть slave начал принимать со 2-ого символа, т.о. он примет 1023 байта, затем он ждет приема последнего байта, дожидается его. Но при этом получается, что 1 байт в slave - это 2-ой в master, 2 байт в slave - это 3-bй в master ... 1024 байт в slave - это 1-ый в master. Т.о. получается смещение данных.
Данную проблему можно решить, если master подождет slave. Но предположим, что находимся в отладке на slave, а мастер работает самостоятельно, тогда проблема возникает вновь.

Цитата(_dem @ Nov 10 2008, 10:40) *
Вам надо из синхронного протокола сделать асинхронный. В таком случае либо SSC, либо городите свой мини-протокол более высокого уровня. Хотя, если с SPI у вас возникают проблемы такого плана, то SSC ситуацию не спасет.

Правда, возникает ряд вопросов -
- почему SAM - slave ?

Ну будет SAM-мастером, то проблема нужно будет решать у другого процессора, который slave.
Цитата(_dem @ Nov 10 2008, 10:40) *
- почему, если это ваша система, Вы не знаете, на какой размер данных нужно запускать PDC ?

Размер известен - 1024 байт
Цитата(_dem @ Nov 10 2008, 10:40) *
- почему, если SAM - slave, возникают-таки проблемы с PDC ? Он же работает по клоку от мастера, т.е.
зарядили PDC, дождались окончания приема, зарядили следующий буфер...

Да это так. Постом выше я попытался дать более точную деталировку проблемы
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 10 2008, 09:42
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



1. Используйте SSC - так у Вас хотя бы не будет проблем с синхронизацией внутри слов (а с SPI в slave-режиме они будут).
2. Используйте протокол верхнего уровня для разбора принятых данных.
Go to the top of the page
 
+Quote Post
Dron_Gus
сообщение Nov 10 2008, 11:15
Сообщение #7


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

Группа: Свой
Сообщений: 1 202
Регистрация: 9-01-05
Из: Санкт-Петербург
Пользователь №: 1 861



Используйте тайм-аут. Если за заданый промежуток времени PDC не вычитал нужный объем (не сгенерировал прерывание), значит у вас сдвиг - сбрасываете указатели и заново инициализируете PDC.


--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
Go to the top of the page
 
+Quote Post
_dem
сообщение Nov 10 2008, 13:54
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 263
Регистрация: 2-02-07
Из: CN, Ukraine
Пользователь №: 24 970



Вы жестко привязаны к типу интерфейса ?
Передача односторонняя ?

Хм, протяните еще одну линию, которая будет изображать из себя "BUSY" и по ней стартуйте прием.
Go to the top of the page
 
+Quote Post
amw
сообщение Nov 11 2008, 12:13
Сообщение #9


Знающий
****

Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847



Цитата(bookevg @ Nov 10 2008, 11:28) *
Попробую уточнить проблему:
Предположим подали питание на оба процессора, они проинициализировались, но каждый по разному. Предположим master быстрее и начал передавать данные размером 1024 байт, а slave не успел. Пусть slave начал принимать со 2-ого символа, т.о. он примет 1023 байта, затем он ждет приема последнего байта, дожидается его. Но при этом получается, что 1 байт в slave - это 2-ой в master, 2 байт в slave - это 3-bй в master ... 1024 байт в slave - это 1-ый в master. Т.о. получается смещение данных.
Данную проблему можно решить, если master подождет slave. Но предположим, что находимся в отладке на slave, а мастер работает самостоятельно, тогда проблема возникает вновь.
Ну будет SAM-мастером, то проблема нужно будет решать у другого процессора, который slave.

Ну у SPI есть такой пин - SLAVE SELECT (не помню как он называется в AT91). Типа CS для слейва.
Или с ним проблема тоже?

Вот посмотрел
Он называется NPCS0/NSS у SAM7X256.

Сообщение отредактировал amw - Nov 11 2008, 12:20


--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть.
© Lewis Carroll. Alice's adventures in wonderland.
Go to the top of the page
 
+Quote Post
VslavX
сообщение Nov 11 2008, 13:06
Сообщение #10


embarrassed systems engineer
*****

Группа: Свой
Сообщений: 1 083
Регистрация: 24-10-05
Из: Осокорки
Пользователь №: 10 038



Цитата(bookevg @ Nov 10 2008, 11:28) *
Попробую уточнить проблему:
Предположим подали питание на оба процессора, они проинициализировались, но каждый по разному. Предположим master быстрее и начал передавать данные размером 1024 байт, а slave не успел. Пусть slave начал принимать со 2-ого символа, т.о. он примет 1023 байта, затем он ждет приема последнего байта,

Такую проблему можно решить дополнительной синхронизацией начала пакета. Способов несколько, самые простые - отлавливать начало пакета по тайм-ауту, или ввести начальную синхрогруппу и продумать соответственно некоторый формат пакета, с дополнительной контрольной суммой в конце.
Go to the top of the page
 
+Quote Post
bookevg
сообщение Nov 13 2008, 13:27
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 320
Регистрация: 13-09-06
Пользователь №: 20 348



Резюме: 1-ый способ удался и надежно работает, осталось только CRC32 добавить
Go to the top of the page
 
+Quote Post

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

 


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


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