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

У меня от старого проекта оставались включенные прерывания SMBuS и внешнее, но на ножках ничего не было. Удалил лишнее, сделал прерывание от UART высшего приоритета - заработало!

Alexashka, большое спасибо!

Получается странный эффект: если несколько раз включить и выключить передачу данных, в какой то момент что-то зависает и после очередного включения прибор не проходит энумерацию. В диспетчере устройств все нормально. Когда данные по UART не передаю такого эффекта добиться не удалось.

 

Посмотрел, заканчивается все вроде корректно, после команды "Стоп" данные уже не идут, запросов данных тоже нет. То есть "Стоп" вроде как корректно обрабатывается.

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


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

Проверьте нет ли циклов каких в прерывании УАРТ, каких нибудь while() в котором может подвиснуть. Энумерация очень быстро проходит, если девайс во время не отвечает, то хост вполне может его не подключить.А вообще что значит "чтото зависает"? Под отладчиком смотрели? Где при этом находится программа?

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


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

Проверьте нет ли циклов каких в прерывании УАРТ, каких нибудь while() в котором может подвиснуть. Энумерация очень быстро проходит, если девайс во время не отвечает, то хост вполне может его не подключить.А вообще что значит "чтото зависает"? Под отладчиком смотрели? Где при этом находится программа?

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

Смотрел в USB Trace, после попытки подключиться отправляет кучу запросов по нулевому ендпойнту, все запросы помечены как успешные...

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


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

По Вашему описанию трудно что-либо понять.

после очередного включения прибор не проходит энумерацию
Какого включения, куда? Одни догадки.

Вы его в хост подтыкаете, а силабс при этом имеет собственное питание или как? Процедура подключения к хосту самопальная? Когда я делал USB линк на F320, питание было от USB и проблем не возникало -каждый втык - рестарт программы, заново процедура подключения, до окончания подключения (пока не выставится флаг что USB подключен и сконфигурирован) никаких действий с моей стороны не предпринимается. Может Вы чтото пытаетесь слать до того, как полностью закончится процедура конфигурирования и это нарушает ее. Вообщем опишите более подробно что, куда, зачем и как...

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


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

Нет, если перетыкать в USB, то все нормально.

Я имею ввиду, когда управляю с ПК. С энумерацией я наверно Вас запутал, энумерация же при включении происходит.

При нажатии кнопки "Старт" тестовой программы, перед тем как эту команду отправить выполняется некая функция

Enum(), в описании которой сказано, что она возвращает список поддерживаемых устройств.

Я посмотрел в USB Trace - эта функция запрашивает дескрипторы. Я сравнил логи для случая когда все нормально и когда происходит ошибка.

Сначала там идет запрос дескриптора устройства, потом запрос строкового дескриптора, потом еще один строковый. Дескрипторы, естественно, одинаковые, данные идут одни и те же.

После отправки каждого дескриптора идет еще какой то запрос, который отправляет на хост два байта. После отправки дескриптора устройства и первого строкового дескриптора эти двухбайтовые запросы у меня совпадают. А вот после отправки второго строкового дескриптора эти двухбайтовые запросы разные. При удачном старте - всегда 12 03

Вот лог из USB Trace

post-65102-1448440361_thumb.png

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


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

как я понял это

80 - запрос к устройству

6 - тип запроса (получить дескриптор)

3 - тип дескриптора (строковый дескриптор)

3 - индекс дескриптора. Вот это не понял что такое. Индексы передаются в дескрипторе устройства вроде

9 и 4 - идентификатор языка

2 и 0 - кол-во данных

 

в поле данных этого запроса при удачном старте 12 03, а при неудачном - другие числа

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


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

Т.е. силабс отправляет в УСБ чтото не то? Первое что приходит на ум -проблема с целостностью УСБ буфера. Вообщем в Вашем самом приоритетном прерывании нужно исключить любую возможность обращения к FIFO USB и вообще к регистрам USB. Так и не понял каким образом реализованы обработчики системных запросов USB.

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


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

Т.е. силабс отправляет в УСБ чтото не то? Первое что приходит на ум -проблема с целостностью УСБ буфера. Вообщем в Вашем самом приоритетном прерывании нужно исключить любую возможность обращения к FIFO USB и вообще к регистрам USB. Так и не понял каким образом реализованы обработчики системных запросов USB.

В общем да, отправляет что-то не то. Самое приоритетное прерывание - это UART, там я USB не трогаю. В main отправляю данные по USB. Обработчики запросов...там кода много, могу конечно прикрепить

 

у меня строковый дескриптор был xdata

code const  BYTE /*xdata*/ String3Desc[STR3LEN+2] =
{
   STR3LEN, 0x03,
   'S', 0,   
   'N', 0,
   '-', 0,
   '0', 0,
   '0', 0,
   '0', 0,
   '0', 0,
   '0', 0
}; //end of String3Desc

 

я его сделал code const, как остальные

не понимаю почему, но вроде перестало сбиваться

 

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


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

у меня строковый дескриптор был xdata

 

я его сделал code const, как остальные

не понимаю почему, но вроде перестало сбиваться

Посмотрите после глюка значение дескриптора в памяти xdata -возможно гдето вылезаете за границы массива и затираете свой дескриптор. Если это так, то c code const проблема скорей всего не исчезнет, а проявится потом в другом месте.

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


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

Посмотрите после глюка значение дескриптора в памяти xdata -возможно гдето вылезаете за границы массива и затираете свой дескриптор. Если это так, то c code const проблема скорей всего не исчезнет, а проявится потом в другом месте.

не совсем понял, что это значит? памяти не хватает? Keil разве об этом не должен предупредить?

 

У меня сейчас в проекте Keil насчитал

Program Size: data=103.5 xdata=447 code=4148

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


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

не совсем понял, что это значит? памяти не хватает? Keil разве об этом не должен предупредить?

Не о том я. Вот Вы определили массив X[10] на 10 элементов, а потом пишете по номеру X[11] -Кейл об этом ничего не скажет. Ошибки в работе тоже может не быть - зависит от того, что расположено следом за этим массивом. У меня такое довольно часто происходит :(

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


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

Не о том я. Вот Вы определили массив X[10] на 10 элементов, а потом пишете по номеру X[11] -Кейл об этом ничего не скажет. Ошибки в работе тоже может не быть - зависит от того, что расположено следом за этим массивом. У меня такое довольно часто происходит :(

Может быть. Что там в USB буферах делается я не знаю. А вот в моей системе передачи из двух буферов размер указателей никак не контролируется

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

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


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

Скажите пожалуйста, кто-нибудь работал в среде Silicon Laboratories IDE ? Есть какие то преимущества перед Keil?

Еще у них новую программу видел Simplicity Studio, но это как я понял какой то сборник программ.

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


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

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...