Jump to content

    

prst

Свой
  • Content Count

    702
  • Joined

  • Last visited

Everything posted by prst


  1. Привет коллеги, C Xilinx ранее не работал (только с Altera и то давно), Xilinx с будет первый раз, так что куча вопросов еще будет :) Стоит необходимость сделать DDR3 Sniffer для прослушивания/подслушивания данных на плате. Планирую для этого заложить Xilinx Spartan 6. Есть KIT-плата и на неё будут заводиться данные с шин данных/аддреса/упраления DDR3. Процесс подслушивания классический: припаяться проводками в нужные места платы, снять данные по определенным адресам и слить дамп в компьютер. Думаю что подобное уже делали не раз, но пока не нашел на форуме дискусий, еще ищю... Вопросы: 1) Сопряжение сигналов, скорость 400..800МГц, тут целостность сигнала будет нарушена как только проводками припояюсь, по этому хочу спросить вас о рекомендациях. Ибо просто проводочки, коих будет на шине и данных очень много, сильно исказят сигнал. 2) Ньюансы Spartan 6 при работе с быстрыми сигналами. Ну и да, на сколько это вообще реально на этом семействе заснифить пинами 800МГц сигнал? Поверхностно пробежался по даташиту - кажется что весьма реально. Но есть незавершенное понимание как LVDS (он же дифф-пара) приручить слушать просто 1 полюсный сигнал. Нужно уточнить. В ДШ сказано "Up to 1,080 Mb/s data transfer rate per differential I/O" http://www.xilinx.com/support/documentatio...heets/ds160.pdf Посоветуйте плиз (как можно больше :) ) в направлении пройденых граблей.
  2. Не смотря на то, что проблемы что описаны выше, уже решил, наткнулся только что на рускоязычную статью, может кому пригодится в будущем, оставлю её тут. http://blablacode.ru/tms320/tms320-%D0%B4%...%D0%BE-spi.html
  3. немного с опазданием, но всёж таки добавлю ради истории по этой тематике "This program is TMS320F28335 with Ethernet communication between network chip ENC28J60, program interface uses an interrupt, the program ping command to test." http://en.pudn.com/downloads595/sourcecode...2433570_en.html
  4. пробовал, вчера и сегодня, и как раз сегодня осциллографом очередной раз дебажил это, и параллельно менял режимы в FTDI. вчера ни чего не получалось, возможно комбинацию нужную пропустил, сегодня сдвиг есть положительный. Соединилось на 6 Мбит, тактирование в 10 и 12 Мбит всё с теми же артефактами. Мне как раз и нужно добиться 10..12 Мбит в слэйв режиме.
  5. Ребята, подскажите как решить проблему. Заложил TMS320F28027 - в SPI - выбран slave mode(так нужно) Всё это безобразие общается с FTDI в режиме MPSSE, и написана прога под линуксом для взаимодействия, все ни как не получалось добиться адекватного поведения на высоких скоростях, выше 1МБита, полез смотреть осциллографом, и очумел от удивления, странности с сдвигом, или задержками, и клоком, от сюда проблемы... и вторая проблема - глюки значения статусного регистра при отправке данных. Детальнее о проблемах 1) скорость выше 1 МБит - эту проблему я рассмотрел в осциллографе, когда приходит смена фронта клока, с 1->0 то в этот момент данные только начинают меняться, и если скорость выше 1 МБит то срабатывает с запазданием в следующем клоке, например передается 0x44 а принимается 0x22 и т д 2) Значение статус-регистра тоже ведет себя некорректно. Обычно один байт(точнее 16 битное слово) передается корректно, то есть "SPI_FifoStatus_e SPI_getRxFifoStatus(SPI_Handle spiHandle)" возвращает как положено - SPI_FifoStatus_Empty, и всё... дальше пурга начинается. Статусный регистр SPIFFRX возвращает с функции "SPI_FifoStatus_e SPI_getRxFifoStatus(SPI_Handle spiHandle)" - то возвращается бесконечно SPI_FifoStatus_1_Word, а иногда правильное SPI_FifoStatus_Empty, причем крайне "иногда" вот так запись значения и чтение статуса - всё как по документации SPI_write( mySpi, temp ); // adc_buffer[0] while(SPI_FifoStatus_Empty!=SPI_getTxFifoStatus(mySpi)); на строчке - while(SPI_FifoStatus_Empty!=SPI_getTxFifoStatus(mySpi)); - подвисает пробовал писать прямо в регистры, не используя API SpiaRegs.SPITXBUF = temp; while ( SpiaRegs.SPIFFTX.bit.TXFFST != 0) {} результат идентичен, виснет на строке - while ( SpiaRegs.SPIFFTX.bit.TXFFST != 0) {} так же в даташите есть пример для 3-wire, уже и его пробовал, хотя он по идее и не должен работать, так как у меня 4-wire mode Uint16 data; Uint16 dummy; SpiaRegs.SPICTL.bit.TALK = 1; // Enable Transmit path SpiaRegs.SPITXBUF = data; // Slave transmits data while(SpiaRegs.SPISTS.bit.INT_FLAG !=1) {} // Wait until data rx'd dummy = SpiaRegs.SPIRXBUF; // Clears junk data from itself тут тоже - на строчке while(SpiaRegs.SPISTS.bit.INT_FLAG !=1) {} - зависает и чета ждёт. перерыл гугл, в режиме "slave mode" не нашел ни каких примеров, только режим мастера, мне нужно подсмотреть, чтоб понять, что у меня не так. - может у вас есть образец? - Или там есть какая-то тонкость которую я не уловил в документации?
  6. Я с этим проциком щас балуюсь дома и на работе, но не в симуляторе а в реале. В протеусе смотрел те примеры, вроде все они абсолютно правдоподобно рабочие. ...если чё, тут есть мои коды на этот TMS320F28027, рабочие - https://github.com/prst/TMS320F28xxx результаты периодически описываю у себя на сайте (http://www.uschema.com/) в частности на форуме, например http://www.uschema.com/forum/viewtopic.php?f=52&t=3993
  7. ну вот смотрите: 1) брать внешний ацп+другой мк - "шило на мыло", тем более что платку на tms320f28027 уже купил. а у АЦП до 4.6 мегасемплов 2) сперва планировалось, что будет БПФ считаться на ДСПшке, так как виделся лимит в максимум 100кГц, потом изменилось кое что и уже нужно обсчитывать более 1МГц частоту, так что от сюда минимум 2мегасепмла. Тем более, будет глубокий анализ результата спектра тоже программный, так что вполне резонно все перенести на мощный ПК 3) ну и самое главное, так как дынные забирать планирую по SPI, то в перспективе можно будет поставить просто намного мощный АЦП с интерфейсом SPI, так что это щас как временное решение можно рассматривать. Ну и уж коль SPI то действительно, решением в моей задаче, использовать USB вместо ethernet, даже правильней
  8. не получится, так как просто не успеет DSP. нужно обработать около 2 мегасэмплов с ADC DSP, и при этом несколько каналов, на tms320f28027 и отправить в внешний мир, просто не успеет, так что лучше просто отправлять стрим данных с ADC->SPI и при этом DSP ещё что-то другое будет иметь ресурс сделать...
  9. Как раз, аналогичные мысли были как запасной путь. Ethernet для того чтоб считать БПФ на быстром компе. Щас думаю вместо Ethernet использовать SPI->USB (через FTDI).
  10. Забыл уточнить В этой затее нужно чтоб интерфейс был SPI-подобный, во первых потому что мало пинов у выбранного чипа 28027, и во вторых чтоб по минимуму нагружать.
  11. нет, я считаю что вы могли поставить какую-то ненужную галочку для хекса, хотя я искренне сомневаюсь, но и исключать нельзя. Я предложил альтернативный метод, а уж пробовать его или нет, это вы сами вольны. ) А почему вы не прошиваете при помощи CCS?
  12. Аоходе что у вас явно не корректно сгенерёный хекс. Попробуйте в настройках проекта указать, в секции C2000 Hex Utility -> Output format options - установите выдавать бинарик, и его заливайте в камень Более того, через hex2000.exe вы можете сконвертить свой *.out вручную во что угодно, что-то подобное обсуждалось в моей теме: http://electronix.ru/forum/index.php?showt...p;#entry1255227 там всё просто - чтото вроде hex2000.exe -boot -b -can8 -pllcr=10 -divsel=2 ../Debug/28335_test.out В принципе формат бинарика и хекса очень простые, можно спокойно написать свой конвертер bin-to-hex. Но есть уже готовый в составе CCS, так что попробуйте использовать готовый.
  13. Коллеги, интересует вот такая тема: Есть tms320f28027 и хочу прицепить ethernet, в принципе любой, но пока присматриваюсь к ENC28J60 или чемуто похожему. Суть идеи: нужно данные измерения с АЦП гнать на компьютер, где они будут пересчитываться в FFT/DFT. Вот для этого и нужен ethernet. Наедялся найти в инете какой либо проект для изучения и старта, и так понял что, народ особо в этом направлении не выкладывал ни чего в инет. Чую что это давно пройденная тема, но чтото не удется найти примерчик под любой tms320f28xxx. Или просто не нашел? Подскажите плиз.
  14. В данном случае я говорю про виндовую. Я так понял 6-я от 5-й особо ни чем и не отличается, компилятор разве что стал новее. Больше разницы не заметил. Под линуксом 6-я поставилась нормально, вроде все ок. У себя на сайте я описывал процесс - http://www.uschema.com/ti_lunchpad_f28027_use_with_linux/
  15. Для переменных нужно создавать не в mydata_servise : > FLASHH, PAGE = 0 а, в RAM выделить также микро-секцию. я делал так, у себя в .cmd "отрезал" мелкие кусочки, Просто к сведению, там ведь можно не только склеивать, но и обрезать. volatile это совсем с другого предназначения, и он тут неуместен. Для явного указания месторасположения в флеше достаточно указать const. (о, вам там кстати ответили тоже самое) Когда например используется #pragma DATA_SECTION , то нужно указывать не переменную, а функцию, например: #pragma DATA_SECTION(wer, "mydata_servise"); Uint16 wer (Uint16 *datain) Пишу на память(код на работе), могу гдето описку допустить, но думаю смысл вы поняли. Ух, не советовал бы, я наексперементировался... кстати при таймере в прерывании еще иногда работает, и даже иногда пишет верно, но зачастую с сбоями. А вот если включить прерывание в АЦП, то вообще, только сбои при записи. Короче я после детальных эксперементов решил всё таки прекратить баловаться с прерываниями. Писать нужно только данные которые находятся в ОЗУ. В теории можно с секции которая не стирается, но у меня были какие то там сбои, уже точно не помню что именно.
  16. Так это я уже давно понял, где-то по теме выше, уже это пару раз рассказывали. Я же говорю о другом совсем(ну или немножко)... в принципе то что я делаю, это не так уж и важно, оно просто не совсем традиционное. Но если говорить кратко - то тема помогла решить те вопросы что были ранее )) По этому всем кто помог прояснить и объяснить непонятные моменты - огромное спасибо! :laughing: Я стартанул в разных видах свои прошивки, и получил довольно хороший результат, как мне показалось. А особенно, !спасибо! doom13 :rolleyes:
  17. все именно так, только вместо 0x380800, должно быть 0x380400 А так, как раз Вами описан классический способ, и как раз подобного поста мне не хватало в начале всего этого пути... Только отличие в том, что мне нужно не только грузиться по тому что в 0x38FFF6, но и возможно по совершенно другому адресу самый простой пример, на чипе, в разные секции записаны разные версии, и нужно на них уметь перепрыгивать. своего рода - мультибут, и главная особенность что точки старта у них могут меняться после перепрошивки каждый раз То есть, цель сделать чуть более разумный и гибкий лоадер. что вобщем-то, мне кажется, удалось. Вот тут то и проблема, была, которую я уже пофиксил, что в LD передается только константа... щас я могу гибко перепрыгивать в любое место которое узнаю при записи новой версии передав только переменную с значением точки бута. Ну и второй момент, приложение может быть собрано в бинарик без всякого там _c_int00, а точнее без библиотеки rts2800_ml.lib, конечно это малая вероятность, но тем не менее не исключено тоже
  18. У меня 2 уровня, Первый сам OTP, который грузит в ОЗУ вторую, промежуточную прогу, Второй - грузит фирмварю, вторая кстати и записывает её в флеш через флэшАпи. Так вот там адрес точки входа то может меняться, не исключено, ибо она а ОЗУ а а будущем неизвестно как всё повернется. да, я знаю, я так пробовал, распалогал по адресу 0x8000 и от туда успешно грузился способом как вы написали ниже. Но как я уже писал адрес точки схода может поменяться. Тут только константой задается, если передать вместо 0x3F7FF6 например _var_addr где будет храниться значение адреса, то по факту будет переход по адресу той самой переменной var_addr, а это точно не то, что мне нужно Если честно я не понял как оно у вас так работает. То что вы описали это классический подход к приложению в флеше. Ведь по идее точка входа даже в вашем случае будет гдето, но чтоб до неё добраться нужно пройти сквозь _c_int00, на адрес который то и будет указывать значение в 0x38fff6. Так вот о чем я и говорил, что если вместо секции OTP, расположить нашу прогу(А), которая на самом деле OTP, только собранная для старта флеш, то будет её точка старта всё в том же 0x38fff6, и как только она скачает новую прошивку для флеша и перезапишет, то в том же 0x38fff6 уже будет указание не на (А) п на нашу новую прогу. Вот что я имел ввиду. И вот это как побороть я не понял, все пробы что делал не венчались успехом.
  19. Не всё так просто, даже не учитывая лишние и не нужные действия CCSа 5.5. Начну с того что я заметил и потом еще и понял. -При записи OTP CCS5.5 делает совершенно лишнее действие - стирает секции флэша. Вот совершенно лишнее. -А вот при повторной попытке перезапи OTP с другим адресом старта - оно дописывает биты по адресу старта для OTP 0x380400 - а вот это уже откровенный косяк, так как он то должен быть тоже однократно записываемый... короче я так запорол несколько чипов в экспериментах... Потом этот идиотский _с_int00 - я нашел на него исходники и продебажил, спечатления что он вообще на фиг не нужен для OTP. Вообще вся библиотека rts2800_ml.lib уже несколько дней мне трахает мозги, по той причине что она не нужна для задачи OTP, вот вообщем как я понял. А еще то что она при выходе с main() перехватывает и отправляет в exit() от куда потом в abort() это рвет сохги в клочья. Короче пришлось сегодня писать хак на асме для непосредтвенного прыжка по адресу хранящемуся в переменной. Тоже кстати та ещё задачка, не зная асма этого проца... Да я нашёл, оказуется там все просто, пока не обнаружил на днях выше описанный косяк в чипе не понял что это вообще у меня такое было. Вот чтото ТИ саппорт на многие вопросы не может дать ответа, судя по наблюдениям при поиске последних дней, видать у меня тоже били такое сложные вопросы... и часто даже они просто юлят, что в край было странною наблюдать. так и есть. Я попытался тоже так сделал - но когда промучался пару дней с поиском вопроса на ответ, отказался и вернулся к ОТП. А проблема вот какая, когда ОТП-лайк прога в флэшн - её стандартный адрес BEGIN=0x38fff6, но кактолько она скача саму фирмвалю и написала то в BEGIN переписался тоже алрес старта, и разумеется наша ОТП-лайк прога уде ни когда не стартанет. В общем я не нашел и не придумал как это обойти (единственное было с мыслях парсить весь стрим и найдя этот пдоес тупо его игнорить и перехватывать для записи в другое место) У меня весь стрим принимается по 2 байта и также и пишется сразу же по 1 слову. (Про эту находку я писал ранее) Я досе часто заглядую в Ваш код поискать чё нить полезное в качестве ответа на вопросы, и часто нахожу... )) Спасибо! CCS3 не использую, меня от него коробит, кашмарный софт, не удобный ни разу. Но возможно таки прийдется тоже под него проект сделать. "ExitBoot() в bootloader 28335 возвращает указатель стека на 0x400. " - О да, я несколько дней дебажил, и нашел виновника зла... - RTS2800_ml.lib. Пришлось сегодня писать хак на асме (основан на http://e2e.ti.com/support/development_tool...27/767892.aspx). "Но в процессе проверки я нашел, что SP при выходе из загрузчика указывает на область ОЗУ M0. Так что, если в программе эта область используется под данные, можно поиметь проблему." - ага, с похожим сталкивался тоже. По этому щас *.cmd линкер-файле разбрасываю секции памяти, это еще тоже отдельное "поле для экспериментов" кстати.
  20. о, вот комбинировано я еще не пробовал, все время симуллировал, то в флеше, то в озу. Спасибо за совет. Да именно так и делаю, сегодня как раз дебажил (но еще не до конца). Все так, только за одним исключением, я прыгаю не на 0033fff6, а на EntryPoint, который мне сообщается в бинарике. Подскажите тогда сразу по ходу и на другие вопросы - ответы. 1) Столкнулся с глюком CCS изза которого пришлось делать все через свою прогу 2го уровня. А точнее, вот создал я прошивку для OTP но при записи средствами CCS (F11) она не стартует после рестарта и разумеется плата с уже установленными пинами в отп загрузку. Но если я записую эту же прошивку своим загрузчиком 2го уровня, то все отлично(только для отп не делаю стирания перед записью). Выглядит как будто какойто косяк в CCS. Но чтото мне подсказывает что это не так. может встречались с таким? 2) Как быть? прошивку для OTP я слелал (допустим уже она финально отлажена) как теперь на производстве массово её прошивать, сотнями-тысячами в день? Вчера начальник сказал это вопрос тоже первостепенной важности и его нужно решить. Разумеется отдавать на завод исходники чтоб они компилили и прошивали, так это точно не способ. Вот как тут быть? Подскажите. Сегодня нашел прогу C2Prog но чтото она не работает с моим эмулятором, так что проверить не смог. Какие еще есть варианты?
  21. у меня на плате по дефолту предполагается загрузка только в отп режиме. но так как щас еще не все части работают то я их вынужден проверять либо с флэша, либо с озу. -переходит на адрес старта 2го уровня, который в свою очередь скачивает прошивку большого размера. это происходит не каждый раз, а только когда найден установленный флаг, иначе переходит на адрес выполнения старой программы и не обновляет. выше я уже написал что загрузка 2го не всегда, а только при наличии явного указания для обновления. у меня отп режим который при старте смотрит нужноли скачивать новую прошивку, если не нужно, старт старой. если нужно то качается 2го уровня, запускается, скачивается полностью фирмваря и записывается вместо старой.
  22. Это я знаю. Я формирую именно бинарик. И потом, когда мой OTP скачивает загрузчик 2го уровня, в котором уже FlashAPI, то в нем то я из ОЗУ и собираюсь писать прошивку (также я записывал OTP, потому что через CCS не получалось), согласно тому как устроен бинарик так и пишу, там же указывается и адрес и размер и сами данные. Но почему то оно так не работает с CCS`а. Хотя по идее должно. Когда я проверял тот же файл слинкованный под старт с флэша - оно работало. Перелинковывал под OTP отказывалось грузиться, и конечно же бут-пины я выставля в соответствии с Flash/OTP. Ага, так и есть. Да все стандартно, линкуются секции codestart .initboot .text cinit, .pinit ... итд. юзается библиотека rts2800_ml.lib которая предоставляет точку входа _c_int00 и она уже вызывает main() Классика. Щас вопрос не про загрузку. Там я уже разобрался давно. Тут вопрос про то если этот код загружен уже в ОЗУ и из него произвидится запись в флеш, тоесть мне прилетает стрим и я его должен записать, потом перегрузиться и должно работать с новой прошивкой. на данном этапе, в вопросе это по идее и не важно, исходим из того что программа уже в работе... да, я это знаю. Кстати я нашел еще другой странный баг. Если в CCS5 зашивать собранный OTP код, он зашивается, но не грузится, а если через такую программу как у меня уже написано(тоесть через FlashAPI принятые байты бинарика сразу записывать то тем адресам что сообщает бинарик) то все записываемое потом работает и нормально бутится с OTP, то настолько странно что у меня мозги вывернулись а попытке понять причину. По идее с CCS нужно нажать F11 и записать без всяких проблем. Но у меня нет столько чипов для экспериментов, да и времени тоже. Сегодня кстати вообще пояаился фиерический глюк, при компиляции FlashAPI начал писвть что он не совместим с моим процом, хотя в настройказ проекта установлен правильно, пробовал вчерашний и ранее, новый глюк...
  23. Есть уже мной написанный загрузчик через CAN(пропустим особенности, они не нежны). Он получает прошивку, которую помещает в ОЗУ. От туда её нужно записать в DSP Flash чтоб потом нормально с неё загружаться. То есть, мне нужно записать прошивку, не через CCS, а через внтруннюю FlashAPI, своей программой.У меня TMS320F28335 - как устроено формирование .bin файла я разобрался, но не могу понять как сделать формирование этой прошивки в .bin для записи из ОЗУ внутри. Когда я получаю прошивку через CAN и записываю +передергиваю питание... она не стартует, а если ту же прошивку записать через CCS, то все работает. кстати если сразу после прошивки начать дебажить, то она работает. Также я проверил содержимое флэша, по тем адресам, что в бинарике, они так же там же находятся в флеше после записи, то есть полностью правильно записываются. Такая же задача, но с записью в OTP секцию - работает, а вот с записью в флэш - не получается..., возможно что то с линкер файлом. Помогите плиз разобраться с проблемой, а то уже мозги выкручиваются...
  24. Стирает без проблем, но при записи... вот что пишет при попытки записать в OTP