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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Смещён приём через PDC для SPI
Goofy
сообщение Feb 14 2008, 10:33
Сообщение #16


Частый гость
**

Группа: Свой
Сообщений: 169
Регистрация: 17-09-07
Из: Красноярск
Пользователь №: 30 600



Это баг самого sam7s. Проявляется видимо не у всех, но

http://www.at91.com/phpbb/viewtopic.php?p=...2fa6260ff26533e

Судя по моим наблюдениям сбойно работает shift register SPI, все данные проходящие через него смещенны на байт вправо, очевидны глюки с переключением размера регистра. (я работал с 8битным). Проявляется в том, что при начале новой передачи, в буффер приёма попадает байт от конца предыдущей. От этого, кстати, при работе через PDC, RCR сразу потеряет единичку.

Уже жалею что с этим чипом связался, походу его и с производства сняли. Это первый в моей практике ARM и через такие стенодробительные процедуры... Закаляет однако smile.gif

Сообщение отредактировал Goofy - Feb 14 2008, 10:36
Go to the top of the page
 
+Quote Post
prottoss
сообщение Feb 14 2008, 11:03
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(Goofy @ Feb 14 2008, 17:33) *
Это баг самого sam7s.


1.Только что сравнил баги SPI SAM7S и SAM7X - все одно и тоже... Похоже баг только в вашем контроллере smile.gif включая "...плата там и правда вся в соплях из проводов..."

2.А как Вы узнали, что его сняли с производства? Вроде как продакшн везде написано 07.gif

http://www.atmel.com/dyn/products/param_ta...p;Direction=ASC

http://www.atmel.com/dyn/products/devices.asp?family_id=605

3. Чип и вправду кривоватый - кстати, тоже мой первенец 05.gif Но работать с ним, зная баги, можно.


--------------------
Go to the top of the page
 
+Quote Post
Goofy
сообщение Feb 14 2008, 13:14
Сообщение #18


Частый гость
**

Группа: Свой
Сообщений: 169
Регистрация: 17-09-07
Из: Красноярск
Пользователь №: 30 600



Цитата(prottoss @ Feb 14 2008, 18:03) *
1.Только что сравнил баги SPI SAM7S и SAM7X - все одно и тоже... Похоже баг только в вашем контроллере smile.gif включая "...плата там и правда вся в соплях из проводов..."

2.А как Вы узнали, что его сняли с производства? Вроде как продакшн везде написано 07.gif

http://www.atmel.com/dyn/products/param_ta...p;Direction=ASC

http://www.atmel.com/dyn/products/devices.asp?family_id=605

3. Чип и вправду кривоватый - кстати, тоже мой первенец 05.gif Но работать с ним, зная баги, можно.


На плату грешить не надо. На осцилографе всё прекрасно наблюдается. А уж на один байт тем паче не сдвигается smile.gif Почитайте ссылку, что я дал, те же самые проблемы буржуи излагают.
http://electronix.ru/forum/index.php?showtopic=17676 нечто похожее тут.
Может дело только в какой то ранней партии, которая умудрилась меня дождаться.

Про снятие наврал twak.gif оЧитался

Сообщение отредактировал Goofy - Feb 14 2008, 13:20
Go to the top of the page
 
+Quote Post
prottoss
сообщение Feb 14 2008, 13:21
Сообщение #19


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Кстати, а как Вы управляете чипселектом? Через железные NPCS или PIO?


--------------------
Go to the top of the page
 
+Quote Post
Goofy
сообщение Feb 14 2008, 13:46
Сообщение #20


Частый гость
**

Группа: Свой
Сообщений: 169
Регистрация: 17-09-07
Из: Красноярск
Пользователь №: 30 600



Цитата(prottoss @ Feb 14 2008, 20:21) *
Кстати, а как Вы управляете чипселектом? Через железные NPCS или PIO?


Через железные, дёргаются без проблем.
Go to the top of the page
 
+Quote Post
prottoss
сообщение Feb 14 2008, 15:18
Сообщение #21


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(Goofy @ Feb 14 2008, 20:46) *
Через железные, дёргаются без проблем.
Ну вот и все проблемы от этого. Сам Atmel в errata говорит - используете PDC? - НЕ ИСПОЛЬЗУЙТЕ NPCS


--------------------
Go to the top of the page
 
+Quote Post
Goofy
сообщение Feb 14 2008, 15:54
Сообщение #22


Частый гость
**

Группа: Свой
Сообщений: 169
Регистрация: 17-09-07
Из: Красноярск
Пользователь №: 30 600



Цитата(prottoss @ Feb 14 2008, 22:18) *
Ну вот и все проблемы от этого. Сам Atmel в errata говорит - используете PDC? - НЕ ИСПОЛЬЗУЙТЕ NPCS


Работа идёт в Fixed PCS. И было сказано что при работе без PDC проблема не исчезает.
Скачал последний датащит, в эррате несколько другая ситуация изложена. У меня все устройства на шине работают в 8 бит режиме.
Go to the top of the page
 
+Quote Post
prottoss
сообщение Feb 14 2008, 16:10
Сообщение #23


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(Goofy @ Feb 14 2008, 22:54) *
Работа идёт в Fixed PCS. И было сказано что при работе без PDC проблема не исчезает.Скачал последний датащит, в эррате несколько другая ситуация изложена. У меня все устройства на шине работают в 8 бит режиме.
Хотите головной боли? Продолжайте свои исследования, нет - забейте на железные выборки и используйте софтовое управление слэйвами

Кстати, я же Вам дал рабочий драйвер, работающий на ВСЕХ SAM7(на 9 не проверял). Почему бы не испытать? smile.gif А уже потом делать выводы про неработающий SPI. Там (в драйвере) вроде бы все просто и понятно написано.


--------------------
Go to the top of the page
 
+Quote Post
Goofy
сообщение Feb 14 2008, 16:14
Сообщение #24


Частый гость
**

Группа: Свой
Сообщений: 169
Регистрация: 17-09-07
Из: Красноярск
Пользователь №: 30 600



Цитата(prottoss @ Feb 14 2008, 23:08) *
Хотите головной боли? Продолжайте свои исследования, нет - забейте на железные выборки и используйте софтовое управление слэйвами


Давайте убедимся что говорим об одном и том же.
То есть всё что мне нужно сделать, отцепить ногу NPCS от модуля SPI? Сконфигуривароть интерфейс в SPI_CSR0. И работать с той лишь разницей что переключать CS слэйвов программно?
Go to the top of the page
 
+Quote Post
prottoss
сообщение Feb 14 2008, 16:37
Сообщение #25


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(Goofy @ Feb 14 2008, 23:14) *
угу

Посмотрите в spi.c на

SPI_RESULT SPI_Init(AT91PS_SPI spi) - ИМХО там все, что нужно сделать


--------------------
Go to the top of the page
 
+Quote Post
Goofy
сообщение Feb 14 2008, 18:01
Сообщение #26


Частый гость
**

Группа: Свой
Сообщений: 169
Регистрация: 17-09-07
Из: Красноярск
Пользователь №: 30 600



Подправил
Код
void InitSPI(void)
{
AT91F_SPI_CfgPMC();

AT91F_SPI_Reset(ptrSPI);

*AT91C_PIOA_PER = AT91C_PIO_PA11|AT91C_PIO_PA10;

*AT91C_PIOA_OER = AT91C_PIO_PA11|AT91C_PIO_PA10;// |  // CS

    AT91F_PIO_CfgPeriph(
        AT91C_BASE_PIOA, // PIO controller base address
        ((unsigned int) AT91C_PA13_MOSI    ) |
        ((unsigned int) AT91C_PA14_SPCK    ) |    
        ((unsigned int) AT91C_PA12_MISO    ), 0);
    
AT91C_PA10_NPCS2;

csADC1high;

csFLASHhigh;

AT91F_SPI_CfgMode(ptrSPI, AT91C_SPI_MSTR |   AT91C_SPI_MODFDIS |   |  (0x0F<<16)  );
AT91F_SPI_CfgCs(ptrSPI, 0,  AT91C_SPI_CPOL|    ( (MCK/SPI_CLOCK) << 8)   );

ptrSPI->SPI_CR = AT91C_SPI_SPIEN;

(unsigned short)ptrSPI->SPI_RDR;
(unsigned short)ptrSPI->SPI_SR;
(unsigned short)ptrSPI->SPI_RDR;

AT91F_SPI_CfgPCS(ptrSPI, 0x0E);
}


#define csFLASHhigh *AT91C_PIOA_SODR = AT91C_PIO_PA10
#define csFLASHlow *AT91C_PIOA_CODR = AT91C_PIO_PA10

{
csFLASHlow;
csADC1high;

Buf[0]=0xD7;
Buf[1]=0xFF;
Buf[2]=0xFF;
Buf[3]=0xFF;
Buf[4]=0xFF;
Buf[5]=0xFF;

Bufr[0]=AT91_spi(Buf[0]);
Bufr[1]=AT91_spi(Buf[1]);
Bufr[2]=AT91_spi(Buf[2]);
Bufr[3]=AT91_spi(Buf[3]);
Bufr[4]=AT91_spi(Buf[4]);
Bufr[5]=AT91_spi(Buf[5]);

Bufr[6]=0;

USART0_SendData(Bufr,7);

csFLASHhigh;

}


Код
unsigned char AT91_spi(unsigned char bsend)
{
while( !(AT91C_BASE_SPI->SPI_SR & AT91C_SPI_TDRE )){;}
// wait until all transfers are completed
AT91C_BASE_SPI->SPI_TDR =(unsigned short)  bsend;
//transmit
while( !(AT91C_BASE_SPI->SPI_SR & AT91C_SPI_TDRE )){;}
// wait for received char
return (unsigned char)( AT91C_BASE_SPI->SPI_RDR );
}


100раз \ сек опрашивается статус регистр датафлэша
результат в териминале:

...
0
173
255
172
172
172
172
0
173
255
172
172
172
172
0
...
(ноль передаётся только через УАРТ, для наглядности конца пакета)
с 255 всё должно бы начаться, а тут...


sad.gif

Сообщение отредактировал Goofy - Feb 14 2008, 18:04
Go to the top of the page
 
+Quote Post
prottoss
сообщение Feb 14 2008, 18:12
Сообщение #27


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(Goofy @ Feb 15 2008, 01:01) *
Код
unsigned char AT91_spi(unsigned char bsend)
{
while( !(AT91C_BASE_SPI->SPI_SR & AT91C_SPI_TDRE )){;}
// wait until all transfers are completed
AT91C_BASE_SPI->SPI_TDR =(unsigned short)  bsend;
//transmit
while( !(AT91C_BASE_SPI->SPI_SR & AT91C_SPI_TDRE )){;}
// wait for received char
return (unsigned char)( AT91C_BASE_SPI->SPI_RDR );
}
Вот это не понятно. вы какие то не те флаги ждете:-)



Попробуйте вот так:

Цитата
while((AT91C_BASE_SPI->SPI_SR & (AT91C_SPI_TXBUFE | AT91C_SPI_TXEMPTY)) != (AT91C_SPI_TXBUFE | AT91C_SPI_TXEMPTY)){;};



/* Read rx data register and status register for
clear previos transfers flag */
(UINT32)AT91C_BASE_SPI->SPI_RDR;
(UINT32)AT91C_BASE_SPI->SPI_SR;
(UINT32)AT91C_BASE_SPI->SPI_RDR;
Мы жждем флаг окончания передатчи PDC (AT91C_SPI_TXBUFE ) и опустошения внутреннего сдвигающего регистра SPI (AT91C_SPI_TXEMPTY)


--------------------
Go to the top of the page
 
+Quote Post
Goofy
сообщение Feb 14 2008, 18:14
Сообщение #28


Частый гость
**

Группа: Свой
Сообщений: 169
Регистрация: 17-09-07
Из: Красноярск
Пользователь №: 30 600



Цитата(prottoss @ Feb 15 2008, 01:12) *
Вот это не понятно. вы какие то не те флаги ждете:-)



Попробуйте вот так:

Мы жждем флаг окончания передатчи PDC (AT91C_SPI_TXBUFE ) и опустошения внутреннего сдвигающего регистра SPI (AT91C_SPI_TXEMPTY)


Если приглядеться, то заметно что работа идёт не через PDC wink.gif
Go to the top of the page
 
+Quote Post
prottoss
сообщение Feb 14 2008, 18:27
Сообщение #29


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Блин smile.gif Название то теме Вы придумали? Что то вы экспериментируете не там. Ну что Вы пытаетесь сделать как то не в то место. Используйте ПДЦ. НЕ использкйте хардварные ноги. Будет вам счастие:-)



И посмотрите вот эту ветку, я когда начал SPi курить, тоже головой бился о че попало

http://electronix.ru/forum/index.php?showtopic=35141&hl=


--------------------
Go to the top of the page
 
+Quote Post
Goofy
сообщение Feb 14 2008, 19:19
Сообщение #30


Частый гость
**

Группа: Свой
Сообщений: 169
Регистрация: 17-09-07
Из: Красноярск
Пользователь №: 30 600



Цитата(prottoss @ Feb 15 2008, 01:27) *
Блин smile.gif Название то теме Вы придумали? Что то вы экспериментируете не там. Ну что Вы пытаетесь сделать как то не в то место. Используйте ПДЦ. НЕ использкйте хардварные ноги. Будет вам счастие:-)
И посмотрите вот эту ветку, я когда начал SPi курить, тоже головой бился о че попало

http://electronix.ru/forum/index.php?showtopic=35141&hl=


Ну начинал то я с ПДЦ
ключевое слово TXEMPTY, получается что передача не закочена и процедура возвращает предыдущий принятый байт, не вывалившийся из сдв. регистра.
twak.gif twak.gif

for (i=0;i<1000;i++) printf("БУДУ ВСЕГДА ВНИМАТЕЛЬНЕЙ ЧИТАТЬ ДАТАЩИТ, МЕЛОЧЕЙ ТУТ НЕБЫВАЕТ")

Большое спасибо! a14.gif Выпинали Вы меня, наконец, на путь истинный!

Ради интереса проверил, заработает ли пофиксенная процедура с аппаратным CS.
Не заработала.
Go to the top of the page
 
+Quote Post

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

 


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


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