Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: AT91SAM7 SPI не работает как надо
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
MegaFPGA
Пытаюсь связать флэш память и контроллер по SPI. Настраиваю SPI так:
// использую стандартные атмеловские либы для этого контроллера
CODE
while(1){ AT91F_PIO_CfgPeriph(
AT91C_BASE_PIOA, // PIO controller base address
((unsigned int) AT91C_PA13_MOSI ) |
((unsigned int) AT91C_PA31_NPCS1 ) |
((unsigned int) AT91C_PA14_SPCK ) |
//((unsigned int) AT91C_PA11_NPCS0 ) |
((unsigned int) AT91C_PA12_MISO ), // Peripheral A
//((unsigned int) AT91C_PA9_NPCS1 ) |
//((unsigned int) AT91C_PA22_NPCS3 ) |
//((unsigned int) AT91C_PA3_NPCS3 ) |
//((unsigned int) AT91C_PA5_NPCS3 ) |
//((unsigned int) AT91C_PA10_NPCS2 ) |
((unsigned int) AT91C_PA30_NPCS2 )); // Peripheral B
AT91F_SPI_CfgPMC ();
AT91F_SPI_SWReset (AT91C_BASE_SPI);
pSPI ->SPI_CR = (unsigned int)0x01;
pSPI ->SPI_MR = (unsigned int)0x30011;
pSPI ->SPI_IER =(unsigned int) 0x0;// все прерывания отключены
pSPI ->SPI_IDR = (unsigned int)0x3FF;// все прерывания отключены
pSPI ->SPI_IMR = (unsigned int)0x0;// все прерывания замаскированы
pSPI ->SPI_CSR[2] = (unsigned int)0x0000FF02;
pPIO->PIO_PPUDR=(pPIO->PIO_PPUDR)&0xFFFFBFFF;
pPIO->PIO_PPUER=(pPIO->PIO_PPUER)|0x400;

Передачу запускаю записью в регистр данных SPI данных.
pSPI ->SPI_TDR= SPIDataToSend;
Потом жду флаг окончания передачи

Зацикливаю передачу.
Осциллографом смотрю сигнал SCK. Сначала после настройки SPI он падает до 1.7 В. Потом когда начинается передача он приобретает форму лестницы. 0В - 1,7В - 3,3В - 0В-1,7В - 3,3В-1,7В-3,3-1,7В-3,3-1,7В.
Пробовал различные частоты. Пробовал различные настройки режимов. Пробовал внутр. подтяжку. Пробовал внешнюю подтяжку. Результат один и тот же.
хелп.
Genadi Zawidowski
В этом процессоре регистры, запись в которые переключает какие-либо биты (пары enable/disable, set/clear) только для записи. Читать из них ничего не стоит.
С push-pool регистром ничего делать не надо для начала. Если только не 5 вольт интерфейс. В этом случае только нужные битики в disable push-pool register пишите:
PIO_PPUDR = AT91C_PA14_SPCK | AT91C_PA13_MOSI;
PIO_PPUDR = AT91C_PA14_SPCK | AT91C_PA13_MOSI;
И отключаете внутренний pull-up резистор:
PIO_PUDR = AT91C_PA14_SPCK | AT91C_PA13_MOSI;

битики добавить по вкусу....


А в Вашем коде - удалите две строчки манипуляций с Push-pool register.
MegaFPGA
Их раньше небыло. Без них все так же. Заметил что на линии MOSI такая же каша с сигналами.
Genadi Zawidowski
Вынесите работу с pio и инициализацию spi из цикла. В цикле только выдачу данных на spi оставьте.
MegaFPGA
Вынес. Ни чего не изменилось.
aaarrr
Отключите пока все от SCK - никаких средних уровней и "лесенок" во время передачи средствами процессора сделать нельзя. И попробуйте поболтать этим выводом через PIO. Может, транзистор нижний убили.
...Или верхний, что более подходит под симптомы.
ViKo
По симптомам - две ноги (соседних обычно) сцепились друг с другом при пайке.
MegaFPGA
Всем спасибо. Оказалось сопля между MOSI и SCK smile.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.