Код
Код
void initSpi()
{
RCC_APB2ENR_bit.IOPAEN = 1; // Разрешить тактирование PORTA
RCC_APB2ENR_bit.IOPBEN = 1; // Разрешить тактирование PORTB
//конфигурируем ножки для SPI
RCC_APB2ENR_bit.AFIOEN = 1; // Тактирование альтернативных функций GPIO.
GPIOB_CRH_bit.MODE13 = 0x3; // out < 50 MHz SPISCK
GPIOB_CRH_bit.CNF13 = 0x2; // alt push pull
GPIOB_CRH_bit.MODE14 = 0x0; // input SPIMISO
GPIOB_CRH_bit.CNF14 = 0x2; // float
GPIOB_BSRR_bit.BS14 = 1;
GPIOB_CRH_bit.MODE15 = 0x3; // out < 50 MHz SPIMOSI
GPIOB_CRH_bit.CNF15 = 0x2; // alt push pull
//EEPROM ~CS
GPIOB_CRL_bit.MODE7 = 0x1; // out < 10 MHz ~SS
GPIOB_CRL_bit.CNF7 = 0x0; // push pull
GPIOB_BSRR_bit.BS7 = 0x1; // set hold hi
//FRAM ~CS
GPIOA_CRH_bit.MODE12 = 0x1; // out < 10 MHz ~SS
GPIOA_CRH_bit.CNF12 = 0x0; // push pull
GPIOA_BSRR_bit.BS12 = 0x1; // set hold hi
RCC_APB1ENR_bit.SPI2EN = 1; //включим SPI
SPI2_CR1 = 0;
SPI2_CR2 = 0;
SPI2_CR1_bit.BR = 0x4; // 22МГц/32 ~ 600 kHz on spi
SPI2_CR1_bit.MSTR = 0x1;
SPI2_CR1_bit.SSI = 0x1;
SPI2_CR1_bit.SSM = 0x1;
SPI2_CR1_bit.SPE = 0x1;
}
{
RCC_APB2ENR_bit.IOPAEN = 1; // Разрешить тактирование PORTA
RCC_APB2ENR_bit.IOPBEN = 1; // Разрешить тактирование PORTB
//конфигурируем ножки для SPI
RCC_APB2ENR_bit.AFIOEN = 1; // Тактирование альтернативных функций GPIO.
GPIOB_CRH_bit.MODE13 = 0x3; // out < 50 MHz SPISCK
GPIOB_CRH_bit.CNF13 = 0x2; // alt push pull
GPIOB_CRH_bit.MODE14 = 0x0; // input SPIMISO
GPIOB_CRH_bit.CNF14 = 0x2; // float
GPIOB_BSRR_bit.BS14 = 1;
GPIOB_CRH_bit.MODE15 = 0x3; // out < 50 MHz SPIMOSI
GPIOB_CRH_bit.CNF15 = 0x2; // alt push pull
//EEPROM ~CS
GPIOB_CRL_bit.MODE7 = 0x1; // out < 10 MHz ~SS
GPIOB_CRL_bit.CNF7 = 0x0; // push pull
GPIOB_BSRR_bit.BS7 = 0x1; // set hold hi
//FRAM ~CS
GPIOA_CRH_bit.MODE12 = 0x1; // out < 10 MHz ~SS
GPIOA_CRH_bit.CNF12 = 0x0; // push pull
GPIOA_BSRR_bit.BS12 = 0x1; // set hold hi
RCC_APB1ENR_bit.SPI2EN = 1; //включим SPI
SPI2_CR1 = 0;
SPI2_CR2 = 0;
SPI2_CR1_bit.BR = 0x4; // 22МГц/32 ~ 600 kHz on spi
SPI2_CR1_bit.MSTR = 0x1;
SPI2_CR1_bit.SSI = 0x1;
SPI2_CR1_bit.SSM = 0x1;
SPI2_CR1_bit.SPE = 0x1;
}
код рабоающий с SPI
Код
Цитата
uint8_t readFramStatus()
{
enableFram();
SPI2_DR = FRAM_RDSR;
while(SPI2_SR_bit.BSY == 1);
uint8_t byte = SPI2_DR;
SPI2_DR = 0; //читаем данные
while(SPI1_SR_bit.RXNE == 0); //в этом месте зависаем
byte = SPI2_DR;
disableFram();
return byte;
}
uint8_t readFramStatus()
{
enableFram();
SPI2_DR = FRAM_RDSR;
while(SPI2_SR_bit.BSY == 1);
uint8_t byte = SPI2_DR;
SPI2_DR = 0; //читаем данные
while(SPI1_SR_bit.RXNE == 0); //в этом месте зависаем
byte = SPI2_DR;
disableFram();
return byte;
}
Зависает на строчке while(SPI1_SR_bit.RXNE == 0)
смотрел отладчик..... ни разу не видел, чтобы SPI2->RXNE встал в 1. Тот же код с тем же камнем на SPI1 прекрасно работает. Смотрел ноги логическим анализатором.... все такты, cs, miso и mosi - все прекрасно... клкоки есть, есть запрос на mosi, есть ответ на miso.... но почемуто бит приема ни кога не встает в 1. Почему? может есть ещё какието смежные конфигурациолнные биты у ядра, которые я не проинитил?
ps проверил на 2-х платах. процессор STM32F100C8T6