Forums » Программное обеспечение »
SPI0 и UART3
Added by mouse over 11 years ago
Пытаюсь завести SPI0 на отладочном комплекте LDM. В качестве Slave — экранчик с драйвером ILI9320 .
Возникло несколько вопросов:- Вопреки документации, после сброса регистр SPI0CFG имеет значение 0x3092084, т.е. TWEN=1, SSEN=1. По спекам должно быть 0x30020xx.
- При значениях PM=1 и DIV16=1 не будет ли деления на 0 в формуле Fsys / (16 * (4 - 2*FACT)*(PM - 1))? При DIV16=0 формула отличается прилично.
- Настройка фазы синхросигнала и состояния SCK. На TMS320 у меня SCK был, если верить логическому анализатору, LO. При комбинации CPHA=1 и SCK=0, данные от мастера доходят, а чтение из ведомого происходит не по спаду, а по фронту. Стоит только выставить SCK=1, как всё становится на свои места.
- Первая инициализация UART (uart_init) сразу после заливки занимает неприлично много времени (около минуты). Дальнейшие включения и перезапуски — мухой. Проверял путём включения VD3-VD4 до и после uart_init.
- Существует или планиурется ли управление питанием периферии? Включение/отключение неиспользуемых блоков с целью экономии питания?
- Правильно ли я понимаю, что текущий линкер не умеет вырезать из объектных файлов неиспользуемые функции? И для достижения желаемого результата необходимо функции распределять по отдельным исходным файлам?
Очень хочется распиновки периферийных разъёмов для LDM. Пока выручает только тестер. Лучше всего — принципиальная схема LDM как для HW.
А так же:- Возможность пошаговой отладки в железе. mc-dbg пока этого не умеет.
- Возможность загрузки программы прямо в память MCp. Например, я залил статические данные и редко изменямый код (данные, константы, библиотечные функции) в EEPROM, а потом хочу поотлаживать какую-то функцию-две-три и не тратить ресурс EEPROM перепрошивкой, а главное — не тратить уйму времени на заливку по сравнению с микроизменениями в отлаживаемом коде.
- Как вариант, хотелось бы видеть у модели эмуляцию UART'a, чтобы можно было, скажем, подцепиться телнетом на какой-то порт при запущенной модели, и работать с псевдо-UART'ом так, как если бы это был настоящий UART в терминальной программе.
- Препроцессору не нравятся строки исходников, длиннее 65535 байт:
img-mc.c:30: fatal error: Too long source line 0x80ff, 0x80ff, 0x80ff, 0x80ff,[…] 0xe0a4, 0xe2 errors in preprocessor.
PS. Экранчик заработал :)
Replies (35)
RE: SPI0 и UART3 - Added by krufter_multiclet over 11 years ago
1) Проверим
2) Формулу надо поправить в документации на Fsys / (16 * (4 - 2*FACT))*(PM + 1))
3) На microSD карточку данные записывал, проблем с фазой на 1 Гб памяти не возникало, но посмотрю повнимательней комбинацию эту.
4) Это не инициализация uart идёт это прошло 52 секунды и сбросился процессор по Сторожевому таймеру. Для того, чтобы вы сразу видели результат, пожалуйста, скачайте новый загрузчик ploader(для Windows http://multiclet.com/community/attachments/download/59/(win)asm_ld_model_ploader.7z).
5) Планируется
6) Да, всё верно
На стр. 36, 37 приведена распиновка http://www.ldm-systems.ru/doc/multiclet/DS-MCp0411100101-Q208_Evolution.pdf
А так же:
1) Дорабатываем
2) Загрузчик через JTAG допишем и будет такая возможность
3) Сделать конечно можно и полезно бы было, но пока в модели появится только возможность установки перед параграфом значений регистров периферии.
4) Так по стандарту Си89, если хотите использовать очень длинные строки, то добавьте опцию в препроцессор:
-V199901L
P.S. Хотелось бы на фото работающего экранчика посмотреть, на WH1602A, который ставил на плату, не так много строк.
Спасибо за очень полезную информацию!
RE: SPI0 и UART3 - Added by mouse over 11 years ago
Есть ли новый загрузчик под Linux?
Попробовал добавить опцию:
mc-lcc -v -target=mcp -Wa--arch=MCp0411100101 -Wp-V199901L -IMultiCletSDK/include/MCp0411100101 -c multiclet.c mc-lcc $Id$ mc-mcpp -I- -D__LCC__ -V199901L -IMultiCletSDK/include/MCp0411100101 -I-lccdir=MultiCletSDK/bin/include multiclet.c /tmp/lcc99550.i multiclet.c:31: fatal error: Too long source lineОбрубается на тех же 64k.
PS. Картинка в монохроме. Для вывода в цвете надо допиливать RLE-алгоритм.
20130726_hy28.jpg (282 KB) 20130726_hy28.jpg |
RE: SPI0 и UART3 - Added by krufter_multiclet over 11 years ago
Действительно приятная картинка).
Новый загрузчик есть и под Linux http://multiclet.com/community/attachments/download/60/(linux)asm_ld_ploader.7z
А можете прямо к сообщению свой файл прикрепить, в котором такая длинная строка?
RE: SPI0 и UART3 - Added by mouse over 11 years ago
Именно этот mc-ploader я и использую. Он же идёт в комплекте с SDK 20130715:
585913a789d6622aa3ba1dd1243d3898 MultiCletSDK/bin/mc-ploader 585913a789d6622aa3ba1dd1243d3898 mc-ploader
multiclet.c (134 KB) multiclet.c |
RE: SPI0 и UART3 - Added by krufter_multiclet over 11 years ago
А пример с миганием светодиодов работает сразу?
#include <HDL51001_ccf.h> #include <wdt.h> void main() { int i; WDT_OFF; GPIOD->DIR = ((uint32_t)0x00007000); while(1) { GPIOD->OUT = ((uint32_t)0x00007000); for(i=0; i<1000000; i++); GPIOD->OUT = ((uint32_t)0x00000000); for(i=0; i<1000000; i++); } }
RE: SPI0 и UART3 - Added by a.efimov_multiclet over 11 years ago
mouse wrote:
Обрубается на тех же 64k.
Извиняюсь, опция -V199901L, необходима для разрешения количества строк в файле согласно стандарту с99.
В вашем случае одна строка превышает 65535 знаков.
Это ограничение размера входного буфера, его накладывает сам препроцессор.
Варианты решения:
1) Разбить строку на меньшее количество символов.
2) Скачать с сайта http://mcpp.sourceforge.net/download.html исходники препроцессора.
2.1) в файле {mcpp dir}/src/system.H изменить #define NBUFF 0x10000 // на любое значение буфера по желанию.
RE: SPI0 и UART3 - Added by mouse over 11 years ago
Да, сразу (Examples/c/led). Я пробовал WDT_OFF перенести до инициализации UART сразу после включения VD3. Так и не дождался запуска. Минут 5 прождал. Код есть на гитхабе
По поводу CPHA. Я выставил CPHA=1, DIV16=0, PM= 0 и получил чтение по фронту, а не по спаду. При PM=0xF чтение идёт по спаду. При изменении CPHA=0 ответ пустой, т.е. уже до драйвера ничего не доходит (по ЛА данные от мастера впорядке). Уже при PM= 1 и CPHA=1, DIV16=0 всё нормально.
PS. wiki-форматирование не отрабатывает "bold", если перед "*" стоит "=", например: V=*1*
RE: SPI0 и UART3 - Added by krufter_multiclet over 11 years ago
Если вы пишете
void main() { UART_InitTypeDef UART_InitStructure; GPIOD->DIR = ((uint32_t)0x00007000); GPIOD->OUT = ((uint32_t)0x00001000); UART_InitStructure.BaudRate = 38400; //set baudrate UART_InitStructure.TypeParity = 0x00000000; //parity control type UART_InitStructure.Parity = 0x00000000; //enable parity control UART_InitStructure.FlowControl = 0x00000000; //enable cts/rts UART_InitStructure.Mode = 0x00000003; //rx enable - 1 bit, tx enable - 2 bit (rx + tx en) uart_init(UART3, &UART_InitStructure); GPIOD->OUT = ((uint32_t)0x00002000); WDT_OFF;
То данный код работает через 52 секунды? Если нажимаете кнопку reset, то работает сразу?
Если же пишете
void main() { UART_InitTypeDef UART_InitStructure; WDT_OFF; GPIOD->DIR = ((uint32_t)0x00007000); GPIOD->OUT = ((uint32_t)0x00001000); UART_InitStructure.BaudRate = 38400; //set baudrate UART_InitStructure.TypeParity = 0x00000000; //parity control type UART_InitStructure.Parity = 0x00000000; //enable parity control UART_InitStructure.FlowControl = 0x00000000; //enable cts/rts UART_InitStructure.Mode = 0x00000003; //rx enable - 1 bit, tx enable - 2 bit (rx + tx en) uart_init(UART3, &UART_InitStructure); GPIOD->OUT = ((uint32_t)0x00002000);
То не работает совсем? Если нажимаете кнопку reset, то тоже не работает?
RE: SPI0 и UART3 - Added by mouse over 11 years ago
Ещё хочу опробовать PWM. Если они все четыре независимые, можно попробовать подключить драйвер ШД :) У PWM есть принудительный перевод выхода в LOW и аппаратный DeadBand, чтобы не словить коротыш при перекоммутации выходов одной обмотки?
Так-то мне для счастья не хватает CAN (лучше два для двух независимых линий с разными скоростями) и хотя бы 5-10 АЦП =) Кстати, АЦП всегда будет внешним в виде микрухи, подцепленной по SPI?
RE: SPI0 и UART3 - Added by mouse over 11 years ago
То не работает совсем? Если нажимаете кнопку reset, то тоже не работает?
Всё верно. Не работает совсем. Reset помогает. Что интересно, виснет, отработав включение VD3 (0x7000), но так и не добравшись до VD4.
RE: SPI0 и UART3 - Added by krufter_multiclet over 11 years ago
Память похоже не вся прогружается сразу в процессор, странно. Скомпилированный образ памяти можете прикрепить?
У PWM есть установка активного и неактивного уровня канала. Тактируется блок PWM от одного источника, но значения периода для каждого канала можно задавать свои, т.е. можно сказать, что независимые. С помощью ШИМ крутил двигатель для квадрокоптера. Характеристики нового процессора http://multiclet.com/community/boards/6/topics/55
АЦП 8 каналов и ЦАП 2 канала будут на кристалле. CAN и SpaceWire появятся через версию процессора(параметры и набор этого процессора могут измениться), т.е. после выхода нового процессора.
RE: SPI0 и UART3 - Added by mouse over 11 years ago
Вот он.
Про SpaceWire. Есть какие-то примеры, где он уже применяется в "бою"? На сайте star-dundee.com есть внешние девайсы и в PCI-исполнении. На российском рынке эта технология кем-то уже применяется?
RE: SPI0 и UART3 - Added by krufter_multiclet over 11 years ago
Элвис какую-то микросхему делали со SpaceWire, в процессор вроде не ставили. Миссий космических в РФ со SpaceWire не подскажу, но в списке участников конференций по SpaceWire РосКосмос числится.
На моей плате сразу всё загрузилось с image.bin и по UART выдало несколько сообщений, сейчас проверю на серийной.
RE: SPI0 и UART3 - Added by mouse over 11 years ago
Как быть с PM=1 и PM=0, ломающим чтение от ведомого?
RE: SPI0 и UART3 - Added by krufter_multiclet over 11 years ago
Формулы выглядят так(во втором посте подправил):
при DIV16 = 0 Fsys / (4 - 2*FACT)*(PM + 1)
при DIV16 = 1 Fsys / (16 * (4 - 2*FACT))*(PM + 1))
PM по логике влиять не должен на чтение по спаду или фронту. Надо мне самому проверить это влияние, что-нибудь написать для примера. Заверну с одного SPI на другой данные и отпишусь о результате.
Кстати ваш скомпилированный пример и на второй плате заработал без задержки. Вы прошивали плату из под ОС Linux?
RE: SPI0 и UART3 - Added by mouse over 11 years ago
Вот. Теперь оно как-то более законченно выглядит :)
RE: SPI0 и UART3 - Added by krufter_multiclet over 11 years ago
Круто! С SPI в понедельник решим все неопределённости.
RE: SPI0 и UART3 - Added by HEMAH over 11 years ago
mouse wrote:
Вот. Теперь оно как-то более законченно выглядит :)
А что за индикатор у вас стоит? Мне само конструктивное исполнение просто понравилось:)
UPD - Благодарствую!)
RE: SPI0 и UART3 - Added by mouse over 11 years ago
Брал такой (аж три штуки прозапас :)
http://hotmcu.com/28-touch-screen-tft-lcd-with-spi-interface-p-42.html
Только один момент — пины 2.0 mm. Компактно, но неудобно в отладке.
RE: SPI0 и UART3 - Added by trott over 11 years ago
mouse принудительный перевод выхода в LOW и аппаратный DeadBand, чтобы не словить коротыш при перекоммутации выходов одной обмотки есть например у драйвера IR2104 или для трех фаз у драйвера IR2132. Кроме того, эти драйверы смогут открыть верхний управляющий ключ, когда напряжение на обмотке(в средней точке) оказывается равно напряжению питания силовой части.
RE: SPI0 и UART3 - Added by mouse over 11 years ago
У меня в драйвере используются IR2184. Мне как-то попалась неудачно разведённая плата, где феерверком выгорел драйвер DRV8412. Да и не все схемы имеют deadband. Я для общего случая.
RE: SPI0 и UART3 - Added by mouse over 11 years ago
По поводу начальных значений регистров SPIx. После сброса имеем:
SPI0CFG=0x3092084 SPI1CFG=0x3092084 SPI2CFG=0x3092084вместо 0x30020xx. Есть идеи, из-за чего так?
RE: SPI0 и UART3 - Added by krufter_multiclet over 11 years ago
Я как раз с SPI сейчас работаю, просто на другие дела отвлекаюсь. Возможно, что аппаратно так установили и поправим только в следующей версии которая готовится к выходу в этом году. Странно, что когда стандарт SPI делали создали MISO и MOSI, что останавливало сделать MOSO и MISI, путаницы бы меньше было. Да, что-то похожее на вашу ситуацию с SPI увидел, завтра ещё раз по всем фазам пройдусь и окончательный результат сообщу.
RE: SPI0 и UART3 - Added by mouse over 11 years ago
Да, MISO/MOSI сильно сбивает с толку. Обычные RX/TX как-то попонятнее. Тем более, что Daisy Chain слейвами почти никакими не поддерживается, а роль Master/Slave редко где меняется (как на трёхпроводных схемах — не знаю). На тех же TMS нельзя выбрать Slave, только Master.
RE: SPI0 и UART3 - Added by krufter_multiclet over 11 years ago
По поводу начальных значений регистров SPIx.
Данный регистр конфигурации отвечает за возможности блока SPI. Биты SSEN и TWEN просто говорят о том, что поддерживаются данные опции. И данный регистр имеет доступ только на чтение. Включение трёхпроводного режима осуществляется в регистре управления. В документации описание регистра поправим.
Информация по работе с фазой приёма будет позже.