Полная версия этой страницы:
spi и usb на stm32
Tapochka
Sep 25 2013, 12:38
Здравствуйте. Моя задача такова: по 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
Sep 25 2013, 16:45
попробуй стек увеличить. может поможет.
Golikov A.
Sep 25 2013, 17:37
я не смотрел код, так что идеи из раздела пальцем в небо, но вдруг помогут.
когда-то я делал УСБ ручками и если во время "регистрации" устройства в винде, у меня возникали паузы на ответ контрлером больше определенных, заканчивалось все состоянием неисправное устройство. У меня паузы были вызваны попытками выслать отладочные данные. Может у вас в процесс регистрации влазит ваш SPI с АЦП, возникает паузы и готово? Паузы на ответы там разрешены мизерные, все должно быть практически мгновенно.
И второе, где-то тут проходила информацию про ножку УСБ которая типа сигнализирует о наличии конекта, если ее как-то предержать все падало, а она включалась автоматически как ей задавалось направление, не зависимо от функций. Я не очень точно помню тему, проверьте ножки УСБ которые обычно диодиками машут, ваш SPI или АЦП не попало на какую либо такую...
Цитата(Golikov A. @ Sep 25 2013, 20:37)

И второе, где-то тут проходила информацию про ножку УСБ которая типа сигнализирует о наличии конекта, если ее как-то предержать все падало, а она включалась автоматически как ей задавалось направление, не зависимо от функций.
Это интересно. Название топика не подскажите?
Golikov A.
Sep 26 2013, 07:17
Tapochka
Sep 26 2013, 11:10
спасибо большое, однако нету в моей библиотеке дефайна VBUS_SENSING_ENABLED, да и по схеме проверил PC10, PC11, PC12 никак на дискавери не связаны с usb. не в пинах счастье

Цитата
Может у вас в процесс регистрации влазит ваш SPI с АЦП, возникает паузы и готово? Паузы на ответы там разрешены мизерные, все должно быть практически мгновенно.
видимо в этом и дело
Golikov A.
Sep 26 2013, 11:28
Цитата(Tapochka @ Sep 26 2013, 15:10)

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

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

Спасибо!
Tapochka
Sep 26 2013, 12:35
Цитата
что-то я в proba6.c не увидел обработчик SPI3_IRQn.
а что следует в обработчике делать по-вашему?
Golikov A.
Sep 26 2013, 12:57
если кнопка не помогла, значит правда стэк кончился...
или же у вас возникает какое-то прерывание и вы в нем повисаете...
нет возможности на ком порт слать данные по ходу работы, хоть локализовать где дохнет...
Tapochka
Sep 26 2013, 13:10
spi-шных прерываний то нету в проекте, если только usb-шные свои, в файле usb_bsp.c...
а как стек то увеличить?
Golikov A.
Sep 26 2013, 15:23
не... ну это плохой вопрос...
понятно дело что стэкоувеличивалкой!
в зависимости от среды в настройках проекта или специальном файлике заданы размеры стэков, и прочее...
так же в настройках проекта можно включить опцию создания карты памяти и в ней будет точно ясно не залез ли кто туда куда не следовало.
к сожалению в кокосе не силен, так что ищите... читайте описания
Tapochka
Sep 27 2013, 08:45
нашел как увеличить стек
http://www.coocox.org/forum/topic.php?id=917однако не могу найти файл arm-gcc-link.ld, где он находится хоть примерно?
Цитата(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
может у Вас так же. Если получится отпишитесь.
сарматъ
Sep 27 2013, 09:42
хм... а что значит вообще стек увеличить то?
если задачка не в ос делается то там вроде один стек и он просто растет в сторону уменьшения адресов, если кто то на стек наползает или наоборот на кого то стек то единственный путь его увеличения - сменить контроллер с большим озу
или я что то путаю?
а в кокосе у меня было два .ld файла и они находились в корне проекта
Golikov A.
Sep 27 2013, 09:59
стэк один факт и он растет когда надо - тоже факт. Но где его начало?
Есть шанс что он лежит
Память данных + размер стэка. И если размер стека меньше чем на самом деле, то когда он начинаете расти он затирает данные. меняет значения переменных, и прочие неприятности. А иногда ваши попытки записать что-то в переменные которые лежат там куда залез стэк рушит его самого. Как то так...
Вообщем иногда бывает что на границе стэка лежит что-то полезное, потому хорош бы посмотреть карту памяти как там что где разложено, и не вылезает ли стэк за свои пределы.
сарматъ
Sep 27 2013, 10:16
с этим согласен да посмотреть бы хорошо, вот про увеличить звучит как фантастика, разве что запретить линкеру что то размещать в больших адресах тогда он просто не соберет исполняемый файл и итог один смена контроллера
тапочка а дебагер то работает?
Tapochka
Sep 27 2013, 11:09
дебагер работает, как ни странно
Цитата
у меня тут C:\CooCox\CoIDE\configuration\ProgramData\myUSB
может у Вас так же. Если получится отпишитесь.
спасибо за подсказку, примерно там же был и у меня, однако по вышеприведенной ссылке добавил кусок кода и это ничего не дало(
сарматъ
Sep 27 2013, 11:22
и чего говорит дебагер? вылетает в исключение или крутится по программе?
Golikov A.
Sep 27 2013, 11:43
Цитата(сарматъ @ Sep 27 2013, 14:16)

с этим согласен да посмотреть бы хорошо, вот про увеличить звучит как фантастика, разве что запретить линкеру что то размещать в больших адресах тогда он просто не соберет исполняемый файл и итог один смена контроллера
тапочка а дебагер то работает?
может я чего уже не помню. Но размер стэка это конкретно задаваемая величина. Как минимум потому что есть еще куча, размер которой может быть больше, а может меньше и прочие сегменты памяти. И стэк можно сделать маленьким, и его не хватит, чего неужели в настройках проекта нет на какосе нет стэк сайза?
сарматъ
Sep 27 2013, 11:48
можно впихнуть в ld файл просто я то говорю о том, что ежели ломается стек в проекте с одим стеком значит не хватает озу, если задать линкеру не размещать данные в верхней памяти (миним гарантированный размер стека) то линкер просто не соберет проект
вообще я к тому что просто надо дебагером пройти пошагово и посмотреть где что не срабатывает
и это... где то я натыкался что usb встречает грабли при совместной работе с последовательными интерфейсами, но тут могу врать ибо не великий специалист в этой области
adnega
Sep 27 2013, 12:39
Цитата(сарматъ @ Sep 27 2013, 15:48)

и это... где то я натыкался что usb встречает грабли при совместной работе с последовательными интерфейсами, но тут могу врать ибо не великий специалист в этой области
Граблей нет. Тут как-то выкладывал проект usb-cdc и usb-hid с различными "примочками".
Все работает: гонял даже данные с цифрового микрофона на пределе пропускной способности USB (с микрофоном общался как раз по SPI).
Golikov A.
Sep 27 2013, 12:43
на прошлой страничке я давал ссылку на эти грабли. Там уарт и ножка усб конфликтовали...
nx6310
Sep 27 2013, 15:31
размер стека в кококсе находится в файле 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.
Sep 27 2013, 16:56
Цитата(nx6310 @ Sep 27 2013, 19:31)

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