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

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


Знающий
****

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



Вот код:

Код
    while ( ( (SPI2 -> SR) & 0x2 ) == RESET)
    {
     //wait until TXE bit is 1
    }
    SPI2 -> DR = d0;



когда этот код исполняется на чипе, или в дебаггере без брейкпоинтов то на осциллографе я только вижу SCK поднятый а MOSI на нуле.
Но когда я исполняю этот код по очереди линию за линией в дебаггере, или же ставлю брейк поинт в дебаггере между циклом while и строчкой с записью в DR, а затем достигнув брейкпоинта опятй продолжаю исполнять код, то на осциллографе вижу переключение SCK и отсылку битов d0.

в чем может быть проблема?

Мне например кажется что SPI2 -> DR = d0; который сразу следует после цикла не дает возможности SPI контроллеру быстро среагировать и послать бит, а исполняя код строка за строкой все работает.

но ведь с другой стороны, я же циклом проверяю бит ТХЕ!? и если я вышел с цикла то буфер свободен и должен бит нормально отослатся?
(я пробовал тоже самое циклом проверять и бит BSY, тоже самое)

есть идеи?


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


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

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



Вы только посылаете, ничего не читаете?
Покажите, что у вас до и после делается.
Go to the top of the page
 
+Quote Post
BlackOps
сообщение Apr 21 2013, 06:46
Сообщение #3


Знающий
****

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



после - бесконечный цикл.
до - ничего касательно этого SPI порта.

да, я просто отсылаю один байт. ничего не принимаю.

простой тест, отсылаю, а на выходе ножки цепляю на осциллограф посмотреть.


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


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

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



На тактовые частоты посмотрите, все ли такие, как задумано.
Go to the top of the page
 
+Quote Post
BlackOps
сообщение Apr 21 2013, 08:30
Сообщение #5


Знающий
****

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



вот настройка SPI
Код
//=============================================================================
// 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);


фпцлк=42MHz, BR=010, когда на осциллографе (в случае если между циклом проверки ТХЕ и записью в регистр DR стоит брейкпоинт) виден SCK , его период примерно 5 MHz.

что тут может быть не так?
с настройкой точно нет! Иначе вообще бы не работало! Но байт отсылается ведь! Но отсылается только когда поочередно в дебаггере те две линии кода исполняю.

я даже пробовал считывать в переменные содержимое регистра SRи CR1сразу после выхода из цикла проверки на бит ТХЕ. результат:
CR1=б1101010111
(SSM=1,SSI=1,SPE=1,BR=010,MSTR=1,CPOL=1,CPHA=1)
SR=0х2 (т.е. только ТХЕ=1)

а после этого идет запись в DR.
все же вроде правильно!

в чем может быть причина?


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


Гуру
******

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



Цитата(BlackOps @ Apr 21 2013, 12:30) *
в чем может быть причина?

Может, в настройках оптимизации. Попробуйте отключить оптимизацию.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Apr 21 2013, 08:41
Сообщение #7


Гуру
******

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



идея такая
данные в регистр
включили передатчик (данные из приемного регистра передаются в сдвиговый)
подождали когда освободиться передающий регистр.

может вы не тот флажок смотрите, проверяете что освободился не передающий (сдвиговый) регистр, а проверяет что приемный свободен (в смысле тот в которые кладут данные, которые потом передаются в сдвиговый?)
Go to the top of the page
 
+Quote Post
BlackOps
сообщение Apr 21 2013, 08:43
Сообщение #8


Знающий
****

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



Цитата(Golikov A. @ Apr 21 2013, 13:41) *
идея такая
данные в регистр
включили передатчик (данные из приемного регистра передаются в сдвиговый)
подождали когда освободиться передающий регистр.

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

Вы кажется первый мой пост совсем пропустили.
вот же код:
Код
    while ( ( (SPI2 -> SR) & 0x2 ) == RESET)
    {
     //wait until TXE bit is 1
    }
    SPI2 -> DR = d0;


если после цикла ставлю брейк, а потом повторно нажимаю кнопку исполнения в дебаггере, то на осциллографе вижу нужное переключение битов.
а если сразу исполняю весь код(или запускаю не из дебаггера а после залива проги в чип) то не вижу.


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


Гуру
******

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



ну у меня нет даташита на все стм я не могу проверить реистры биты и названияsad.gif...

я просто заметил что ситуация очень похожа на то что слишком быстро вырубается передатчик (или даже стираются данные), если есть брейк поинт или выполнение по строкам, то между вырубанием передатчика(стиранием передаваемого байта) и его запуском проходит достаточно времени чтобы все отправилось, а если разом летит, то вырубается до отправки (ну или стирается байт который отправляете или еще что-то)

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

БЛИН!!!

while ( ( (SPI2 -> SR) & 0x2 ) == RESET) - ждете пока бит равен нулю
в коментах пишите //wait until TXE bit is 1, правильно я понимаю что ждать пока 1?

ну и как началась отправка вы сразу вылетаете из цикла, и заменяете отправляемый байт 0

SPI2 -> DR = d0;

готов спорить что написав
SPI2 -> DR = 0xAA; - увидите на выходе AA
Go to the top of the page
 
+Quote Post
BlackOps
сообщение Apr 21 2013, 17:20
Сообщение #10


Знающий
****

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



Да нет же!
Все правильно сдесь!

while ( ( (SPI2 -> SR) & 0x2 ) == RESET)

* Если ТХЕ = 0, то (SPI2 -> SR) & 0x2 ) = 0, и 0 = RESET, цикл продолжает исполнятся
* Если ТХЕ = 1, то (SPI2 -> SR) & 0x2 ) = 1, и 0 != RESET, и мы вылетаем из цыкла!

Таким образом я и жду пока бит ТХЕ = 1.


Проблема значит в чем то другом?


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


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

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



А что за константа RESET?

Вот мой вариант (медленный, вообще-то при выдаче группы бацт готовность проверяю только перед очередным байтом и отдельно - в конце блока для снятия CS):
Код
/* передача байта/слова, возврат считанного */
uint_fast16_t hardware_spi_word(
    uint_fast16_t v        /* значение байта для передачи */
    )
{
    (void) SPI1->DR;    /* clear SPI_SR_RXNE in status register */
    SPI1->DR = (v & SPI_DR_DR);

    // дождаться, пока последний байт выйдет из передатчика
    while ((SPI1->SR & SPI_SR_TXE) == 0)
    ;
    while(!(SPI1->SR & SPI_SR_RXNE))    /* Receive buffer Not Empty */
    ;

    return (SPI1->DR & SPI_DR_DR);
    
}


Обратите вниманире на первое чтние DR.
Go to the top of the page
 
+Quote Post
BlackOps
сообщение Apr 21 2013, 17:45
Сообщение #12


Знающий
****

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



вот моя константа как объявлена: typedef enum {RESET = 0, SET = !RESET} FlagStatus, ITStatus;

а зачем делать вот это: SPI1->DR & SPI_DR_DR ?


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


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

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



Цитата
а зачем делать вот это: SPI1->DR & SPI_DR_DR ?

Забейте на это. Необходимости в этом нет. Наследство от AT91SAM7S.
У Вас заработало?

Сообщение отредактировал Genadi Zawidowski - Apr 21 2013, 18:00
Go to the top of the page
 
+Quote Post
BlackOps
сообщение Apr 21 2013, 18:04
Сообщение #14


Знающий
****

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



да нет не заработало, попробовал также один байт и без цикла послать, тоже самое..


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


Гуру
******

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



ну остается только последнее SPI2 или SPI1
точно через 2 посылаете? может пишите в 1 а статуса ждете от 2, а он всегда пустой?
Go to the top of the page
 
+Quote Post

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

 


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


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