dezna 0 10 февраля, 2012 Опубликовано 10 февраля, 2012 · Жалоба Спасибо за наводку,но с этими битами я попробую разобратся если понадобится аппаратно 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. был такой косяк. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Penchev 0 10 февраля, 2012 Опубликовано 10 февраля, 2012 · Жалоба А вы не допускаете, что между записью в 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 поднимается но только на один такт, и сразу Же сбрасываетя... Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KnightIgor 2 11 февраля, 2012 Опубликовано 11 февраля, 2012 (изменено) · Жалоба И все так же работает, TXE бит стоит как вкопаный SPI имеет двойную буферизацию: после SPI->DR = data байт/слово переписывается в сдвиговый регистр, начинается его выдвижение, а DR тут же готов принять на грудь еще - TXE "стоит". Ткните быстро два раза данные в SPI->DR, и бит TXE "упадет". Изменено 11 февраля, 2012 пользователем KnightIgor Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Penchev 0 11 февраля, 2012 Опубликовано 11 февраля, 2012 · Жалоба Сейчас нет под рукой железяки, в понедельник проверю, так что для отправки байта делать такую запись SPI1->DR = Cmd; SPI1->DR = Cmd; while(!((SPI1->SR)&SPI_SR_TXE)); я правильно Вас понял? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KnightIgor 2 11 февраля, 2012 Опубликовано 11 февраля, 2012 · Жалоба Сейчас нет под рукой железяки, в понедельник проверю, так что для отправки байта делать такую запись SPI1->DR = Cmd; SPI1->DR = Cmd; while(!((SPI1->SR)&SPI_SR_TXE)); я правильно Вас понял? В качестве эксперимента - да, но в реальном приложении так заморачиваться совсем не обязательно: если надо передавать последовательность байт, просто кидайте их в пасть SPI, - и все. Если же Вы хотите после передачи байта каждый раз там дергать NSS, то TXE - не тот флаг, чтобы отслеживать начало-завершение передачи. См. бит BSY. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Penchev 0 11 февраля, 2012 Опубликовано 11 февраля, 2012 · Жалоба Я уже работал с SPI PIC'ков и LPC так там таких проблем не было, есть флаг опустошения или заполнения буфера вот он и опрашивается. Ладно уже окончательно этими флагами сломал голову, BSY тоже не поднимается.В примерах на передачу я видел опрос TXE.Надо бы SPI2 попробовать мало ли. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Danis 0 11 февраля, 2012 Опубликовано 11 февраля, 2012 · Жалоба Не знаю, может и не в тему, особо не вникал. Моя передача по SPI с ожиданием завершения передачи 1-го байта u8 spi_process_8(u8 data) { SPI1->DR = data; while ( (SPI1->SR & SPI_I2S_FLAG_RXNE) == (uint16_t)RESET ); return SPI1->DR; } Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KnightIgor 2 14 февраля, 2012 Опубликовано 14 февраля, 2012 (изменено) · Жалоба .Надо бы SPI2 попробовать мало ли. Разницы нет. Вы бы задачку обрисовали, что именно нужно. Если просто идут передачи, то достаточно ПЕРЕД записью проверить готовность регистра данных (наличие флага TXE). Если же необходимо точно знать, что передача (и прием, который имеет место одновременно с передачей в режиме мастера) завершилась, чтобы после этого "поднять" ногу селекции периферии, то следует использовать метод, указаный Danis в предыдущем посте, немного его модифицировав для передачи потока данных: 1). вначале дождаться отсутствия бита BSY, 2). "опустить" ногу селекции периферии, 3). прочитать DR, гарантируя сброс RXNE, 4). дождаться готовности TXE, 5). вкинуть данные в DR, 6). дождаться готовности RXNE, который взведется после самого последнего такта SCLK, 7). прочитать и, возможно, сохранить принятый DR, если надо, 8). перейти к 4)., если есть еще что для передачи/приема. 9). "поднять" ногу селекции периферии. Изменено 14 февраля, 2012 пользователем KnightIgor Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xheli 0 18 февраля, 2012 Опубликовано 18 февраля, 2012 · Жалоба Чтобы не создавать новую тему. Имеется отладочная платка, 5 на 5 см с stm32f417 144 ноги. Плата простая, выведено большинство ног на разъемы плюс житаг. Из дополнительных элементов тока конденсаторы по питанию согласно даташиту. Запущен микроконтроллер от внутреннего rc генератора на 168мГц. Проблема в том, что при поднесении пальца руки к микроконтроллеру в области ближе к углу где расположены 1, 144 пины, происходит насколько я смог понять срыв тактирования. Для этого даже не нужно касаться самого корпуса. Если прикасаться в других местах, все хорошо. Ну и вопрос, как такое поведение победить? Подскажите в какую сторону искать. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 18 февраля, 2012 Опубликовано 18 февраля, 2012 · Жалоба Может быть, плавают некоторые управляющие линии типа RST, JTAG? Если так, то добавить внешние подтяжки там, где необходимо. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xheli 0 18 февраля, 2012 Опубликовано 18 февраля, 2012 · Жалоба не указал, RST подтянут резистором 100кОм к питанию, у житага только вывод RTCK резистором 100кОм на землю Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 18 февраля, 2012 Опубликовано 18 февраля, 2012 · Жалоба Ну и нужно внимательно посмотреть, как подключены VDDA, VSSA, потому что от них запитывается PLL. Там желательно правильно разводить цепи, не забыть рекомендованный конденсатор 10 нФ. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KnightIgor 2 18 февраля, 2012 Опубликовано 18 февраля, 2012 · Жалоба не указал, RST подтянут резистором 100кОм к питанию, у житага только вывод RTCK резистором 100кОм на землю 100кОм - много! На порядок уменьшить RST и на два порядка RTCK. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
valera_o 0 19 февраля, 2012 Опубликовано 19 февраля, 2012 (изменено) · Жалоба Объясните пожалуйста, что происходит? Запутался в том какие файлы надо обязательно подключать к проекту. Такое чувство, что наподключал лишнего, теперь не могу понять за какую веревочку дернуть, чтобы это узел развязался. Второй день втыкаю, не могу понять. Состав проекта В симуляторе, после включения питания, в RCC CR появляются галки, что включен внутренний генератор, внешний и ФАПЧ. Откуда эти биты? В каком из подключенных файлов произошла такая инициализация? В дальнейшем не могу сбросить PLLON и HSEON, т.к. хочу тактировать от внутреннего генератора напрямую. Текст функции инициализации тактирования, на верхнем рисунке, первоначальный, потом пробовал писать в HSEON,PLLON и "0" и "1", стоят как вкопанные. Если можно объясните "на пальцах". Изменено 19 февраля, 2012 пользователем valera_o Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KnightIgor 2 19 февраля, 2012 Опубликовано 19 февраля, 2012 · Жалоба Объясните пожалуйста, что происходит? Запутался в том какие файлы надо обязательно подключать к проекту. Такое чувство, что наподключал лишнего, теперь не могу понять за какую веревочку дернуть, чтобы это узел развязался. Второй день втыкаю, не могу понять. Гляньте 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(). Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться