|
|
  |
SPI SAM7X256 в режиме slave и при использовании PDC, поиск момента синхронизации |
|
|
|
Nov 10 2008, 07:07
|
Гуру
     
Группа: Свой
Сообщений: 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.
|
|
|
|
|
Nov 10 2008, 07:40
|
Местный
  
Группа: Свой
Сообщений: 263
Регистрация: 2-02-07
Из: CN, Ukraine
Пользователь №: 24 970

|
Вам надо из синхронного протокола сделать асинхронный. В таком случае либо SSC, либо городите свой мини-протокол более высокого уровня. Хотя, если с SPI у вас возникают проблемы такого плана, то SSC ситуацию не спасет.
Правда, возникает ряд вопросов - - почему SAM - slave ? - почему, если это ваша система, Вы не знаете, на какой размер данных нужно запускать PDC ? - почему, если SAM - slave, возникают-таки проблемы с PDC ? Он же работает по клоку от мастера, т.е. зарядили PDC, дождались окончания приема, зарядили следующий буфер...
|
|
|
|
|
Nov 10 2008, 09:28
|
Местный
  
Группа: Свой
Сообщений: 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, дождались окончания приема, зарядили следующий буфер... Да это так. Постом выше я попытался дать более точную деталировку проблемы
|
|
|
|
|
Nov 11 2008, 12:13
|
Знающий
   
Группа: Свой
Сообщений: 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.
|
|
|
|
|
Nov 11 2008, 13:06
|

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

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