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

 
 
> SPI на AT91SAM7S нереально медленно работает
ivstech
сообщение Dec 20 2006, 19:52
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 204
Регистрация: 5-01-06
Пользователь №: 12 860



Столкнулся с такой ситуацией, что SPI работает в неск. раз медленнее, чем по расчетам.
MCK 48МГц. Делитель 3,
500*10000 операций spiSendByte(0xFF) должны выполниться за 2.5 секунды, а получается около 10 секунд.

Инициализация такая:

s_pPMC->PMC_PCER = 1<<AT91C_ID_SPI; //enable the clock of SPI
/**** Fixed mode ****/
s_pSpi->SPI_CR= 0x81;//SPI Enable, Sowtware reset
s_pSpi->SPI_CR= 0x01;//SPI Enable
s_pSpi->SPI_MR=0x0E0011;//Master mode, fixed select, disable decoder, FDIV=0 (MCK), PCS=1110
s_pSpi->SPI_CSR[0] = 0x0302|0x04; //8bit, CPOL=0, ClockPhase=1, SCLK = 48/3=16MHz

0x04 - это я пробовал сделать так, чтобы CS не выключался, в скорости разницы нет
Вряд ли идут какие-то дополнительные клоки, т.к. MMC карточка работает с этими настройками.
Осциллографа у меня нет, так что могу только догадываться, что клоки действительно работают на задаваемых частотах (попытка увеличить частоту ведет к тому, что обмен с MMC уже не идет - а у нее макс. частота в SPI - 20МГц) и задержка происходит между передачей отдельных байтов. Сам контроллер не может так тормозить на частоте 48МГц

Процедура тоже обычная

unsigned char spiSendByte(const unsigned char data)
{
unsigned int spib;

while((s_pSpi->SPI_SR & AT91C_SPI_TDRE) == 0);
s_pSpi->SPI_TDR = (data & 0xFFFF);
while((s_pSpi->SPI_SR & AT91C_SPI_RDRF) == 0);
spib = ((s_pSpi->SPI_RDR) & 0xFFFF);
return spib;
}
Go to the top of the page
 
+Quote Post



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

 


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


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