Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Проблемы с SPI на STM32L151xxx
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
AndreyKeil
При установке флага SPE, сбрасывается флаг MSTR в регистре SPI_CR1 контроллера STM32L151VBT6. В результате SPI не работает. В чем может быть проблема?
Код
void SPI_Config() {
    RCC_APB2ENR|=
        0<<14|//USART1EN:
        1<<12|//SPI1EN: 1-разр.SPI1
        0<<11|//SDIOEN:
        0<< 9|//ADC1EN:
        0<< 4|//TIM11EN:
        0<< 3|//TIM10EN:
        0<< 2|//TIM9EN:
        0<< 0;//SYSCFGEN:

    GPIOA_AFRL|=
        5<<28|//7 вывод
        5<<20;//5 вывод

    ConfPort_UltraLowPower(A, 7, cAlter, cPpull, cOut10MH, cNoPud);    //SDA индикатора
    //SDA_HI;
    ConfPort_UltraLowPower(A, 5, cAlter, cPpull, cOut10MH, cPulDow);    //SCL индикатора
    //SCL_LO;

    SPI1_I2SCFGR&= (ushort)~0x800;
    SPI1_CR1=
        0<<15| //BIDI MODE: 1-передача только в одну сторону
        1<<14| //BIDI OE: 1-вывод включен (только передача)
        0<<13| //CRC EN: 0-CRC не считать
        0<<12| //CRC NEXT: 0-передача без CRC
        0<<11| //DFF: 0- режим 8бит, 1- режим 16бит (SPE=0 надо запрещать)
        0<<10| //RX ONLY: 0-режим передача и прием
        1<< 9| //SSM: 0-режим slave запрещен
        0<< 8| //SSI:
        0<< 7| //LSB: FIRST 0-начинать со старш.бита
        0<< 6| //SPE: 1-разрешение SPI
        1<< 3| //BR[2:0] 0-clk:2, 1-clk:4
        1<< 2| //MSTR: 1-мастер
        0<< 1| //CPOL
        0<< 0; //CPHA

    //SPI1_I2SPR= 7;
    SPI1_CR1|= 0x40;    //SPE: 1-разрешение SPI
}
controller_m30
В AVR есть подобная проблема с SPI: если на ножке SS при первой инициализации присутствует лог.0, то модуль переходит в режим Slave (бит Master сбрасывается). Здесь возможно тоже самое.

Вот товарищ пишет про SPI в STM32 (описание регистра SPI_CR1) о нюансе запуска в режиме Master.
Цитата
Если же SPI модуль работает в режиме мастера, то ногу NSS нужно подтянуть к питанию или включить программное управление (SSM=1) и установить бит SSI. В противном случае - SPI модуль подумает, что появился новый мастер и сам станет слейвом. Этот момент для меня был не совсем очевиден и я потратил много времени чтоб разобраться.
AndreyKeil
Все верно! sm.gif Спасибо! Биты SSM и SSI надо установить в единицу. Теперь ошибки не возникает, но передачи все равно нет. Програмная реализация SPI работает.
Какая конфигурация ножки CS (она же NSS или SS) должна быть: альтернативная или обычная программная (выход)?
Разобрался. Правильный код:
Код
SPI1_CR1=
             1<<15| //BIDI MODE: 1-передача только в одну сторону
        1<<14| //BIDI OE: 1-вывод включен (только передача)
        0<<13| //CRC EN: 0-CRC не считать
        0<<12| //CRC NEXT: 0-передача без CRC
        0<<11| //DFF: 0- режим 8бит, 1- режим 16бит (SPE=0 надо запрещать)
        0<<10| //RX ONLY: 0-режим передача и прием
        1<< 9| //SSM: 0-режим slave запрещен
        1<< 8| //SSI:
        0<< 7| //LSB: FIRST 0-начинать со старш.бита
        0<< 6| //SPE: 1-разрешение SPI
        1<< 3| //BR[2:0] 0-clk:2, 1-clk:4
        1<< 2| //MSTR: 1-мастер
        1<< 1| //CPOL
        1<< 0; //CPHA

Конфигурация ножки CS (она же NSS или SS) должна быть обычная программная как выход.
Спасибо всем, кто смотрел.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.