Поднимаю старую тему.
Есть F149 и две SPI-DataFlash - AT25F2048 и AT45DB161B. Инициализацию SPI (UART1) сделал на основе примеров из этой темы. Никакой связи с памятью наладить не удалось - выяснилось что на выводе контроллера P5.3 нет тактового сигнала UCLK. Вместо него или высокий уровень если установлен бит CKPL, или низкий если бит не установлен (по крайней мере вывод рабочий). Почему так - понять не могу.
Из программы удалил всё, что не касается SPI. Осталось вот что:
Код
int main()
{
WDTCTL = WDTPW + WDTHOLD;
IE1 |= OFIE + WDTIE;
IFG1 |= OFIFG;
__enable_interrupt();
AT25SEL &= ~AT25LN;
AT25DIR |= AT25LN;
AT25CS_HI;
AT45SEL &= ~AT45LN;
AT45DIR |= AT45LN;
AT45CS_HI;
IE2 &= ~(UTXIE1 + URXIE1);
U1CTL = SWRST;
U1CTL |= CHAR + SYNC + MM;
U1TCTL = CKPL + SSEL1 + STC;
U1BR1 = 0x00;
U1BR0 = 0x04;
U1MCTL = 0x00;
ME2 |= USPIE1;
U1CTL &= ~SWRST;
//IE2 |= UTXIE1 + URXIE1;
P5SEL |= 0x0E;
P5DIR |= 0x0A;
P1DIR = 0x10; //проверка наличия SMCLK
P1SEL = 0x10;
while(1)
{
}
return 0;
}
и тактирование (кварц 7,32 МГц и 32КГц)
Код
#pragma vector = NMI_VECTOR
__interrupt void OSCfault_ISR(void)
{
BCSCTL2 = SELM_0 + DIVM_0 + DIVS_0;
BCSCTL1 = DIVA_0 + RSEL2 + RSEL1 + RSEL0;
DCOCTL = DCO1 + DCO2;
while ((IFG1 & OFIFG) != 0) IFG1 &=~OFIFG;
BCSCTL2 = SELM_2 + DIVM_0 + DIVS_0 + SELS;
}
На ноге 16 SMCLK есть. Пробовал разные варианты U1BR1 и U1BR0, пробовал тактирование от ACLK - результат тот же.
Конфигурация выводов после выполнения программы:
P5SEL=0b00001110
P5DIR=0b00011011
P5OUT=0b00010001
(т.е. вывод 5.3 - периферийный модуль, на вывод, обе памяти в состоянии сброса)
вроде бы всё правильно.... и не работает. нужен свежий взгляд.
Подскажите в каком направлении копать, пожалуйста. (может ли дело быть в схемотехнике? может, какая обвязка нужна - у меня всё соединено напрямую).