Перейти к содержанию
    

Как заставить SPI работать (stm32f4Discovery)

У меня работает в режиме Мастер при такой конфигурации.

Правда, без использования стандартной библиотеки.

 

//-----------------------------------------------------------------------------
//    void init_SPI2(void)
//-----------------------------------------------------------------------------
void init_SPI2(void)
{
    SPI2->CR1 =
            SPI_CR1_SSM
        | SPI_CR1_SSI
        | SPI_CR1_MSTR
        | SPI_CR1_BR_2 | SPI_CR1_BR_1 | SPI_CR1_BR_0;

    SPI2->CR2 =
            SPI_CR2_SSOE;

    SPI2->CR1 =
            SPI_CR1_SPE
        | SPI_CR1_SSM
        | SPI_CR1_SSI
        | SPI_CR1_MSTR
        | SPI_CR1_BR_2 | SPI_CR1_BR_1 | SPI_CR1_BR_0;
}

//-----------------------------------------------------------------------------
//    void __inline init_SYSTEM(void)
//-----------------------------------------------------------------------------
void __inline init_SYSTEM(void)
{
    RCC->AHB1ENR = RCC_AHB1ENR_GPIOBEN;
    RCC->APB1ENR = RCC_APB1ENR_SPI2EN;
}

//-----------------------------------------------------------------------------
//    void __inline init_GPIO(void)
//-----------------------------------------------------------------------------
void __inline init_GPIO(void)
{
    GPIOB->MODER = GPIO_MODER_MODER13_1  | GPIO_MODER_MODER14_1  | GPIO_MODER_MODER15_1
    GPIOB->AFR[1] = (5 << ((13 - 8) << 2)) | (5 << ((14 - 8) << 2)) | (5 << ((15 - 8) << 2));
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ну хоть дернулся пин PB15! какой то сдвиг, гдето еще чегото не хватает.. читаю даташит:

NSS output enabled (SSM = 0, SSOE = 1)

This configuration is used only when the device operates in master mode. The

NSS signal is driven low when the master starts the communication and is kept

low until the SPI is disabled.

 

 

теперь понятно почему надо было делать: SPI_SSOutputCmd(SPI2, ENABLE); это и включает SSOE = 1

 

и почему надо было: spi2.SPI_NSS = SPI_NSS_Hard; а это ставит бит SSM = 0

 

ну тогда же у меня все правильно, что там еще может быть?

 

напомню еще раз: клок идет вверх на Вдд и стоит там, а МОСИ идет на Вдд и опускается на ноль.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вобщем получилось наконец-то завести SPI2.

 

Кстати, этот NSS пин вообще не нужен если мне не надо явно выбирать другой чип. использовал только MOSI и SCK.

вот код если еще кому надо:

int main(void)
{
 /*!< At this stage the microcontroller clock setting is already configured, 
   this is done through SystemInit() function which is called from startup
   file (startup_stm32f4xx.s) before to branch to application main.
   To reconfigure the default setting of SystemInit() function, refer to
   system_stm32f4xx.c file
 */
uint8_t d0 = 0xd9; // 11011001, test data0



// enable SPI2 clock
((RCC_TypeDef *) (RCC_BASE))->APB1ENR |= RCC_APB1ENR_SPI2EN;

// enable GPIOB clock
((RCC_TypeDef *)(RCC_BASE))->AHB1ENR |= RCC_AHB1ENR_GPIOBEN;


// GPIOB configuration
((GPIO_TypeDef *)(GPIOB_BASE))->MODER |= (GPIO_MODER_MODER13_1 | 
GPIO_MODER_MODER15_1 );
((GPIO_TypeDef *)(GPIOB_BASE))->OTYPER |= 0x00;
((GPIO_TypeDef *)(GPIOB_BASE))->OSPEEDR |= (GPIO_OSPEEDER_OSPEEDR13_1 |
GPIO_OSPEEDER_OSPEEDR15_1 );
((GPIO_TypeDef *)(GPIOB_BASE))->PUPDR |= 0x00;
//((GPIO_TypeDef *)(GPIOB_BASE))->IDR |= RCC_AHB1ENR_GPIOBEN;
//((GPIO_TypeDef *)(GPIOB_BASE))->ODR |= RCC_AHB1ENR_GPIOBEN;
//((GPIO_TypeDef *)(GPIOB_BASE))->BSRRL |= RCC_AHB1ENR_GPIOBEN;
//((GPIO_TypeDef *)(GPIOB_BASE))->BSRRH |= RCC_AHB1ENR_GPIOBEN;
//((GPIO_TypeDef *)(GPIOB_BASE))->LCKR |= RCC_AHB1ENR_GPIOBEN;
((GPIO_TypeDef *)(GPIOB_BASE))->AFR[1] |= (0x500000 | 0x50000000);

// configure SPI2
((SPI_TypeDef *) (SPI2_BASE)) -> CR1 |= (SPI_CR1_SPE | SPI_CR1_CPOL |
SPI_CR1_CPHA | SPI_CR1_MSTR | 
SPI_CR1_BR_1 | SPI_CR1_SSM | SPI_CR1_SSI);



// transmit the test data
while ( ( (((SPI_TypeDef *) (SPI2_BASE)) -> SR) & 0x2 ) == RESET)
{
// wait until TXE bit is 1
}
((SPI_TypeDef*)(SPI2_BASE)) -> DR = d0;

while (1)
 {}
}

Изменено пользователем IgorKossak
[codebox] для длинного кода!!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...