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

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


Знающий
****

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



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

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

а прогоняя весь код не работает! причем проблема именно в этих двух линиях! но какая именно понять не могу?

еще вот какой вариант работает:

никаких циклов, ничего, ставлю только это: SPI2->DR = d0;
НО! перед этой строкоы ставлю брейк!

в дебаггере исполняю, доходит до брейка, и на осциллографе вижу как преже поднятй SCK и нулевой MOSI! Но потом, нажимаю кнопку Run опять, и уже исполняыется вышеописанная команда!И вот вижу свой байт на осциллографе и переключение SCK!

А вот если без брейка... т.е. сразу запустить всю прогу! то только вижу приподнятй SCK и нулевой MOSI!


Это на какие либо мысли толкает? что это может быть?


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


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

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



Покажите код, который получился после того, как Вы применили мой образец. Тот код, который сейчас не работает.
Как Вы понимаете, я из рабочего проекта прислал кусок, в котором проблемы из-за двойной буферизации в STM32 решены.
Go to the top of the page
 
+Quote Post
BlackOps
сообщение Apr 21 2013, 18:41
Сообщение #18


Знающий
****

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



вот по вашему образцу код мой:

Код
(void) SPI2->DR;    /* clear SPI_SR_RXNE in status register */
// breakpoint here!
SPI2->DR = (d0 & SPI_DR_DR);

while ((SPI2->SR & SPI_SR_TXE) == 0)
;


Видите коммент где про breakpoint сказано?так вот если ставлю туда брейкпоинт, дохожу до него и опять стартую то работает! если без брейк поинта, то не работает когда исполняется все сразу!

не могу понать почему?


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


Гуру
******

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



у меня глупый вопрос, а скорости SPI хватает? вы частоту не превысили максимально допустимую?

все выглядит каким то чудом.
а вот так если сделать

int dummy = SPI2->DR;
SPI2->DR = 0xAA;
while(1);

что будет?
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Apr 21 2013, 18:58
Сообщение #20


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

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



Подсократили, однако...
Функцию выдачи байта на SPI целиком можно привести?
И как работает без дебаггера? МОжет, где-то статусы изменяются из-за чтения регистра данных дебаггером?
Go to the top of the page
 
+Quote Post
BlackOps
сообщение Apr 21 2013, 19:05
Сообщение #21


Знающий
****

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



естесственно хватает, вот что вижу на осциллографе когда работает:
[DELETED]

а вот когда не работает:
[DELETED]


чтото пост большой какойто стал :Р

без дебаггера тоже не работает! т.е. если на чип заливаю, и включаю, то не работает!

Никакой функции нету! исполняю прямо кодом для простоты!

вот один из кодов привожу еще раз, где в комменте указано если там стоит брейк то работает, если нет брейка то не работает.
Код
(void) SPI2->DR;    /* clear SPI_SR_RXNE in status register */
// breakpoint here!
SPI2->DR = (d0 & SPI_DR_DR);

while ((SPI2->SR & SPI_SR_TXE) == 0)
;


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

а если нет брейка, т.е. сразу прогоняыется весь код, то тока изображение №2!

Сообщение отредактировал IgorKossak - Apr 22 2013, 08:01
Причина редактирования: изображения следует прикреплять к сообщению, а не вставлять


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


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

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



Так... 1) А что с выходом чипселекта? Сказать что есть и не подкдючаться к нему:
const uint_fast32_t cr1bits = SPI_CR1_MSTR | SPI_CR1_SSM | SPI_CR1_SPE | baudrate;
const uint_fast32_t cr1bits16w = cr1bits | SPI_CR1_DFF;



0) У STM32F1xxx есть errata:
// Silicon errata:
// 2.6.7 I2C1 with SPI1 remapped and used in master mode
// Workaround:
// When using SPI1 remapped, the I2C1 clock must be disabled.


ВЫ не дожидаетесь пока байт передастся (когда примется обратно!). Зачем сократили мой код? Там же это было!
Go to the top of the page
 
+Quote Post
BlackOps
сообщение Apr 21 2013, 19:14
Сообщение #23


Знающий
****

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



Цитата(Golikov A. @ Apr 21 2013, 22:50) *
все выглядит каким то чудом.
а вот так если сделать

int dummy = SPI2->DR;
SPI2->DR = 0xAA;
while(1);

что будет?


ничего не будет, тоже не работает!
а вот если ставлю брейк на линии int dummy = SPI2->DR; исполняю код, дохожу до брейка, затем опять исполняют, то работает! не могу понять в чем дело!


Цитата(Genadi Zawidowski @ Apr 21 2013, 23:12) *
Так... 1) А что с выходом чипселекта? Сказать что есть и не подкдючаться к нему:
const uint_fast32_t cr1bits = SPI_CR1_MSTR | SPI_CR1_SSM | SPI_CR1_SPE | baudrate;
const uint_fast32_t cr1bits16w = cr1bits | SPI_CR1_DFF;



0) У STM32F1xxx есть errata:
// Silicon errata:
// 2.6.7 I2C1 with SPI1 remapped and used in master mode
// Workaround:
// When using SPI1 remapped, the I2C1 clock must be disabled.


ВЫ не дожидаетесь пока байт передастся (когда примется обратно!). Зачем сократили мой код? Там же это было!


да но ведь я же использую SPI2 а не SPI1!


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


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

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



Раз с глухим while не работает, точно с аппаратным выходом NSS Вам надо разбираться.
Цитату их errata я привёл как пример странных взаимосвязей и как намёк на что смотреть. Правда, при этом не работает совсем. Смотрите на NSS.

Сообщение отредактировал Genadi Zawidowski - Apr 21 2013, 19:17
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Apr 21 2013, 19:20
Сообщение #25


Гуру
******

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



Не ну тоды магия.

А во придумал!!! А если так?

while ( (SPI2->SR & SPI_SR_TXE) ==0 );
int dummy = SPI2->DR;
SPI2->DR = 0xAA;
while(1);


и как проверить что прием окончен?

Может у вас вызов идет во время приема потому ничего и не работает? А когда перед записью регистра есть брек поинт, проц успевает что-то принять или передать...
Go to the top of the page
 
+Quote Post
BlackOps
сообщение Apr 21 2013, 19:31
Сообщение #26


Знающий
****

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



попробовал добавление SPI_CR1_DFF, тоже самое, не работает если прогонять код сразу.
NSS я не использую! И не используя его но исполняя код по строчкам все работает!

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

Ведь ллогически, если сам интерфейс работае в дебаггере когда исполняется по строчкам.. почему он не должен работать когда разом исполняется весь код! вот в чем дело я не думаю чтоэто какое то отношение имеет к NSS.

Просто я не могу понять что еще тут может быть?

Цитата(Golikov A. @ Apr 21 2013, 23:20) *
Не ну тоды магия.

А во придумал!!! А если так?

while ( (SPI2->SR & SPI_SR_TXE) ==0 );
int dummy = SPI2->DR;
SPI2->DR = 0xAA;
while(1);


и как проверить что прием окончен?

Может у вас вызов идет во время приема потому ничего и не работает? А когда перед записью регистра есть брек поинт, проц успевает что-то принять или передать...


нет. и так не работает!

И нет у меня никакого приема! все просто в тех строчках которые я привел! просто использую пины SCK и MOSI и подключаю их к осциллографу! никакого приема или ччего то еще!


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


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

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



DFF вообще не нужно (этио 16 бит слова).
Вам надо разобраться с SPI_CR1_SSM в Вашей программе.
Go to the top of the page
 
+Quote Post
BlackOps
сообщение Apr 21 2013, 19:53
Сообщение #28


Знающий
****

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



Ну а что там разбиратся?
у меня и SSM=1 и SSI = 1

Когда SSM=1 то програмное управление слейвом включено.
в таком случае значение бита SSI передается на ногу NSS, и то что на ноге NSS извне игнорируется!
Цитата
Bit 8SSI:Internal slave select
This bit has an effect only when the SSM bit isset. The value of this bit is forced onto the
NSS pin and the IO value of the NSS pin is ignored.

иными словами этим битом можно ногой NSS управлять.

в моемслучае это вообще не принципиально... т.е. с этим я разобрался и это думаю к данной проблеме не имеет отношения.
Ил я не прав в чем то?


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


Гуру
******

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



а проц то вообще запускается? без дебагера? Может не стартует?

ну я бы вот что сделал:
я бы статусные регистры выкидывал бы на порт UART если есть.
До
SPI2->DR = Data;
и после, во время while

может чего то оптимизируется?

Если нет порта UART то можно на порт GPIO какой то выводить и осциллографом смотреть...

но считывать состояние регистра постоянно, и определиться где хоть виснет в рабочем режиме...
Go to the top of the page
 
+Quote Post
BlackOps
сообщение Apr 21 2013, 20:41
Сообщение #30


Знающий
****

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



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

вот как я считываю сейчас регистры: SR,CR1,CR2 кодом своим:

Код
while ( (SPI2->SR & SPI_SR_TXE) ==0 );
sr_t = SPI2->SR;
cr1_t = SPI2->CR1;
cr2_t = SPI2->CR2;
// breakpoint here!
SPI2->DR = 0xAA;



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

сделал так как Вы предлагли через USART тоже. вот код:

Код
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;


в USART увидел только два полученных байта: 00 02

что говорит о том что, то что внутри while цикла не выполнилось, т.к. ТХЕбыл уже равен 1 (т.е. буфер отправки данных изначально ыл свободен)

А затем я получилдва байта 00 02, перед SPI2->DR = d0; как Вы и предлагали
изначение 02 говорит что ТХЕ по пренему равен 1, т.е. буфер свободен.

но не работает это! на осцилографе вижу подтянутый ввех SCK и нулевой MOSI

есть какие идеи?


--------------------
Нажми на кнопку - получишь результат, и твоя мечта осуществится
Go to the top of the page
 
+Quote Post

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

 


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


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