|
Смещён приём через PDC для SPI |
|
|
|
Feb 9 2008, 09:02
|

Частый гость
 
Группа: Свой
Сообщений: 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. Очевидно, что это проявляется не только с датафлэш, тк для АЦП запросы короткие то там я тупо подстроился под эту систему и заставил всё работать. Но это ведь может плохо кончиться!
|
|
|
|
|
Feb 9 2008, 10:11
|

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

|
Цитата(prottoss @ Feb 9 2008, 16:54)  Это куда?  это накосячил, когда постил. AT91F_PDC_SetTx(pPdc, (char *) &(pDataFlash->command), bCmdSize); так должно быть
Сообщение отредактировал Goofy - Feb 9 2008, 10:11
|
|
|
|
|
Feb 10 2008, 08:05
|

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

|
Цитата(prottoss @ Feb 9 2008, 17:22)  Да Вы и счас накосячили  Я спрашивал про AT91F_PDC_Set Rx(...), а Вы мне про Ерему  это опять же опечатка... спешил... AT91F_PDC_SetRx(pPdc, (char *) &(pDataFlash->command), bCmdSize);
|
|
|
|
|
Feb 10 2008, 09:53
|

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

|
Цитата(Goofy @ Feb 10 2008, 15:05)   это опять же опечатка... спешил... 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);
--------------------
|
|
|
|
|
Feb 10 2008, 13:55
|

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

|
Цитата(Goofy @ Feb 10 2008, 20:34)  А можно попросить код? Именно с sam7s стыковали датафлэш? Можно:-) В приложении драйвер SPI под uc/OS-II и драйвер для AT45DB - думаю разберетесь. Драйвер SPI править не надо - достаточно подключить хедер для соответсвующего МК - он сам разберется, скока SPI у чипа на борту там, правда, еще не совсем решенный вопрос по блокировке интерфейса - использовать как есть счас - с семафорами или использовать общую группу флагов. Думаю, в понедельник-вторник решится, когда будем испытывать на рабочем девайсе. Я думаю, что и с группой флагов работать будет - т.е. без семафоров
--------------------
|
|
|
|
|
Feb 11 2008, 08:39
|

Частый гость
 
Группа: Свой
Сообщений: 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
Эскизы прикрепленных изображений
|
|
|
|
|
Feb 11 2008, 09:02
|

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

|
Цитата(prottoss @ Feb 11 2008, 15:55)  не зачто  А что, мой тоже не работает? Возможно большая скорость передачи и некачественная разводка ПП. Кстати у меня в исходиках установлена скрость 10МГц Драйвер Ваш нет смысла подключать, тк PDC сам по себе работает наистраннейшим образом. Весь код этой беды выше представлен. Скорость 4мгц, уменьшал до 500кГц, результат тот же. Чёрт с ней с помехой, плата там и правда вся в соплях из проводов, однако с АЦП на этой скорости SPI работает прекрасно. Но как понимать последовательность то такую ?
|
|
|
|
|
Feb 11 2008, 18:40
|

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

|
Код for (i=0;i<4;i++) Bufr[i]=AT91_spi(Buf[i]); Вообще без PDC, эффект тот же.  Какому либо объясненью вообще не поддаётся, что чаще всего говорит о банальности причины... инициализация 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;
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|