Andrey514 0 15 января, 2017 Опубликовано 15 января, 2017 · Жалоба При установке флага 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 1 15 января, 2017 Опубликовано 15 января, 2017 (изменено) · Жалоба В AVR есть подобная проблема с SPI: если на ножке SS при первой инициализации присутствует лог.0, то модуль переходит в режим Slave (бит Master сбрасывается). Здесь возможно тоже самое. Вот товарищ пишет про SPI в STM32 (описание регистра SPI_CR1) о нюансе запуска в режиме Master. Если же SPI модуль работает в режиме мастера, то ногу NSS нужно подтянуть к питанию или включить программное управление (SSM=1) и установить бит SSI. В противном случае - SPI модуль подумает, что появился новый мастер и сам станет слейвом. Этот момент для меня был не совсем очевиден и я потратил много времени чтоб разобраться. Изменено 15 января, 2017 пользователем controller_m30 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Andrey514 0 15 января, 2017 Опубликовано 15 января, 2017 · Жалоба Все верно! :) Спасибо! Биты 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) должна быть обычная программная как выход. Спасибо всем, кто смотрел. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться