megarazor 0 8 июня, 2010 Опубликовано 8 июня, 2010 (изменено) · Жалоба Пытаюсь связать флэш память и контроллер по SPI. Настраиваю SPI так: // использую стандартные атмеловские либы для этого контроллера 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В. Пробовал различные частоты. Пробовал различные настройки режимов. Пробовал внутр. подтяжку. Пробовал внешнюю подтяжку. Результат один и тот же. хелп. Изменено 8 июня, 2010 пользователем MegaFPGA Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 8 июня, 2010 Опубликовано 8 июня, 2010 (изменено) · Жалоба В этом процессоре регистры, запись в которые переключает какие-либо биты (пары 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. Изменено 8 июня, 2010 пользователем Genadi Zawidowski Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
megarazor 0 8 июня, 2010 Опубликовано 8 июня, 2010 · Жалоба Их раньше небыло. Без них все так же. Заметил что на линии MOSI такая же каша с сигналами. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 8 июня, 2010 Опубликовано 8 июня, 2010 · Жалоба Вынесите работу с pio и инициализацию spi из цикла. В цикле только выдачу данных на spi оставьте. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
megarazor 0 8 июня, 2010 Опубликовано 8 июня, 2010 · Жалоба Вынес. Ни чего не изменилось. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 8 июня, 2010 Опубликовано 8 июня, 2010 · Жалоба Отключите пока все от SCK - никаких средних уровней и "лесенок" во время передачи средствами процессора сделать нельзя. И попробуйте поболтать этим выводом через PIO. Может, транзистор нижний убили. ...Или верхний, что более подходит под симптомы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 8 июня, 2010 Опубликовано 8 июня, 2010 · Жалоба По симптомам - две ноги (соседних обычно) сцепились друг с другом при пайке. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
megarazor 0 8 июня, 2010 Опубликовано 8 июня, 2010 · Жалоба Всем спасибо. Оказалось сопля между MOSI и SCK :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться