Перейти к содержанию
    

STM32 – вопросы – проблемы - решения.

Спасибо за наводку,но с этими битами я попробую разобратся если понадобится аппаратно NSS дергать,а пока я это делаю софтово.

 

у меня используется SPI2, но суть та же

вот его инициализация:

 

GPIOB->BSRR = 1<<12; //собственно установка NSS в единицу

SPI2->CR2 = SPI_CR2_SSOE;

SPI2->CR1 = SPI_CR1_MSTR | SPI_CR1_BR_1;

SPI2->CR1 |= SPI_CR1_SPE;

 

у меня также NSS используется софтово. и если его не установить перед инициализацией в 1, то SPI переходит в SLAVE.

был такой косяк.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А вы не допускаете, что между записью в SPI1->DR и чтением отладчиком содержимого SPI1->SR проходит некоторе время, за которое байт успевает уйти из буфера и буфер таки оказывается действительно пуст?

Не допускаю, что он успевает тогда бы работало без задержки и при Fclck/4,8,16,32 не приходилось бы увеличивать эту же самую задержку.

Сейчас попробую Ваши советы,правда к осцилографу щупов нет, уменьшу ка я скорость передачи и вместо проверки бита TXE коприровать значение SPI1_SR в переменные.

 

у меня используется SPI2, но суть та же

вот его инициализация:

 

GPIOB->BSRR = 1<<12; //собственно установка NSS в единицу

SPI2->CR2 = SPI_CR2_SSOE;

SPI2->CR1 = SPI_CR1_MSTR | SPI_CR1_BR_1;

SPI2->CR1 |= SPI_CR1_SPE;

 

у меня также NSS используется софтово. и если его не установить перед инициализацией в 1, то SPI переходит в SLAVE.

был такой косяк.

 

ПопробовалС Вашей настройкой И все так же работает, TXE бит стоит как вкопаный, правда RXNE поднимается но только на один такт, и сразу Же сбрасываетя...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И все так же работает, TXE бит стоит как вкопаный

SPI имеет двойную буферизацию: после SPI->DR = data байт/слово переписывается в сдвиговый регистр, начинается его выдвижение, а DR тут же готов принять на грудь еще - TXE "стоит". Ткните быстро два раза данные в SPI->DR, и бит TXE "упадет".

Изменено пользователем KnightIgor

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сейчас нет под рукой железяки, в понедельник проверю, так что для отправки байта делать такую запись

SPI1->DR = Cmd;

SPI1->DR = Cmd;

while(!((SPI1->SR)&SPI_SR_TXE));

я правильно Вас понял?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сейчас нет под рукой железяки, в понедельник проверю, так что для отправки байта делать такую запись

SPI1->DR = Cmd;

SPI1->DR = Cmd;

while(!((SPI1->SR)&SPI_SR_TXE));

я правильно Вас понял?

В качестве эксперимента - да, но в реальном приложении так заморачиваться совсем не обязательно: если надо передавать последовательность байт, просто кидайте их в пасть SPI, - и все. Если же Вы хотите после передачи байта каждый раз там дергать NSS, то TXE - не тот флаг, чтобы отслеживать начало-завершение передачи. См. бит BSY.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я уже работал с SPI PIC'ков и LPC так там таких проблем не было, есть флаг опустошения или заполнения буфера вот он и опрашивается.

Ладно уже окончательно этими флагами сломал голову, BSY тоже не поднимается.В примерах на передачу я видел опрос TXE.Надо бы SPI2 попробовать мало ли.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не знаю, может и не в тему, особо не вникал.

Моя передача по SPI с ожиданием завершения передачи 1-го байта

 

u8  spi_process_8(u8 data)
{
  SPI1->DR = data;
  while ( (SPI1->SR & SPI_I2S_FLAG_RXNE) == (uint16_t)RESET );

  return SPI1->DR; 
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

.Надо бы SPI2 попробовать мало ли.

Разницы нет.

Вы бы задачку обрисовали, что именно нужно.

Если просто идут передачи, то достаточно ПЕРЕД записью проверить готовность регистра данных (наличие флага TXE).

Если же необходимо точно знать, что передача (и прием, который имеет место одновременно с передачей в режиме мастера) завершилась, чтобы после этого "поднять" ногу селекции периферии, то следует использовать метод, указаный Danis в предыдущем посте, немного его модифицировав для передачи потока данных:

 

1). вначале дождаться отсутствия бита BSY,

2). "опустить" ногу селекции периферии,

3). прочитать DR, гарантируя сброс RXNE,

4). дождаться готовности TXE,

5). вкинуть данные в DR,

6). дождаться готовности RXNE, который взведется после самого последнего такта SCLK,

7). прочитать и, возможно, сохранить принятый DR, если надо,

8). перейти к 4)., если есть еще что для передачи/приема.

9). "поднять" ногу селекции периферии.

Изменено пользователем KnightIgor

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Чтобы не создавать новую тему.

Имеется отладочная платка, 5 на 5 см с stm32f417 144 ноги. Плата простая, выведено большинство ног на разъемы плюс житаг. Из дополнительных элементов тока конденсаторы по питанию согласно даташиту. Запущен микроконтроллер от внутреннего rc генератора на 168мГц. Проблема в том, что при поднесении пальца руки к микроконтроллеру в области ближе к углу где расположены 1, 144 пины, происходит насколько я смог понять срыв тактирования. Для этого даже не нужно касаться самого корпуса. Если прикасаться в других местах, все хорошо. Ну и вопрос, как такое поведение победить? Подскажите в какую сторону искать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может быть, плавают некоторые управляющие линии типа RST, JTAG? Если так, то добавить внешние подтяжки там, где необходимо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

не указал, RST подтянут резистором 100кОм к питанию, у житага только вывод RTCK резистором 100кОм на землю

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну и нужно внимательно посмотреть, как подключены VDDA, VSSA, потому что от них запитывается PLL. Там желательно правильно разводить цепи, не забыть рекомендованный конденсатор 10 нФ.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

не указал, RST подтянут резистором 100кОм к питанию, у житага только вывод RTCK резистором 100кОм на землю

100кОм - много! На порядок уменьшить RST и на два порядка RTCK.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Объясните пожалуйста, что происходит?

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

Состав проекта

post-36402-1329642821_thumb.jpg

 

В симуляторе, после включения питания, в RCC CR появляются галки, что включен внутренний генератор, внешний и ФАПЧ. Откуда эти биты? В каком из подключенных файлов произошла такая инициализация? В дальнейшем не могу сбросить PLLON и HSEON, т.к. хочу тактировать от внутреннего генератора напрямую. Текст функции инициализации тактирования, на верхнем рисунке, первоначальный, потом пробовал писать в HSEON,PLLON и "0" и "1", стоят как вкопанные.

 

post-36402-1329642805_thumb.jpg

 

Если можно объясните "на пальцах".

Изменено пользователем valera_o

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Объясните пожалуйста, что происходит?

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

Гляньте startup_xxx.s (ассемблер) файл:

Reset_Handler   PROC
                EXPORT  Reset_Handler             [WEAK]
                IMPORT  __main
                IMPORT  SystemInit
                LDR     R0, =SystemInit
                BLX     R0               
                LDR     R0, =__main
                BX      R0
                ENDP

Сначала вызывается SystemInit, где генераторы настраиваются и запускаются, и лишь после этого идет переход на main().

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Гость
Эта тема закрыта для публикации ответов.
×
×
  • Создать...