|
Смещён приём через PDC для SPI |
|
|
|
Feb 14 2008, 10:33
|

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

|
Это баг самого sam7s. Проявляется видимо не у всех, но http://www.at91.com/phpbb/viewtopic.php?p=...2fa6260ff26533eСудя по моим наблюдениям сбойно работает shift register SPI, все данные проходящие через него смещенны на байт вправо, очевидны глюки с переключением размера регистра. (я работал с 8битным). Проявляется в том, что при начале новой передачи, в буффер приёма попадает байт от конца предыдущей. От этого, кстати, при работе через PDC, RCR сразу потеряет единичку. Уже жалею что с этим чипом связался, походу его и с производства сняли. Это первый в моей практике ARM и через такие стенодробительные процедуры... Закаляет однако
Сообщение отредактировал Goofy - Feb 14 2008, 10:36
|
|
|
|
|
Feb 14 2008, 13:14
|

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

|
Цитата(prottoss @ Feb 14 2008, 18:03)  1.Только что сравнил баги SPI SAM7S и SAM7X - все одно и тоже... Похоже баг только в вашем контроллере  включая "...плата там и правда вся в соплях из проводов..." 2.А как Вы узнали, что его сняли с производства? Вроде как продакшн везде написано http://www.atmel.com/dyn/products/param_ta...p;Direction=ASChttp://www.atmel.com/dyn/products/devices.asp?family_id=6053. Чип и вправду кривоватый - кстати, тоже мой первенец  Но работать с ним, зная баги, можно. На плату грешить не надо. На осцилографе всё прекрасно наблюдается. А уж на один байт тем паче не сдвигается  Почитайте ссылку, что я дал, те же самые проблемы буржуи излагают. http://electronix.ru/forum/index.php?showtopic=17676 нечто похожее тут. Может дело только в какой то ранней партии, которая умудрилась меня дождаться. Про снятие наврал  оЧитался
Сообщение отредактировал Goofy - Feb 14 2008, 13:20
|
|
|
|
|
Feb 14 2008, 13:46
|

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

|
Цитата(prottoss @ Feb 14 2008, 20:21)  Кстати, а как Вы управляете чипселектом? Через железные NPCS или PIO? Через железные, дёргаются без проблем.
|
|
|
|
|
Feb 14 2008, 15:54
|

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

|
Цитата(prottoss @ Feb 14 2008, 22:18)  Ну вот и все проблемы от этого. Сам Atmel в errata говорит - используете PDC? - НЕ ИСПОЛЬЗУЙТЕ NPCS Работа идёт в Fixed PCS. И было сказано что при работе без PDC проблема не исчезает. Скачал последний датащит, в эррате несколько другая ситуация изложена. У меня все устройства на шине работают в 8 бит режиме.
|
|
|
|
|
Feb 14 2008, 16:14
|

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

|
Цитата(prottoss @ Feb 14 2008, 23:08)  Хотите головной боли? Продолжайте свои исследования, нет - забейте на железные выборки и используйте софтовое управление слэйвами Давайте убедимся что говорим об одном и том же. То есть всё что мне нужно сделать, отцепить ногу NPCS от модуля SPI? Сконфигуривароть интерфейс в SPI_CSR0. И работать с той лишь разницей что переключать CS слэйвов программно?
|
|
|
|
|
Feb 14 2008, 18:01
|

Частый гость
 
Группа: Свой
Сообщений: 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 всё должно бы начаться, а тут...
Сообщение отредактировал Goofy - Feb 14 2008, 18:04
|
|
|
|
|
Feb 14 2008, 18:12
|

Гуру
     
Группа: Свой
Сообщений: 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)
--------------------
|
|
|
|
|
Feb 14 2008, 19:19
|

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

|
Цитата(prottoss @ Feb 15 2008, 01:27)  Блин  Название то теме Вы придумали? Что то вы экспериментируете не там. Ну что Вы пытаетесь сделать как то не в то место. Используйте ПДЦ. НЕ использкйте хардварные ноги. Будет вам счастие:-) И посмотрите вот эту ветку, я когда начал SPi курить, тоже головой бился о че попало http://electronix.ru/forum/index.php?showtopic=35141&hl= Ну начинал то я с ПДЦ ключевое слово TXEMPTY, получается что передача не закочена и процедура возвращает предыдущий принятый байт, не вывалившийся из сдв. регистра. for (i=0;i<1000;i++) printf("БУДУ ВСЕГДА ВНИМАТЕЛЬНЕЙ ЧИТАТЬ ДАТАЩИТ, МЕЛОЧЕЙ ТУТ НЕБЫВАЕТ") Большое спасибо!  Выпинали Вы меня, наконец, на путь истинный! Ради интереса проверил, заработает ли пофиксенная процедура с аппаратным CS. Не заработала.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|