Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: нечего не пойму SPI не хотит работать
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
asen
Вот подключил к SPI0 в LPC2292 внешнею EEPROM и вроде SPI0 конфигурирую как надо гружу данные в регистр данных но на выводах все спокойно и не чего не происходит, думал линии эти мертвые проверил переконфигурив в режим портов ввода /вывода все дрыгаются. Может что я забыл или какой то секрет есть вот функции конфигурирования



#define CS_EEPROM 1<<14//P0


void SPI_init (void)
{
//*************SPI EEPROM****************
PINSEL0_bit.P0_4=1;
PINSEL0_bit.P0_5=5;
PINSEL0_bit.P0_6=1;

IO0DIR |=CS_EEPROM;
IO0SET |=CS_EEPROM;
//***************************************
S0SPCR_bit.CPOL=0;
S0SPCR_bit.CPHA=0;
S0SPCR_bit.MSTR=1;
S0SPCR_bit.LSBF=1;
S0SPCR_bit.SPIE=0;
S0SPCCR=80;
}


unsigned char EEPROM_RDSR (void)
{
IO0CLR = CS_EEPROM;
S0SPDR = 5;
for (;S0SPSR_bit.SPIF != 1;)
{;}
S0SPDR = 0;
for (;S0SPSR_bit.SPIF != 1;)
{;}
IO0SET = CS_EEPROM;
return S0SPDR;

}
zltigo
Цитата(asen @ May 27 2006, 16:45) *
Может что я забыл или какой то секрет есть вот функции конфигурирования

Сконфигурить _все_ 4pin ПРАВИЛЬНО без '=5' и прочитать примечание в документации
по поводу SSEL в режиме Master. Не забыть выставить тактовую частоту.
Все.


Цитата
for (;S0SPSR_bit.SPIF != 1;)
{;}

И не использовать таких диких языковых конструкций :-(
И не забывать обрабатывать прочие биты ошибок из SPSR.
asen
хотел бы я посмотреть тому разработчику каторый придумал эту фичу с подтяжкой SSEL к питанию
гении блин !
Спасибо всем!
Tria
Столкнулся с проблемой работы SPI на LPC2129 по прерыванию - оно не срабатывает angry.gif , хотя прерывания от таймеров, UART'ов работают как часы.

инициализация прерывания:
....
VICIntSelect &= ~(1<<VIC_SPI1);
VICVectAddr2 = (unsigned int)&SPI1Interrupt;
VICVectCntl2 = 0x20 | VIC_SPI1;
VICIntEnable = (1<<VIC_SPI1);
....
инициализация SPI1
void SPI1Init(void)
{
S1SPCCR = 0x08;
S1SPCR = 0xE0;
}

начало передачи данных
S1SPDR = *Pointer;

при пошаговой отладке в IAR'е видно что флаги SPIF, SPINT после передачи байта = 1
но прерывание не срабатывает.
при "ручной" передаче все работает (все 4 порта инициализированны как SPI)
while(1)
{
S1SPDR = *Pointer;
while(!S1SPSR_bit.SPIF);
}

в чем я не прав?! help.gif где собака зарылась?????
GetSmart
SSEL = 1 ???

И S1SPINT в прерывании прописываете?
Tria
SSEL подвешен через 10к к Vcc

а обработчик следующий:
void SPI1Interrupt(void)
{
S1SPINT = 0x01;
*Pointer++ = S1SPDR;
if(--Counter) {S1SPDR = *Pointer;}
}
aaarrr
А VIC сбросить (VICVectAddr=XX) не забываете?
GetSmart
Во-первых, в прерывании нужно перед обращением к S1SPDR обязательно прочитать S1SPSR.

А вообще, проверьте адреса всех регистров в iolpc2129.h
ну и все VIC_... заодно.
Я у себя в ИАРе для 2138 подправлял немного вручную.
Alex03
Плюс, не забывайте что при чтении регистров по JTAG, если в регистрах есть сбрасывающиеся по чтению биты, то они сбрасываются.
Т.е. при пошаговой отладке с просмотром всевозможных флагов прерываний легко эти самые прерывания потерять.
У некоторых производителей бывают специальные теневые регистры для чтения из отладчиков (да и не только). Филипс этим не озадачился. sad.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.