реклама на сайте
подробности

 
 
6 страниц V  < 1 2 3 4 5 > »   
Reply to this topicStart new topic
> STM32F407 Проблемы с SPI, Не отсылается байт сразу после проверки бита ТХЕ в регистре SR
Golikov A.
сообщение Apr 21 2013, 21:04
Сообщение #31


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



ну тогда только что есть какое то прерывание, которое непонятно как все ставит раком. Потому что я так понимаю данные попавшие в регистр DR должны выдавиться полюбому, а мы видим что они не выдавливаются...


а если в том месте где вы ставите брекпоинт поставить for(volatile int i=0;i<32000;i++) __NOP();
ну вообщем любую тупую задержку, да на побольше, чтобы секунда прям вышла... несколько раз цикл воткните... хотя отправки по уарту уже сделали эту задержку...

А воткните циклы выдачи на уарт значения SR после строчки
SPI2->DR = Data; ну так для полноты картины...


думаю что уже все проверили, может чип какой то подгоревший? Фиг же его знает, если бы SPI так странно не работал это бы все заметили...

Есть у меня последняя идея.

Может там какая просадка или помеха по питанию при попытке отправки по SPI, которая реально вешает проц... Циклы выдачи после DR=d0; Должны помочь понять. Если вы ставите брек поинт или медленно идете тока хватает, а если программа быстро летит, что-то проседает и кирдык?


Go to the top of the page
 
+Quote Post
BlackOps
сообщение Apr 21 2013, 21:10
Сообщение #32


Знающий
****

Группа: Свой
Сообщений: 618
Регистрация: 7-06-08
Из: USSR
Пользователь №: 38 121



ладно, мне кажется я частичто решил проблему.
Сейчас работаю БЕЗ дебаггера, компилирую заливаю на чип включаю плату (хотя в дебаггере поведение такоеже)

вот фрагмент кода №1, как уже знаете просто цикл проверки и отправка байта.
Код
while ( (SPI2->SR & SPI_SR_TXE) ==0 )
    {

    }

SPI2->DR = d0;



А вот фрагмент кода №2
Код
for(;;)
{

if ((USART3->SR & USART_SR_RXNE))
    if (USART3->DR == 0x01)
        break;
}


Этот код просто бесконечный цикл, пока с USART3 не будет получена команда 01, как только эта команда получена цикл прерывается, и исполнение программы переходит к фрагменту кода №1

Так вот, компилю, заливаю на флеш.
Затем включаю плату, естесственно ничег не происходит т.к. цикл фрагмента кода №2 работает, затем подаю команду 01 с USART3 и немедленно вижу свой байт на осциллографе!


Вобщемто заработало на чипе и без дебаггера с брейк поинтами... но просто интерестно, в чем же была проблема?

Выходит проблема была в том что когда я подаю питание на плату (и на чип естесственно) то толи порт вывода толи SPI2 периферия еще не успела войти в рабочий режим необходимый для отправки данных?
Или чтото вроде того?
Что думаете?


--------------------
Нажми на кнопку - получишь результат, и твоя мечта осуществится
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Apr 21 2013, 21:15
Сообщение #33


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



думаю стоит ли у вас микросхема рессета проца?

а в целом там же куча всяких клоков должно запуститься, настроиться всякие ПЛЛ, от них должны появиться клоки периферии и прочее, были ли сделаны все эти процедуры стабилизации клока и прочее?
Go to the top of the page
 
+Quote Post
BlackOps
сообщение Apr 21 2013, 21:37
Сообщение #34


Знающий
****

Группа: Свой
Сообщений: 618
Регистрация: 7-06-08
Из: USSR
Пользователь №: 38 121



да было иначе периферия не работала бы вообще.

Вот еще один интересный тест сделал(как вы говорили проверил также статус после записи), вот код (в этот раз убрал бесконечный цикл в начале):

Код
while ( (SPI2->SR & SPI_SR_TXE) ==0 )
    {
    while(!(USART3->SR & USART_SR_TXE)); // check if TXE bit is set
    USART3->DR = (uint8_t)( (SPI2->SR)>>8 ); // sending a byte
    while(!(USART3->SR & USART_SR_TC)); // check if TC bit is set

    while(!(USART3->SR & USART_SR_TXE)); // check if TXE bit is set
    USART3->DR = (uint8_t)( SPI2->SR); // sending a byte
    while(!(USART3->SR & USART_SR_TC)); // check if TC bit is set
    }


while(!(USART3->SR & USART_SR_TXE)); // check if TXE bit is set
USART3->DR = (uint8_t)( (SPI2->SR)>>8 ); // sending a byte
while(!(USART3->SR & USART_SR_TC)); // check if TC bit is set

while(!(USART3->SR & USART_SR_TXE)); // check if TXE bit is set
USART3->DR = (uint8_t)( SPI2->SR); // sending a byte
while(!(USART3->SR & USART_SR_TC)); // check if TC bit is set

SPI2->DR = d0;

while(!(USART3->SR & USART_SR_TXE)); // check if TXE bit is set
USART3->DR = (uint8_t)( (SPI2->SR)>>8 ); // sending a byte
while(!(USART3->SR & USART_SR_TC)); // check if TC bit is set

while(!(USART3->SR & USART_SR_TXE)); // check if TXE bit is set
USART3->DR = (uint8_t)( SPI2->SR); // sending a byte
while(!(USART3->SR & USART_SR_TC)); // check if TC bit is set



И вот некоторые наблюдения:

1) Когда я скомпилировал и зашил контроллер, то я не только не увиден на осциллографе свой байт, но я еще и не увидел байты полученные от USART3!! Интерестно нет?

2) Затем перед кодом который показан выше я добавляю фрагмент кода №2из моего предыдущего поста(непрерывный цикл с ожиданием команды от USART3), комилю, заливаю, включаю..естесственно ничего пока не происходит т.к. нет команды от USART3 на прерывание цикла, подаю команду на прерывание цикла, И вижу свой отправленныйбайт на осциллографе!
А также вижу уже 4 полученных байта, и вот они:
00 02 до посылки
00 03 после посылки!

Как видите интерестно то что после посылки не только TXE=1 но и RXNE=1 что говорит о том что приемник полный.. (хотя странно ничего я не принимаю..)


Тем не менее... явно видно то что некоторые периферии почемуто не хотят работать почти сразу после того как чип запустился..
Ну по крайней мере такой вывод можно сделать из этих наблюдений?

Если есть какие то еще идеи интерестно было бы узнать



Цитата(Golikov A. @ Apr 22 2013, 02:15) *
думаю стоит ли у вас микросхема рессета проца?


стоит просто ресет кнопка на плате, сбрасывание не помогало ничем


--------------------
Нажми на кнопку - получишь результат, и твоя мечта осуществится
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Apr 22 2013, 03:29
Сообщение #35


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



sm.gif а как SPI должен отличить есть что-то на входе или нет? Входная нога в каком то состоянии, клоки тикают, значит через 8-9 клоков входной регистр наберет значение. В примере кода что вам давали выше, была проверка не только на отправку, ну и на прием, а перед отправкой байта всегда еще происходил забор пришедшего.

Такова суть СПИ, как включили клок генератор, так байт не только отправиться но и примется...

Кстати вот интересный момент, а где вы включаете клок генератор? Он в STM автоматом что ли включается по записи байта в DR?

Думаю что после загрузки первое что надо делать это настроить клоки, дождаться везде выставленных флагов, что все клоковые линии работают как надо, а уж потом инициализировать и включат периферию... Но в целом крайне странное поведение, что после старта и передачи управления в main процессор полурабочий. Там же должен быть еще файл стартапа....
Go to the top of the page
 
+Quote Post
HHIMERA
сообщение Apr 22 2013, 03:48
Сообщение #36


Местный
***

Группа: Участник
Сообщений: 226
Регистрация: 10-07-09
Пользователь №: 51 126



Цитата(BlackOps @ Apr 22 2013, 00:37) *
Интерестно нет?

Ничего интересного... подобная тема уже была...
SPI работает так, как заявлено в даташите... остальное всё от недопонимания...
Цитата
Если есть какие то еще идеи интерестно было бы узнать

Читать даташит до просветления... в части тактирования ядра, тактирования SPI и работы самого SPI...
Исходите из того, что транзакция начинается не сразу после загрузки DR... следовательно... и изменение TXE происходит не сразу...

Сообщение отредактировал HHIMERA - Apr 22 2013, 03:49
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Apr 22 2013, 04:05
Сообщение #37


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



я вот поглядел даташит(как и реф мануал) и не увидел там упоминания о том что SPI может вообще не запуститься... А тем более упоминания о паузе перед посылкой которая влияет на его работоспособность. Также не нашел никаких битиков говорящих о неработоспособности или о том что еще не вышло время подготовки SPI.

Я просмотрел секцию бутлода из даташита и опять же не увидел упоминания о том что в начале какие то клоки не работают.

Так что если вы знаете что именно надо глядеть, подскажите, всем нам будет интересно. А если пишите из соображений что SPI простая штука, то увы...
Go to the top of the page
 
+Quote Post
BlackOps
сообщение Apr 22 2013, 04:26
Сообщение #38


Знающий
****

Группа: Свой
Сообщений: 618
Регистрация: 7-06-08
Из: USSR
Пользователь №: 38 121



Цитата(Golikov A. @ Apr 22 2013, 08:29) *
Кстати вот интересный момент, а где вы включаете клок генератор? Он в STM автоматом что ли включается по записи байта в DR?

Его я включаю перед тем как начать работать с СПИ. Вот так:
Код
//=============================================================================
// SPI2 Related configuration
//=============================================================================
// enable SPI2 clock
((RCC_TypeDef *) (RCC_BASE))->APB1ENR |= RCC_APB1ENR_SPI2EN;


// 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);


Цитата(Golikov A. @ Apr 22 2013, 08:05) *
А тем более упоминания о паузе перед посылкой которая влияет на его работоспособность. Также не нашел никаких битиков говорящих о неработоспособности или о том что еще не вышло время подготовки SPI.


тоже самое делал и я после тех двух описанных мною тестов в посте №34 и №32.

Согласен, Пустые умные посты типа "все происходит от недопонимания" никому не интерестны, если кто понял и знает в чем именно проблема и желает поделится, буду рад посмотреть, если нет то и постить не стоит.





Цитата(HHIMERA @ Apr 22 2013, 07:48) *
транзакция начинается не сразу после загрузки DR... следовательно... и изменение TXE происходит не сразу...

а это не важно, т.к. я отправляю первый байт, и ТХЕ уже заведомо имеет значение 1.
Об этом я тоже писал, Вы видимо не прочли ветку и поспешили дать банальный совет.



--------------------
Нажми на кнопку - получишь результат, и твоя мечта осуществится
Go to the top of the page
 
+Quote Post
ViKo
сообщение Apr 22 2013, 04:39
Сообщение #39


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



HHIMERA выразился не точно. TXE выставляется сразу после загрузки данных в регистр. Пересылка (сдвиг) наружу начинается позже, через 2 такта шины. Тогда же устанавливается флаг BSY.
Кстати, за эти два такта периферийной шины процессор успевает наделать много чего.
BlackOps, поставьте задержку вместо точки останова.
Go to the top of the page
 
+Quote Post
HHIMERA
сообщение Apr 22 2013, 07:07
Сообщение #40


Местный
***

Группа: Участник
Сообщений: 226
Регистрация: 10-07-09
Пользователь №: 51 126



Цитата(Golikov A. @ Apr 22 2013, 07:05) *
то увы...

Как прочитали - так и работает... увы...

Цитата(BlackOps @ Apr 22 2013, 07:26) *
Вы видимо не прочли ветку и поспешили дать банальный совет.

Угу...
Ещё раз... разногласия/разночтения по SPI присутствуют только в F0 и F3...
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Apr 22 2013, 08:05
Сообщение #41


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Цитата(HHIMERA @ Apr 22 2013, 11:07) *
Как прочитали - так и работает... увы...
Угу...
Ещё раз... разногласия/разночтения по SPI присутствуют только в F0 и F3...


вы написали уже 2 сообщения, но так и не дали ответа. Меня СПИ в этом проце не интересует я другим занимаюсь, потому не копал. Наблюдаю действия человека который с ним мучается, противоречий не вижу, потому заинтригован.

Если же у вас есть что по сути посвятите нас темных... [DELETED]

Сообщение отредактировал IgorKossak - Apr 22 2013, 11:16
Go to the top of the page
 
+Quote Post
HHIMERA
сообщение Apr 22 2013, 09:49
Сообщение #42


Местный
***

Группа: Участник
Сообщений: 226
Регистрация: 10-07-09
Пользователь №: 51 126



[DELETED]

Сообщение отредактировал IgorKossak - Apr 22 2013, 11:18
Go to the top of the page
 
+Quote Post
adnega
сообщение Apr 22 2013, 10:39
Сообщение #43


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(BlackOps @ Apr 22 2013, 08:26) *
Его я включаю перед тем как начать работать с СПИ. Вот так:
Код
//=============================================================================
// SPI2 Related configuration
//=============================================================================
// enable SPI2 clock
((RCC_TypeDef *) (RCC_BASE))->APB1ENR |= RCC_APB1ENR_SPI2EN;


// 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);

Где-то есть упоминание (для F4), что между установкой битика включения тактирования блока и работы с блоком должно пройти какое-то время. У меня так FSMC не заработал)
Попробую найти это в доках...

UPD: STM32F405/407xx and STM32F415/417xx device limitations
2.1.12 Delay after an RCC peripheral clock enabling
Description
A delay between an RCC peripheral clock enable and the effective peripheral enabling
should be taken into account in order to manage the peripheral read/write to registers.
This delay depends on the peripheral’s mapping:
● If the peripheral is mapped on AHB: the delay should be equal to 2 AHB cycles.
● If the peripheral is mapped on APB: the delay should be equal to 1 + (AHB/APB
prescaler) cycles.
Workarounds
1. Use the DSB instruction to stall the Cortex-M CPU pipeline until the instruction is
completed.
2. Insert ”n” NOPs between the RCC enable bit write and the peripheral register writes
(n = 2 for AHB peripherals, n = 1 + AHB/APB prescaler in case of APB peripherals).
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Apr 22 2013, 10:48
Сообщение #44


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Наконец-то увидел инициализацию.
Зачем SSI и SSM одновременно ставить? В моём (работающем) варианте только SSM стоит (на что я и обращал внимание).
А как следствие - отказ SPI работать, когда кто-то другой держит сигнал SS.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Apr 22 2013, 11:01
Сообщение #45


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



[DELETED]
Цитата(Genadi Zawidowski @ Apr 22 2013, 14:48) *
Наконец-то увидел инициализацию.
Зачем SSI и SSM одновременно ставить? В моём (работающем) варианте только SSM стоит (на что я и обращал внимание).
А как следствие - отказ SPI работать, когда кто-то другой держит сигнал SS.


ну да, наверное правильнее было сразу попросить и инициализацию...

Сообщение отредактировал IgorKossak - Apr 22 2013, 11:17
Go to the top of the page
 
+Quote Post

6 страниц V  < 1 2 3 4 5 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 11th August 2025 - 14:14
Рейтинг@Mail.ru


Страница сгенерированна за 0.01492 секунд с 7
ELECTRONIX ©2004-2016