Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: at91sam7s256 spi на два устройства
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
en0t
Всем здрасте,
пытаюсь управлять двумя устройствами по spi при этом первое работает а вот второе упорно не хочетю Может подскажете чего. Сам думаю что не правильная настройка регистров.


Код
// Configure SPI PIOs
AT91F_PIO_CfgPeriph(AT91C_BASE_PIOA,AT91C_PA9_NPCS1 | AT91C_PA11_NPCS0 | AT91C_PA12_MISO | AT91C_PA13_MOSI | AT91C_PA14_SPCK, 0);
// Configure PMC by enabling SPI clock

AT91F_SPI_CfgPMC ();
AT91F_SPI_Reset(AT91C_BASE_SPI);
AT91F_SPI_CfgMode(AT91C_BASE_SPI, AT91C_SPI_MSTR |AT91C_SPI_PS| AT91C_SPI_PS_VARIABLE | AT91C_SPI_MODFDIS | ((0x10 << 24) & AT91C_SPI_DLYBCS));

AT91F_SPI_CfgCs(AT91C_BASE_SPI, 0, AT91C_SPI_CPOL | AT91C_SPI_BITS_8 | ((0x40 << 8) & AT91C_SPI_SCBR) | //Serial Clock Baud Rate
(AT91C_SPI_DLYBS & (128 << 16)) |
((0x2 << 24) & AT91C_SPI_DLYBCT)); //Delay Between Consecutive Transfers

AT91F_SPI_CfgCs(AT91C_BASE_SPI, 1, AT91C_SPI_CPOL | AT91C_SPI_BITS_8 | ((0x40 << 8) & AT91C_SPI_SCBR) | //Serial Clock Baud Rate
(AT91C_SPI_DLYBS & (128 << 16)) |
((0x2 << 24) & AT91C_SPI_DLYBCT)); //Delay Between Consecutive Transfers


AT91F_SPI_Enable(AT91C_BASE_SPI);


AT91F_SPI_PutChar(AT91C_BASE_SPI,data[1],0);// на первое устройство - все ок
AT91F_SPI_PutChar(AT91C_BASE_SPI,data[1],1);//на второе устройство - не работает

просьба зарание не отправлять в даташел. был там уже rolleyes.gif
aaarrr
Цитата(en0t @ Apr 14 2009, 14:49) *
не работает

Не работать оно может сильно по-разному, что конкретно не так?
KRS
А вы подряд отправляете?
AT91F_SPI_PutChar не роверяет готовность SPI к отправке данных!
Надо подождать пока регистр освободится.
И errata посмотреть у разных серий разные фичи smile.gif
en0t
я так понял что не управляется выборка второго устройства CS1 аппаратно.

Цитата(KRS @ Apr 14 2009, 15:02) *
А вы подряд отправляете?
AT91F_SPI_PutChar не роверяет готовность SPI к отправке данных!
Надо подождать пока регистр освободится.
И errata посмотреть у разных серий разные фичи smile.gif


даже так пробывал , всё равно тишина

Код
AT91PS_SPI pSPI = AT91C_BASE_SPI;
while( !( pSPI->SPI_SR & AT91C_SPI_TDRE ) ); // transfer compl. wait
pSPI->SPI_TDR = (dat & 0xFFFF) | (((~(1 << 1)) & 0xF)<< 16);
aaarrr
Цитата(en0t @ Apr 14 2009, 15:04) *
я так понял что не управляется выборка второго устройства CS1 аппаратно.

Посмотрите осциллографом, что происходит на выводах SPI. Проверьте, что PA9 не задействуется где-нибудь еще под DRXD.
en0t
Цитата(aaarrr @ Apr 14 2009, 15:12) *
Посмотрите осциллографом, что происходит на выводах SPI. Проверьте, что PA9 не задействуется где-нибудь еще под DRXD.

я вот тоже подумал о DRXD , я его не использую да и в проге вроде нет не где.(а где посмотреть то , может есть конкретные места)
осцилогрофом смотрел тишина на ножке этой. Но вот что интересно ,если посмотреть спомошью вольтметра то до начала всех передач на ней 1.86 вольта а на CS0 как положенно 3.3в.
aaarrr
NPCS1 на Peripheral B, поэтому должно быть так:
Код
AT91F_PIO_CfgPeriph(AT91C_BASE_PIOA, AT91C_PA11_NPCS0 | AT91C_PA12_MISO | AT91C_PA13_MOSI | AT91C_PA14_SPCK, AT91C_PA9_NPCS1)


А еще лучше не пользоваться говнолибами от фирмы Атмел.
en0t
Цитата(aaarrr @ Apr 14 2009, 15:26) *
NPCS1 на Peripheral B, поэтому должно быть так:
Код
AT91F_PIO_CfgPeriph(AT91C_BASE_PIOA, AT91C_PA11_NPCS0 | AT91C_PA12_MISO | AT91C_PA13_MOSI | AT91C_PA14_SPCK, AT91C_PA9_NPCS1)


А еще лучше не пользоваться говнолибами от фирмы Атмел.


bb-offtopic.gif
Огромное спасибо мил человек Все удалось
А так же всем спасибо кто принимал участие и как говорится + в репу rolleyes.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.