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

Проблемы с SPI на STM32L151xxx

При установке флага 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
}

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


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

В AVR есть подобная проблема с SPI: если на ножке SS при первой инициализации присутствует лог.0, то модуль переходит в режим Slave (бит Master сбрасывается). Здесь возможно тоже самое.

 

Вот товарищ пишет про SPI в STM32 (описание регистра SPI_CR1) о нюансе запуска в режиме Master.

Если же SPI модуль работает в режиме мастера, то ногу NSS нужно подтянуть к питанию или включить программное управление (SSM=1) и установить бит SSI. В противном случае - SPI модуль подумает, что появился новый мастер и сам станет слейвом. Этот момент для меня был не совсем очевиден и я потратил много времени чтоб разобраться.
Изменено пользователем controller_m30

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


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

Все верно! :) Спасибо! Биты 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) должна быть обычная программная как выход.

Спасибо всем, кто смотрел.

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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