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

 
 
> Смещён приём через PDC для SPI
Goofy
сообщение Feb 9 2008, 09:02
Сообщение #1


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

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



Последовательность функция для запуска передчи команды по SPI (для dataflash)
Код
    DFChipSelect();

    AT91F_PDC_DisableRx(pPdc);
    AT91F_PDC_SetRx(pPdc, (char *) &(), bCmdSize);
    AT91F_PDC_SetNextRx(pPdc, pData, dDataSize);

    AT91F_PDC_DisableTx(pPdc);    
    AT91F_PDC_SetTx(pPdc, (char *) &(pDataFlash->commandS), bCmdSize);
    AT91F_PDC_SetNextTx(pPdc, pData, dDataSize);

    AT91F_PDC_EnableRx(pPdc);
    AT91F_PDC_EnableTx(pPdc);

В качестве команды засылается запрос на статус регистр (0xD7) размер команды 2 (bCmdSize=2)
Глядя на диаграмму передачи со статус регистра видно, что статус регистр должен передаваться по MISO сразу же после 8го тика SCK. Судя по всему так и происходит. Но сам статус регист оказывается не в ((char*)pDataFlash->command) [1], а в ((char*)pDataFlash->command) [0] !!! Как будто датафлэш передаёт данные во время прохождения запроса. Как будто PDC для приёма курит один байт, перед тем как начать приём.
Что не учёл, где накосячил?
Процессор sam7s256 код из атмеловского апноута для sam7x.

Очевидно, что это проявляется не только с датафлэш, тк для АЦП запросы короткие то там я тупо подстроился под эту систему и заставил всё работать. Но это ведь может плохо кончиться!
Go to the top of the page
 
+Quote Post
2 страниц V  < 1 2  
Start new topic
Ответов (15 - 29)
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 Текстовая версия Сейчас: 19th July 2025 - 10:02
Рейтинг@Mail.ru


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