Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: SPI на AT91SAM7S нереально медленно работает
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
ivstech
Столкнулся с такой ситуацией, что 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;
}
aaarrr
А сколько тактов займет вызов и выполнение spiSendByte оценить не пробовали? Что-то подсказывает мне, что значительно больше 24-х тактов MCK wink.gif
ivstech
Цитата(aaarrr @ Dec 20 2006, 22:57) *
А сколько тактов займет вызов и выполнение spiSendByte оценить не пробовали? Что-то подсказывает мне, что значительно больше 24-х тактов MCK wink.gif

Спасибо, я уже сам это понял. Хотел удалить, а тут уже ответ есть smile.gif
zltigo
Цитата(ivstech @ Dec 20 2006, 18:52) *
Сам контроллер не может так тормозить на частоте 48МГц

Может smile.gif c обращением к периферии, лишними прибамбасами типа (char & 0xFFF), вызовом функции,
организацией счетчика циклов, с отключенной оптимизацией в THUMB mode, потратить где-то 60 тактов? Легко!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.