Project

General

Profile

SPI0 и UART3

Added by mouse over 11 years ago

Пытаюсь завести SPI0 на отладочном комплекте LDM. В качестве Slave — экранчик с драйвером ILI9320 .

Возникло несколько вопросов:
  1. Вопреки документации, после сброса регистр SPI0CFG имеет значение 0x3092084, т.е. TWEN=1, SSEN=1. По спекам должно быть 0x30020xx.
  2. При значениях PM=1 и DIV16=1 не будет ли деления на 0 в формуле Fsys / (16 * (4 - 2*FACT)*(PM - 1))? При DIV16=0 формула отличается прилично.
  3. Настройка фазы синхросигнала и состояния SCK. На TMS320 у меня SCK был, если верить логическому анализатору, LO. При комбинации CPHA=1 и SCK=0, данные от мастера доходят, а чтение из ведомого происходит не по спаду, а по фронту. Стоит только выставить SCK=1, как всё становится на свои места.
  4. Первая инициализация UART (uart_init) сразу после заливки занимает неприлично много времени (около минуты). Дальнейшие включения и перезапуски — мухой. Проверял путём включения VD3-VD4 до и после uart_init.
  5. Существует или планиурется ли управление питанием периферии? Включение/отключение неиспользуемых блоков с целью экономии питания?
  6. Правильно ли я понимаю, что текущий линкер не умеет вырезать из объектных файлов неиспользуемые функции? И для достижения желаемого результата необходимо функции распределять по отдельным исходным файлам?

Очень хочется распиновки периферийных разъёмов для LDM. Пока выручает только тестер. Лучше всего — принципиальная схема LDM как для HW.

А так же:
  1. Возможность пошаговой отладки в железе. mc-dbg пока этого не умеет.
  2. Возможность загрузки программы прямо в память MCp. Например, я залил статические данные и редко изменямый код (данные, константы, библиотечные функции) в EEPROM, а потом хочу поотлаживать какую-то функцию-две-три и не тратить ресурс EEPROM перепрошивкой, а главное — не тратить уйму времени на заливку по сравнению с микроизменениями в отлаживаемом коде.
  3. Как вариант, хотелось бы видеть у модели эмуляцию UART'a, чтобы можно было, скажем, подцепиться телнетом на какой-то порт при запущенной модели, и работать с псевдо-UART'ом так, как если бы это был настоящий UART в терминальной программе.
  4. Препроцессору не нравятся строки исходников, длиннее 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-алгоритм.

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

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-исполнении. На российском рынке эта технология кем-то уже применяется?

image.bin (67.6 KB) image.bin

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 просто говорят о том, что поддерживаются данные опции. И данный регистр имеет доступ только на чтение. Включение трёхпроводного режима осуществляется в регистре управления. В документации описание регистра поправим.
Информация по работе с фазой приёма будет позже.

(1-25/35)