Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: spi и usb на stm32
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Tapochka
Здравствуйте. Моя задача такова: по spi принимать/отдавать данные с АЦП и по usb передавать принятые данные на hyperterminal на компе(комп должен видеть плату как виртуальный com порт) на плате stm32f4discovery. По отдельности спи и виртуальный com порт работают нормально, но вместе com порт не инициализируется, а комп видит плату как неисправное usb устройство. Помогите разобраться в чем может быть проблема т.к. ноги otg и spi-шные не пересекаются, вроде сто раз проверил(spi3 - PC10, PC11, PC12), просто ума не приложу в чем может быть проблема.

Код main для организации виртуального com порта и вывод напечатанных символов с клавы на терминал:

Код
#include "stm32f4xx.h"
#include "usbd_cdc_vcp.h" // подключаем USB CDC

__ALIGN_BEGIN USB_OTG_CORE_HANDLE  USB_OTG_dev __ALIGN_END;

const char ch3[]="receive 3\x0D\x0A";
const char ch4[]="получено 4\x0D\x0A";
char       ch5[]="receive 5\x0D\x0A";
char       ch6[]="receive 6\x0D\x0A";

int main(void)
{
    SystemInit(); // настройки тактирования

    // включаем usb
    USBD_Init(&USB_OTG_dev,USB_OTG_FS_CORE_ID,&USR_desc,&USBD_CDC_cb,&USR_cb);

    while (1){

        if(usb_cdc_kbhit()){ // проверка: приняты данные?
            char c;
            c = usb_cdc_getc();  // получение байта с usb
            switch(c){ // разбор принятого символа
                case '3':
                    usb_cdc_printf((char *)ch3); // строки на хост
                    break;
                case '4':
                    usb_cdc_printf((char *)ch4);
                    break;
                case '5':
                    usb_cdc_printf(ch5);
                    break;
                case '6':
                    usb_cdc_printf(ch6);
                    break;
            }
        }
    }
}


прикрепляю полный проект на кокосе, proba6 главный
nx6310
попробуй стек увеличить. может поможет.
Golikov A.
я не смотрел код, так что идеи из раздела пальцем в небо, но вдруг помогут.

когда-то я делал УСБ ручками и если во время "регистрации" устройства в винде, у меня возникали паузы на ответ контрлером больше определенных, заканчивалось все состоянием неисправное устройство. У меня паузы были вызваны попытками выслать отладочные данные. Может у вас в процесс регистрации влазит ваш SPI с АЦП, возникает паузы и готово? Паузы на ответы там разрешены мизерные, все должно быть практически мгновенно.

И второе, где-то тут проходила информацию про ножку УСБ которая типа сигнализирует о наличии конекта, если ее как-то предержать все падало, а она включалась автоматически как ей задавалось направление, не зависимо от функций. Я не очень точно помню тему, проверьте ножки УСБ которые обычно диодиками машут, ваш SPI или АЦП не попало на какую либо такую...
A.Lex
Цитата(Golikov A. @ Sep 25 2013, 20:37) *
И второе, где-то тут проходила информацию про ножку УСБ которая типа сигнализирует о наличии конекта, если ее как-то предержать все падало, а она включалась автоматически как ей задавалось направление, не зависимо от функций.


Это интересно. Название топика не подскажите?
Golikov A.
http://electronix.ru/forum/index.php?showtopic=113683

во чудом нашелsm.gif...
Tapochka
спасибо большое, однако нету в моей библиотеке дефайна VBUS_SENSING_ENABLED, да и по схеме проверил PC10, PC11, PC12 никак на дискавери не связаны с usb. не в пинах счастье sad.gif

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

видимо в этом и дело
Golikov A.
Цитата(Tapochka @ Sep 26 2013, 15:10) *
спасибо большое, однако нету в моей библиотеке дефайна VBUS_SENSING_ENABLED, да и по схеме проверил PC10, PC11, PC12 никак на дискавери не связаны с usb. не в пинах счастье sad.gif


видимо в этом и дело


ну это легко проверить, сделайте кнопку по которой начинается работа с АЦП, а до нажатия пусть молчит и не пытается даже что-то делать... сразу станет все понятно
Tapochka
сделал кнопку - vcp нормально не определяется хоть при нажатой, хоть нет. неужели дело в портах((( подскажите пожалуйста что думаете, просто ума не приложу как связаны могут быть spi и usb ногами в моем примере
HardEgor
что-то я в proba6.c не увидел обработчик SPI3_IRQn.
A.Lex
Цитата(Golikov A. @ Sep 26 2013, 10:17) *


Спасибо!
Tapochka
Цитата
что-то я в proba6.c не увидел обработчик SPI3_IRQn.

а что следует в обработчике делать по-вашему?
Golikov A.
если кнопка не помогла, значит правда стэк кончился...
или же у вас возникает какое-то прерывание и вы в нем повисаете...

нет возможности на ком порт слать данные по ходу работы, хоть локализовать где дохнет...
Tapochka
spi-шных прерываний то нету в проекте, если только usb-шные свои, в файле usb_bsp.c...
а как стек то увеличить?
Golikov A.
не... ну это плохой вопрос...
понятно дело что стэкоувеличивалкой!

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

к сожалению в кокосе не силен, так что ищите... читайте описания
Tapochka
нашел как увеличить стек http://www.coocox.org/forum/topic.php?id=917
однако не могу найти файл arm-gcc-link.ld, где он находится хоть примерно?
BvDV
Цитата(Tapochka @ Sep 27 2013, 11:45) *
нашел как увеличить стек http://www.coocox.org/forum/topic.php?id=917
однако не могу найти файл arm-gcc-link.ld, где он находится хоть примерно?

у меня тут C:\CooCox\CoIDE\configuration\ProgramData\myUSB
может у Вас так же. Если получится отпишитесь.
сарматъ
хм... а что значит вообще стек увеличить то?

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

или я что то путаю?

а в кокосе у меня было два .ld файла и они находились в корне проекта
Golikov A.
стэк один факт и он растет когда надо - тоже факт. Но где его начало?
Есть шанс что он лежит
Память данных + размер стэка. И если размер стека меньше чем на самом деле, то когда он начинаете расти он затирает данные. меняет значения переменных, и прочие неприятности. А иногда ваши попытки записать что-то в переменные которые лежат там куда залез стэк рушит его самого. Как то так...

Вообщем иногда бывает что на границе стэка лежит что-то полезное, потому хорош бы посмотреть карту памяти как там что где разложено, и не вылезает ли стэк за свои пределы.
сарматъ
с этим согласен да посмотреть бы хорошо, вот про увеличить звучит как фантастика, разве что запретить линкеру что то размещать в больших адресах тогда он просто не соберет исполняемый файл и итог один смена контроллера

тапочка а дебагер то работает?
Tapochka
дебагер работает, как ни странно rolleyes.gif

Цитата
у меня тут C:\CooCox\CoIDE\configuration\ProgramData\myUSB
может у Вас так же. Если получится отпишитесь.

спасибо за подсказку, примерно там же был и у меня, однако по вышеприведенной ссылке добавил кусок кода и это ничего не дало(
сарматъ
и чего говорит дебагер? вылетает в исключение или крутится по программе?
Golikov A.
Цитата(сарматъ @ Sep 27 2013, 14:16) *
с этим согласен да посмотреть бы хорошо, вот про увеличить звучит как фантастика, разве что запретить линкеру что то размещать в больших адресах тогда он просто не соберет исполняемый файл и итог один смена контроллера

тапочка а дебагер то работает?


может я чего уже не помню. Но размер стэка это конкретно задаваемая величина. Как минимум потому что есть еще куча, размер которой может быть больше, а может меньше и прочие сегменты памяти. И стэк можно сделать маленьким, и его не хватит, чего неужели в настройках проекта нет на какосе нет стэк сайза?
сарматъ
можно впихнуть в ld файл просто я то говорю о том, что ежели ломается стек в проекте с одим стеком значит не хватает озу, если задать линкеру не размещать данные в верхней памяти (миним гарантированный размер стека) то линкер просто не соберет проект

вообще я к тому что просто надо дебагером пройти пошагово и посмотреть где что не срабатывает

и это... где то я натыкался что usb встречает грабли при совместной работе с последовательными интерфейсами, но тут могу врать ибо не великий специалист в этой области
adnega
Цитата(сарматъ @ Sep 27 2013, 15:48) *
и это... где то я натыкался что usb встречает грабли при совместной работе с последовательными интерфейсами, но тут могу врать ибо не великий специалист в этой области

Граблей нет. Тут как-то выкладывал проект usb-cdc и usb-hid с различными "примочками".
Все работает: гонял даже данные с цифрового микрофона на пределе пропускной способности USB (с микрофоном общался как раз по SPI).
Golikov A.
на прошлой страничке я давал ссылку на эти грабли. Там уарт и ножка усб конфликтовали...
nx6310
размер стека в кококсе находится в файле cmsis_boot/startup/startup_stm32f10x_md.c
Код
/*----------Stack Configuration-----------------------------------------------*/  
#define STACK_SIZE       0x0000500      /*!< The Stack size suggest using even number     */
__attribute__ ((section(".co_stack")))
unsigned long pulStack[STACK_SIZE];

У меня usb отваливалось когда в определенном месте я проводил чтение по spi из флешки. Причем чтение из флешки из другого места программы к таким результатам не приводил. По-моему стека не хватает когда подряд вызываются много функций одна в другой, в стек пишется соответствующая инфа по каждой функции плюс прерывания заполняют стек. в итоге проц вываливается. Возможно я ошибаюсь.
Golikov A.
Цитата(nx6310 @ Sep 27 2013, 19:31) *


да нет вы правы, вызов любой функции сохраняет текущие состояние регистров в стэк, потом добавляет в стэк временные переменные выхыванной функции, если вызывать функцию одну в другой много раз - это верный способ забить стэк.
BvDV
что нибудь получилось в результате?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.