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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Смещён приём через 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
prottoss
сообщение Feb 9 2008, 09:54
Сообщение #2


Гуру
******

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



Цитата(Goofy @ Feb 9 2008, 16:02) *
Код
AT91F_PDC_SetRx(pPdc, (char *) &(), bCmdSize);
Это куда? 07.gif


--------------------
Go to the top of the page
 
+Quote Post
Goofy
сообщение Feb 9 2008, 10:11
Сообщение #3


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

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



Цитата(prottoss @ Feb 9 2008, 16:54) *
Это куда? 07.gif


это накосячил, когда постил.

AT91F_PDC_SetTx(pPdc, (char *) &(pDataFlash->command), bCmdSize);
так должно быть

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


Гуру
******

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



Цитата(Goofy @ Feb 9 2008, 17:11) *
это накосячил, когда постил.AT91F_PDC_SetTx(pPdc, (char *) &(pDataFlash->command), bCmdSize);так должно быть


Да Вы и счас накосячили smile.gif Я спрашивал про AT91F_PDC_SetRx(...), а Вы мне про Ерему


--------------------
Go to the top of the page
 
+Quote Post
Goofy
сообщение Feb 10 2008, 08:05
Сообщение #5


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

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



Цитата(prottoss @ Feb 9 2008, 17:22) *
Да Вы и счас накосячили smile.gif Я спрашивал про AT91F_PDC_SetRx(...), а Вы мне про Ерему



smile.gif это опять же опечатка... спешил...
AT91F_PDC_SetRx(pPdc, (char *) &(pDataFlash->command), bCmdSize);
Go to the top of the page
 
+Quote Post
prottoss
сообщение Feb 10 2008, 09:53
Сообщение #6


Гуру
******

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



Цитата(Goofy @ Feb 10 2008, 15:05) *
smile.gif это опять же опечатка... спешил...
AT91F_PDC_SetRx(pPdc, (char *) &(pDataFlash->command), bCmdSize);


Я так понимаю command в pDataFlash определена как чтото типа

command[CMD_BUF_SIZE]. Если так, тогда зачем в функции AT91F_PDC_SetRx/Tx Вы подсовываете адрес указателя, а не сам указатель???

По моему надо так:

Код
...

AT91F_PDC_SetTx(pPdc, pDataFlash->command, bCmdSize);

...

AT91F_PDC_SetRx(pPdc, pDataFlash->command, bCmdSize);


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


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

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



Структура на которую ссылается pDataFlash имеет вид
typedef struct _AT91S_DF
{
AT91PS_SPI pSpi;
AT91S_DF_SEM bSemaphore;
unsigned int command;
unsigned int commandS;
AT91S_DF_DESC dfDescription;
unsigned char chipSelect;
}
Go to the top of the page
 
+Quote Post
prottoss
сообщение Feb 10 2008, 11:08
Сообщение #8


Гуру
******

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



Цитата(Goofy @ Feb 10 2008, 17:35) *
Структура на которую ссылается pDataFlash имеет вид
typedef struct _AT91S_DF
{
AT91PS_SPI pSpi;
AT91S_DF_SEM bSemaphore;
unsigned int command;
unsigned int commandS;
AT91S_DF_DESC dfDescription;
unsigned char chipSelect;
}
Я конечно не знаю, как там все у вас посылается, но почему команды имеют такой тип - unsigned int? Команды для DataFlash имеют размер от 1 до 8-и байт. Я, к примеру, их и объявляю, как массив 8-и битных элементов, ну а PDC уже сообщаю адрес массива-источника и адрес массива-приемника (обычно совпадают или приемник не указываю елси не читаю статус) и количество байт, которые хочу отправить и ожидаю принять


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


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

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



А можно попросить код? Именно с sam7s стыковали датафлэш?
Go to the top of the page
 
+Quote Post
prottoss
сообщение Feb 10 2008, 13:55
Сообщение #10


Гуру
******

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



Цитата(Goofy @ Feb 10 2008, 20:34) *
А можно попросить код? Именно с sam7s стыковали датафлэш?
Можно:-)

В приложении драйвер SPI под uc/OS-II и драйвер для AT45DB - думаю разберетесь. Драйвер SPI править не надо - достаточно подключить хедер для соответсвующего МК - он сам разберется, скока SPI у чипа на борту



там, правда, еще не совсем решенный вопрос по блокировке интерфейса - использовать как есть счас - с семафорами или использовать общую группу флагов. Думаю, в понедельник-вторник решится, когда будем испытывать на рабочем девайсе. Я думаю, что и с группой флагов работать будет - т.е. без семафоров
Прикрепленные файлы
Прикрепленный файл  spi_drv_at45db.rar ( 5.69 килобайт ) Кол-во скачиваний: 91
 


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


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

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



За код спасибо большое!


Но то что у меня происходит с SPI я вообще отказываюсь понимать. Процедура выполняющаяся при запуске:
Код
AT91PS_PDC pPdc;

DFChipSelect();

DataFlash.pSpi=AT91C_BASE_SPI;

pPdc = (AT91PS_PDC) &(DataFlash.pSpi->SPI_RPR);


    AT91F_PDC_DisableRx(pPdc);
    AT91F_PDC_DisableTx(pPdc);

Buf[0]=0xD7;    //запрос на статус регистр
Buf[1]=0xFF;
Buf[2]=0xFF;
Buf[3]=0xFF;

SPI_Rx( Bufr, 4);  // тоже самое что sendframe
SPI_Tx( Buf, 4);


AT91F_PDC_EnableRx(pPdc);
AT91F_PDC_EnableTx(pPdc);

while (!(DataFlash.pSpi->SPI_SR & AT91C_SPI_ENDRX) );

USART0_SendData(Bufr,4);


буферы - глобальные переменные
Код
char Buf[10];
char Bufr[10];


результат на скриншоте. Мало того что помеха в первом байте, так ещё и порядок мягко говоря странный. По датащиту в ответе at45db161d должно быть 0xFF, потом повторяющееся содержание статус регистра, на остальные 24 тика SCK.
Даже если помеха и ловиться на старте, то должна поганить 0xFF. Битый DF ?

SPI инициализирован на 8бит.

Сообщение отредактировал Goofy - Feb 11 2008, 08:42
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
prottoss
сообщение Feb 11 2008, 08:55
Сообщение #12


Гуру
******

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



Цитата(Goofy @ Feb 11 2008, 15:39) *
За код спасибо большое!
не зачтоsmile.gif

А что, мой тоже не работает?

Цитата(Goofy @ Feb 11 2008, 15:39) *
Битый DF
Возможно большая скорость передачи и некачественная разводка ПП. Кстати у меня в исходиках установлена скрость 10МГц


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


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

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



Цитата(prottoss @ Feb 11 2008, 15:55) *
не зачтоsmile.gif

А что, мой тоже не работает?

Возможно большая скорость передачи и некачественная разводка ПП. Кстати у меня в исходиках установлена скрость 10МГц


Драйвер Ваш нет смысла подключать, тк PDC сам по себе работает наистраннейшим образом. Весь код этой беды выше представлен. Скорость 4мгц, уменьшал до 500кГц, результат тот же. Чёрт с ней с помехой, плата там и правда вся в соплях из проводов, однако с АЦП на этой скорости SPI работает прекрасно. Но как понимать последовательность то такую ?
Go to the top of the page
 
+Quote Post
defunct
сообщение Feb 11 2008, 11:40
Сообщение #14


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Goofy
Сдается мне проблема не с RX DMA.
Попробуйте настроить RX DMA на прием и в ручную (без TX DMA) передать 4 байта.

Цитата
тк PDC сам по себе работает наистраннейшим образом.

PDC сам по себе работает прекрасно.
Go to the top of the page
 
+Quote Post
Goofy
сообщение Feb 11 2008, 18:40
Сообщение #15


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

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



Код
for (i=0;i<4;i++) Bufr[i]=AT91_spi(Buf[i]);


Вообще без PDC, эффект тот же. sad.gif
Какому либо объясненью вообще не поддаётся, что чаще всего говорит о банальности причины...


twak.gif

инициализация SPI

Код
AT91F_SPI_CfgPMC();

AT91F_SPI_Reset(ptrSPI);



    AT91F_PIO_CfgPeriph(
        AT91C_BASE_PIOA, // PIO controller base address
        ((unsigned int) AT91C_PA13_MOSI    ) |
        ((unsigned int) AT91C_PA14_SPCK    ) |
        ((unsigned int) AT91C_PA11_NPCS0   ) |
        ((unsigned int) AT91C_PA12_MISO    ), // Peripheral A
        ((unsigned int) AT91C_PA10_NPCS2   )); // Peripheral B



AT91F_SPI_CfgMode(ptrSPI, AT91C_SPI_MSTR |   AT91C_SPI_MODFDIS | (10<<24)  |  (0x0F<<16)  );  

AT91F_SPI_CfgCs(ptrSPI, 0,  AT91C_SPI_NCPHA |    ( (MCK/SPI_CLOCK) << 8)   );
AT91F_SPI_CfgCs(ptrSPI, 1,  AT91C_SPI_CPOL| ( (MCK/SPI_CLOCK) << 8) );

AT91F_SPI_CfgCs(ptrSPI, 2,    AT91C_SPI_CPOL | ( (MCK/ SPI_CLOCK ) << 8) );// (5<<24) | (5<<16)|



ptrSPI->SPI_CR = AT91C_SPI_SPIEN;


(unsigned short)ptrSPI->SPI_RDR;
(unsigned short)ptrSPI->SPI_SR;
(unsigned short)ptrSPI->SPI_RDR;
Go to the top of the page
 
+Quote Post

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

 


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


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