0 / 0 / 0
Регистрация: 23.06.2011
Сообщений: 67
|
|
1 | |
STM32 + SPI04.07.2011, 17:42. Показов 40027. Ответов 28
Метки нет (Все метки)
Собственно, проблема. Мой нижеприведенный код, по идее, должен изменять настройки SPI и включать его. Но когда я прохожу программу пошагово, ничего с регистрами и битами не происходит.
Подскажите, пожалуйста, в чем проблема? Код
void SPIConfig() { //Конфигурируем SPI в мастер - режиме // 1. Ставим частоту передачи Fclck/4 SPI1->CR1 |= SPI_CR1_BR_0; // 2. Ставим Clock Polarity 1 when idle SPI1->CR1 |= SPI_CR1_CPOL; // 3. Ставим необходимую Clock Phase SPI1->CR1 |= SPI_CR1_CPHA; // 4. Размер кадра - 8 бит SPI1->CR1 |= SPI_CR1_DFF; // 5. Устанавливаем мастер - режим SPI1->CR1 |= SPI_CR1_MSTR; // 6. Устанавливаем тип коммуникации в 1 направлении SPI1->CR1 |= SPI_CR1_BIDIMODE; // 7. Включаем только передачу SPI1->CR1 |= SPI_CR1_BIDIOE; // 6. Включаем SPI SPI1->CR1 |= SPI_CR1_SPE; } Причем GPIOA->CRL и остальные могу изменять, а регистры SPI нет
0
|
04.07.2011, 17:42 | |
Ответы с готовыми решениями:
28
Stm32 max7219 SPI STM32 + SPI SD FATFS STM32 и Дисплей SPI SPI и UART на STM32 SPI stm32 CMSIS |
0 / 0 / 0
Регистрация: 11.06.2011
Сообщений: 322
|
|
04.07.2011, 18:06 | 2 |
Сообщение от kyryk444
0
|
0 / 0 / 0
Регистрация: 23.06.2011
Сообщений: 67
|
|
04.07.2011, 18:12 | 3 |
Сообщение от ShypKyttir
Сообщение от ShypKyttir
0
|
0 / 0 / 0
Регистрация: 23.06.2011
Сообщений: 67
|
|
04.07.2011, 19:13 | 4 |
А передача байта так осуществляется?
Код
SPI1->DR = 0x21;
0
|
Pimshiv
|
|
08.02.2012, 14:04 | 5 |
Спрошу в этой же теме.
Посмотрев примеры и почитав reference manuals stm32, начал разбиратся с SPI.Понадобилось мне подключить дисплей LS020 к STM32VLDISCOVERY. Переделал рабочую инициализацию дисплея с LPC2103 на STM32 и как всегда с первого раза не заработало. Как я понял в ходе пошаговой отладке ,не работает из за того что после записи в SPI1->DR флаг TXE не сбрасыватся в железе и после его проверки while(!((SPI1->SR)&SPI_SR_TXE)); идет сразу же запись следующего байта. Вот конфигурация SPI и функция записи байта. // SPI1->CR1 |= SPI_CR1_BR_0; // Частота передачи Fclck/4 SPI1->CR1 |= SPI_CR1_DFF; // Размер кадра - 16 бит SPI1->CR1 |= SPI_CR1_MSTR; // Установка мастер - режим SPI1->CR1 |= SPI_CR1_BIDIMODE; // Тип коммуникации в 1 направлении SPI1->CR1 |= SPI_CR1_BIDIOE; // Только передача SPI1->CR1 |= SPI_CR1_SSI; // без этого SPI1->CR1 |= SPI_CR1_SSM; // и этого в мастер режимме не работает SPI1->CR1 |= SPI_CR1_SPE; // Запись команды в дисплей void Lcd_Write_Commomd(short Cmd){ GPIOA->BSRR |= RS; //RS установлить в 1 (команда) GPIOA->BRR |= CS; //CS установить в 0 (активный дисплей) SPI1->DR = Cmd; while(!((SPI1->SR)&SPI_SR_TXE)); GPIOA->BSRR |= CS; //CS установить в 1 (неактивный дисплей) } Причем не в железе , а в симуляторе KEIL этот бит сбрасывается и потом когда буфер опустеет устанавливается и идет тогда отправка следующего байта. После добавления задержки в функцию отправки байта, дисплей нормально инициализируется. // Запись команды в дисплей void Lcd_Write_Commomd(short Cmd){ int nCount = 15; GPIOA->BSRR |= RS; //RS установлить в 1 (команда) GPIOA->BRR |= CS; //CS установить в 0 (активный дисплей) SPI1->DR = Cmd; while(!((SPI1->SR)&SPI_SR_TXE)); for (; nCount != 0; nCount--); GPIOA->BSRR |= CS; //CS установить в 1 (неактивный дисплей) } Подскажите пожалуйста ,что у меня не так?Может кто усебя мой код проверит в железе? |
0 / 0 / 0
Регистрация: 09.05.2011
Сообщений: 132
|
|
08.02.2012, 14:23 | 6 |
Напишите
Код
while(!(SPI1->SR &= SPI_SR_TXE));
0
|
Pimshiv
|
|
08.02.2012, 14:54 | 7 |
Сделал как Вы говорили
// Запись команды в дисплей void Lcd_Write_Commomd(short Cmd){ int nCount = 15; GPIOA->BSRR |= RS; //RS установлить в 1 (команда) GPIOA->BRR |= CS; //CS установить в 0 (активный дисплей) while(!(SPI1->SR &= SPI_SR_TXE)); SPI1->DR = Cmd; //for (; nCount != 0; nCount--); GPIOA->BSRR |= CS; //CS установить в 1 (неактивный дисплей) } Все равно TXE стоит как вкопанный,получается перед отправкой байта идет проверка опустошения буфера,а он как оказывается не пуст несмотря на поднятый TXE. Вернул задержку все заработало.Впринципе все работает ,но хотелось бы это делать с помощью флага. |
Pimshiv
|
|
08.02.2012, 17:11 | 8 |
Выкладываю весь проект для KEIL v4.20
Может кто проверит в железе , сбрасывается или нет бит TXE. Функция передачи бита находится в файле LS020.c Или может кто то покажет рабочий код с работой SPI в мастер режме. Спасибо. |
0 / 0 / 0
Регистрация: 19.10.2010
Сообщений: 219
|
|
09.02.2012, 11:53 | 9 |
Попробуйте еще контролировать флаг Busy.
А вообще там была заморочка с тем, что как только вы запихиваете байт в DR - он закидывается в сдвиговый регистр, а сам DR освобождается для приема следующего байта. Хотя у меня через флаги вроде все нормально работает. Если данные надо передавать пучками то воспользуйтесь DMA. С ним точно нет никаких гемороев, все настраивается парой команд.
0
|
0 / 0 / 0
Регистрация: 07.03.2010
Сообщений: 918
|
|
09.02.2012, 12:01 | 10 |
Сообщение от kyryk444
Код
//Конфигурируем SPI в мастер - режиме SPI1->CR1 |= SPI_CR1_BR_0 | // 1. Ставим частоту передачи Fclck/4 SPI_CR1_CPOL | // 2. Ставим Clock Polarity 1 when idle SPI_CR1_CPHA |// 3. Ставим необходимую Clock Phase ....
0
|
Pimshiv
|
|
09.02.2012, 15:01 | 11 |
Сообщение от Uttrym
|
0 / 0 / 0
Регистрация: 06.02.2012
Сообщений: 197
|
|
22.02.2012, 19:52 | 12 |
Приветствую!
Вопрос такой. Пишу общение МК с ADIS16201 по SPI2. Такая вещь,- когда хочу загнать данные в регистр обмена, то загоняется не мое значение 0x0200, а 0xFFFF! Причем, это равносильно тому, что если отключить все выводы SPI от датчика, то результат тот же. Че за особенность? Вот фрагмент u16 SPI_transmit[0] = 0х0200; //Включаю передачу по SPI while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) != SIT); SPI_I2S_SendData(SPI2, SPI_transmit[0]); //В этой строке и происходит запись в регистр 0xFFFF! вместо 0х0200! //Вкл прием по SPI while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) != SIT); SPI1_buffRX[0] = SPI_I2S_ReceiveData(SPI2); ?????
0
|
0 / 0 / 0
Регистрация: 26.04.2010
Сообщений: 1,445
|
|
23.02.2012, 15:41 | 13 |
u16 SPI_transmit[0] = 0х0200;
что это?
0
|
0 / 0 / 0
Регистрация: 30.01.2011
Сообщений: 335
|
|
23.02.2012, 16:32 | 14 |
Судя по коду, это объявление указателя "SPI_transmit" и присваивание ему адреса 0х0200. А потом соответственно SPI_transmit[0] содержит значение, лежащее в памяти по адресу 0х0200. Вполне логично, что это как раз FFFF.
Хотя... адреса ниже 0х08000000 вроде как вообще никуда не мапятся, и при обращении к такому адресу мы должны получить access violation. Видимо, адреса, хранимые в указателях, указывают не на абсолютное адресное пространство МК, а указывают смещение относительно начала ROM. Надо бы этот вопрос покопать поглубже, в научных целях ))
0
|
0 / 0 / 0
Регистрация: 06.02.2012
Сообщений: 197
|
|
25.02.2012, 01:23 | 15 |
Сообщение от Stiit.mi
Должно быть u16 SPI_transmit[1]; SPI_transmit[0] = 0x0200; Попробую, должно теперь работать!
0
|
0 / 0 / 0
Регистрация: 06.02.2012
Сообщений: 197
|
|
25.02.2012, 01:31 | 16 |
Сообщение от phomtom tord
*(vu32*) (Address) возвращает содержимое памяти по адресу памяти равном Address. Тоесть по Address = 0x08000000 хранится скажем значение 0хDEADBABE. Поэтому указатель в этом случае указывает четко на содержимое памяти. Думаю это должно работать всегда.
0
|
1 / 1 / 0
Регистрация: 26.10.2011
Сообщений: 811
|
|
02.03.2012, 08:39 | 17 |
Про подключение дисплея по SPI
никак не могу понять - каким образом мы задаем вид передаваемого байта по SPI ? мне нужно часть байтов передавать как команды а часть как данные для этого старший бит посылки должен быть 0-для команд, 1-для данных и потом должны идти 8 бит передаваемого байта у SPI 2 режима - 8 и 16 бит..- по всей видимости выбираем 8 (с надеждой что есть способ управлять самым старшим служебным 9ым битом) а вот как им управлять я так и не вижу нигде :-( или то что я желаю реализуется по другому ?
0
|
0 / 0 / 0
Регистрация: 19.01.2011
Сообщений: 72
|
|
02.03.2012, 11:59 | 18 |
Запутанно и непонятно...
Какой дисплей?
0
|
1 / 1 / 0
Регистрация: 26.10.2011
Сообщений: 811
|
|
02.03.2012, 12:30 | 19 |
Сообщение от md5sum
<Изображение удалено> во вложении написанная мною библиотека для софт-SPI но хочется сделать через DMA с аппаратным SPI - чтобы подать команду на передачу всего буфера и забыть о дисплее до следующего обновления буфера [2.93 Кб]
0
|
Pimshiv
|
|
02.03.2012, 13:05 | 20 |
Вот тут человек решил этот вопрос,незнаю подойдет ли. http://itistro.luxmentis.ru/?p=592
|
02.03.2012, 13:05 | |
02.03.2012, 13:05 | |
Помогаю со студенческими работами здесь
20
Проблема с SPI stm32 STM32 и Дисплей SPI Зависает SPI на STM32 Извлечение данных по SPI STM32 STM32 ili9341 SPI+DMA Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |