|
at91sam7s spi, Помогите понять что происходит |
|
|
|
Feb 27 2010, 12:31
|
Участник

Группа: Участник
Сообщений: 59
Регистрация: 31-01-08
Пользователь №: 34 612

|
Здравствуйте, подскажите что к чему. Есть есть задача связать at91sam7s256(мастер) и attinny85(слейв) по SPI, всё сделал как написано по даташиту, связь есть но странная.От мастера к слейву данные доходят нормально а вот от слейва они как будто идут с задержкой в 2 байта. Как будто приём SPI настроен на 24 бита. прием мастером осуществлён вот так Код AT91PS_SPI pSPI = AT91C_BASE_SPI; while( !( pSPI->SPI_SR & AT91C_SPI_TDRE ) ); // transfer compl. wait pSPI->SPI_TDR = (dat & 0xFFFF) | (((~(1 << 2)) & 0xF)<< 16);
while( !( pSPI->SPI_SR & AT91C_SPI_RDRF ) ); // wait for char
return (unsigned char)( pSPI->SPI_RDR ); // it's important to read RDR here! зы. тяжёло описать правельно что у меня происходит но думаю кто с этим сиалкивался поймёт.
|
|
|
|
|
Feb 27 2010, 14:12
|
Участник

Группа: Участник
Сообщений: 59
Регистрация: 31-01-08
Пользователь №: 34 612

|
aaarrr , спасибо действительно помогло. вот ещё есть вопросик. Код SlaveSPITransfer: out USIDR,r16 ldi r16,(1<<USIOIF) out USISR,r16 SlaveSPITransfer_loop: in r16, USISR sbrs r16, USIOIF rjmp SlaveSPITransfer_loop in r16,USIDR ret в данном примере для слейва сначало идет передача а потом приём.А можно наоборот сначала прием обработка и передача. а то как то вся логика теряется. спасибо
|
|
|
|
|
Feb 27 2010, 14:25
|
Участник

Группа: Участник
Сообщений: 59
Регистрация: 31-01-08
Пользователь №: 34 612

|
да я понимаю , спросил так на всякий случай, а вдруг. Цитата Все остальное решается протоколами верхнего уровня. а это как , ткните ссылкой если не затруднит.
|
|
|
|
|
Feb 27 2010, 14:40
|
Участник

Группа: Участник
Сообщений: 59
Регистрация: 31-01-08
Пользователь №: 34 612

|
aaarrr, ещё раз спасибо.Буду думать примерять.
|
|
|
|
|
Apr 14 2010, 11:02
|
Участник

Группа: Участник
Сообщений: 40
Регистрация: 8-07-07
Из: Ярославль
Пользователь №: 28 962

|
Потери в PDC еще возникают из-за загруженности внутренней шины ARM-а Замечал такое когда работа идет на высоких скоростях.
|
|
|
|
|
Apr 14 2010, 11:43
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(shrek @ Apr 14 2010, 12:02)  У меня была почти такая же проблема с SPI только я его использовал и использую с PDC. В первом случае в шине стояли резисторы по 300 Ом... Из-за этого спустя некоторое время при отправке команд протокольных и прочее пакет сдвигался на один байт... выпаял резисторы поставил перемычки глюк исчез! А объяснить Вы столь странную связь можете? Я - нет. И очень-очень сильно сомневаюсь, что дело было в резисторах. Цитата(strannyi @ Apr 14 2010, 15:17)  Потери в PDC еще возникают из-за загруженности внутренней шины ARM-а Замечал такое когда работа идет на высоких скоростях. Когда PDC пытается отгрызть более 1/8 пропускной способности шины - да, бывает. Правда, одного SPI для этого мало. P.S. Если кто не заметил, проблема топикстартера решена.
|
|
|
|
|
May 21 2010, 11:14
|
Частый гость
 
Группа: Участник
Сообщений: 125
Регистрация: 1-12-08
Из: г. Орел
Пользователь №: 42 126

|
Цитата А объяснить Вы столь странную связь можете? Я - нет. И очень-очень сильно сомневаюсь, что дело было в резисторах. Могу! Помехи от двигателя постоянного тока. Из за резисторов вероятность возникновения глюка стала 0.99! Практически всегда после начала работы шумящего элемента глюк вылезал! Поставил перемычки вероятность возникновения снизилась примерно до 0.01. А с работой шагового двигателя (и такой имеется в приборе, требовалась реализация микрошага) вероятность глюка повысилась до 0.3 - 0.4. Проблему решил программно. При ошибке CRC slave устройства перезапускали SPI и перенастраивали канал PDC. Работоспособность восстановилась. Байты бегали туда сюда, данными модули между собой обменивались) Цитата P.S. Если кто не заметил, проблема топикстартера решена. мне кажется эта тема и проблема будет всегда возникать))) пора бы выложить рекомендации в отдельную тему форума по настройке и работе с SPI)))
Сообщение отредактировал shrek - May 21 2010, 11:15
|
|
|
|
|
May 21 2010, 11:22
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(shrek @ May 21 2010, 15:14)  Могу! Помехи от двигателя постоянного тока. Сдвиг на один байт объяснить можете? Ведь не на один бит, не на 5, 6 или 11, а ровно на байт. Такая умная помеха? Цитата(shrek @ May 21 2010, 15:14)  мне кажется эта тема и проблема будет всегда возникать))) пора бы выложить рекомендации в отдельную тему форума по настройке и работе с SPI))) Это большой и неблагодарный труд. Вообще, для понимания работы атмеловского SPI из SAM7 нужно: 1. Изучить даташит 2. Изучить аппноту для толкования неясностей даташита (а они есть) 3. Задать вопрос здесь, если не помогло
|
|
|
|
|
May 24 2010, 05:57
|

Местный
  
Группа: Свой
Сообщений: 370
Регистрация: 7-11-06
Пользователь №: 22 035

|
Цитата(aaarrr @ May 21 2010, 15:22)  Вообще, для понимания работы атмеловского SPI из SAM7 нужно: 1. Изучить даташит 2. Изучить аппноту для толкования неясностей даташита (а они есть) 3. Задать вопрос здесь, если не помогло  Я бы ещё один пункт добавил. 4. Изучить errata. Он весьма обширный, в том числе и на SPI.
|
|
|
|
|
May 27 2010, 06:59
|
Частый гость
 
Группа: Участник
Сообщений: 125
Регистрация: 1-12-08
Из: г. Орел
Пользователь №: 42 126

|
Цитата Сдвиг на один байт объяснить можете? Ведь не на один бит, не на 5, 6 или 11, а ровно на байт. Такая умная помеха? счетчик PDC делает декремент после принятия именно байта. Возникла помеха SPI посчитал что это очердной тактовый импульс (или несколько, или вообще не посчитал что был тактовый импульс). В PDC байты ушли раньше положенного (или вообще не ушли, т.е. уйдут при следующем обращении мастера к слейву), а мастер допустим еще передает (к случаю если PDC слейва раньше примет байты). Если прерывание быстро обрабатывается (например PDC заново инициализируется в начале работы подпрограммы обработки прерывания, а частота тактовых импульсов SPI не превышает 1МГц), то получается мастер еще не окончил предыдущую передачу, а слейв уже новую начинает... Примерно по тому же принципу если бы слейв был настроен на прием передачу 8 байт, а мастер на прием передачу 9 байт.
Сообщение отредактировал shrek - May 27 2010, 07:08
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|