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

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

Ну я это говорю про LPC17... Но если говорят что там всё так же....

Нетрудно самому проверить и убедиться: запретить прерывания, загрузить FIFO полностью и посмотреть осциллограмму.

Сделать это лучше на малой частоте SCLK. И повторить в разных режимах.

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


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

Пауза между словами вносится самой схемой SSP вне зависимости от загрузки FIFO.

Это как? На сколько тактов задержка?

 

В Документации есть

Так в режиме ведущего устройства для обеспечения максимальной скорости обмена 1.8432 Мбит/с

Видимо, ~2.2МГц низя...

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


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

Это как? На сколько тактов задержка?

Не знаю. Я её зрительно на осциллограммах видел. Мне в принципе она никогда критична не была.

Так на глаз - примерно 0.5...1 клока SCLK насколько помню.

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


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

Не знаю. Я её зрительно на осциллограммах видел. Мне в принципе она никогда критична не была.

Так на глаз - примерно 0.5...1 клока SCLK насколько помню.

По осциллограмме зрительно можно и ошибиться (я, например, не различаю длительности 2 или 3 бита).

Использовал SPI для генерации видео и задержка даже в 0.5 бита была бы видна.

Дык, это на STM32 с его "полутораземлекоповским" буфером, а тут полноценный FIFO.

Вряд ли инженеры настолько плохо все спроектировали, что задержка должна быть принципиально.

 

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


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

Ещё раз повторю - дело не в фифо (естественно он полностью загружен) и не в плохом проектировании (думаю это было сделано специально).

Различить 2 и 3 бита может и сложно, но вот 0.5 и 0 бит - совершенно чётко различаются на глаз.

Но правда я уже давно не работал с LPC17xx, так что может быть путаю их с Tiva (с которыми работал не так давно).

Да, и я говорю не про SPI, а про SSP. Если Вы работали с LPC17xx, то должны понимать разницу.

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


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

пауза из-за CS

посмотрите на картинку SPI там видно.

И в стандартной реализации которую использует milandr (так же NXP, кстати описание можно на роlном сайте ARM найти) эти паузы между словами не убрать.

 

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


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

пауза из-за CS

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

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


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

В Документации есть

Видимо, ~2.2МГц низя...

Очень даже ЗЯ ;) Максимальная это F_CPU / 12 для слейва ~6.7 МГц, но кажется предел для мастера F_CPU / 2, если не ошибаюсь.

Осциллографу я верю - вижу 2.2 МГц.

 

пауза из-за CS, эти паузы между словами не убрать

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

Так бы ПЛИС можно было бы заменить в каких-то применениях, где нужна точность тайминга. Да вообще я бы увешал МК кучей подобных универсальных полезняшек, чтобы заменять ПЛИСы в каких-то случаях.

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


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

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

Если так критично, можно попробовать сделать так:

SSP - в режим слэйва, запрограммировать любой таймер на желаемую SCLK, подать эту SCLK на вход своего SSP и её-же - удалённому устройству, так же сгенерить CS (себе на вход SP и его-же - удалённому устройству), не забыть поменять местами MISO/MOSI. Оба устройства буду работать в режиме слэйва.

Хотя, если на то пошло, то лучше не проектировать так устройство, чтобы оно было чувствительно к непрерывности клока.

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


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

Я понимаю задержку CS перед первым словом, но между - обидно...

Так откуда контроллер знает где первое слово, где последнее...

В данной реализации CS дергается между словами, длина слова в конфигурационном регистре (до 16 бит).

 

Вот у Atmelовских ARM - навороченная реализация... там даже можно несколькими CS аппаратно управлять...

 

 

 

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


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

Вот у Atmelовских ARM - навороченная реализация... там даже можно несколькими CS аппаратно управлять...

У Infineon-а ещё навороченней: кроме нескольких CS, можно произвольно (в тактах) задать длительность паузы в начале передачи (между CS=0 и первым SCLK), в конце и между словами, и длина слова произвольная - от 1-го до 16 бит ;)

У OMAP L-137/L-138 тоже есть управление несколькими CS.

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


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

Вот дошли руки до ДМА и что-то второй день ни в какую не могу заставить это работать. Кое-как из того, что написано в документации (а написано, надо сказать коряво) родил такой код:

static dmaCtrlData_t dmaCtrlData[16] 
__attribute__((aligned(512), section("ahb_lite")));
volatile char tmp1[] = "DMA test string.";
volatile char tmp2[20];

int main(void) {

... инициализация клоков ...

memset(dmaCtrlData, 0x0, sizeof(dmaCtrlData));

// Reset to the initial state.
MDR_DMA->CTRL_BASE_PTR = (uint32_t) dmaCtrlData;
MDR_DMA->CFG = 1U;
MDR_DMA->CHNL_SW_REQUEST = 0U;
MDR_DMA->CHNL_PRI_ALT_CLR = 0xFFFFFFFF;
MDR_DMA->CHNL_PRIORITY_CLR = 0xFFFFFFFF;
MDR_DMA->CHNL_REQ_MASK_SET = 0xFFFFFFFF;
MDR_DMA->CHNL_USEBURST_CLR = 0xFFFFFFFF;
MDR_DMA->CHNL_ENABLE_CLR = 0xFFFFFFFF;
MDR_DMA->ERR_CLR = 1U;

// Configure DMA_CH0
dmaCtrlData[0].dmaSrcEndAddr = (uint32_t) tmp1 + sizeof(tmp1) - 1;
dmaCtrlData[0].dmaDstEndAddr = (uint32_t) tmp2 + sizeof(tmp1) - 1;
dmaCtrlData[0].dmaControl = (0x00 << 30) |  // One byte destination increment;
							(0x00 << 28) |  // Destination transfer unit size;
							(0x00 << 26) |  // One byte source increment;
							(0x00 << 24) |  // Source transfer unit size;
							(0U << 21) |	// dst_prot_ctrl (whatever this is - let it be 0);
							(0U << 18) |	// src_prot_ctrl;
							(15U << 14) |   // Acquire the bus and do not release until the transfer complete;
							((sizeof(tmp1) - 1) << 4) |
											// Transfers count - 1.
							(0U << 3) |	 // next_useburst ??
							(1U << 0);	  // Simple request mode. Auto-request mode does not work either.
MDR_DMA->CHNL_REQ_MASK_CLR = 1U;
MDR_DMA->CHNL_ENABLE_SET = 1U;
MDR_DMA->CHNL_SW_REQUEST = 1U;

... зацикливаемся ...
}

Здесь пытаюсь скопировать строку из tmp1 в tmp2. Собственно для проверки, что все заполнилось правильно:

1. Значения регистров MDR_DMA и dmaCtrlData для 1 канала ДО запуска передачи (MDR_DMA->CHNL_SW_REQUEST = 1U):

{   STATUS = 0x101f0001,
CFG = 0x0,
CTRL_BASE_PTR = 0x20100000,
ALT_CTRL_BASE_PTR = 0x20100200,
WAITONREQ_STATUS = 0x7fffffff,
CHNL_SW_REQUEST = 0x0,
CHNL_USEBURST_SET = 0x0,
CHNL_USEBURST_CLR = 0x0,
CHNL_REQ_MASK_SET = 0xfffffffe,
CHNL_REQ_MASK_CLR = 0xfffffffe,
CHNL_ENABLE_SET = 0x1,
CHNL_ENABLE_CLR = 0x1,
CHNL_PRI_ALT_SET = 0x0,
CHNL_PRI_ALT_CLR = 0x0,
CHNL_PRIORITY_SET = 0x0,
CHNL_PRIORITY_CLR = 0x0,
RESERVED0 = {0x0, 0x0, 0x0},
ERR_CLR = 0x0 }

{   dmaSrcEndAddr = 0x20000614,
dmaDstEndAddr = 0x20005588,
dmaControl = 0x3c101,
dmaUnused = 0x0 }

2. И ПОСЛЕ:

{   STATUS = 0x101f0001,
CFG = 0x0,
CTRL_BASE_PTR = 0x20100000,
ALT_CTRL_BASE_PTR = 0x20100200,
WAITONREQ_STATUS = 0x7fffffff,
CHNL_SW_REQUEST = 0x0,
CHNL_USEBURST_SET = 0x0,
CHNL_USEBURST_CLR = 0x0,
CHNL_REQ_MASK_SET = 0xfffffffe,
CHNL_REQ_MASK_CLR = 0xfffffffe,
CHNL_ENABLE_SET = 0x0,
CHNL_ENABLE_CLR = 0x0,
CHNL_PRI_ALT_SET = 0x0,
CHNL_PRI_ALT_CLR = 0x0,
CHNL_PRIORITY_SET = 0x0,
CHNL_PRIORITY_CLR = 0x0,
RESERVED0 = {0x0, 0x0, 0x0},
ERR_CLR = 0x0 }

{   dmaSrcEndAddr = 0x20000614,
dmaDstEndAddr = 0x20005588,
dmaControl = 0x3c000,
dmaUnused = 0x0 }

И казалось бы ДМА отработал (dmaControl перешел в режим "Стоп" и счетчик обнулился, а также сбросился Enable на первом канале)... но фиг там, содержимое tmp2 - как были нули так и остались. Для проверки - адреса:

(volatile char (*)[17]) 0x20000604 <tmp1>
(volatile char (*)[20]) 0x20005578 <tmp2>
(dmaCtrlData_t (*)[16]) 0x20100000 <dmaCtrlData>

Что я забыл/не учел?

 

:bb-offtopic: Из так называемого даташита - не смог понять что за передачи с кэшированием/буферизацией и как это использовать. Аналогично - не понятно в чем разница между режимами "Основной" и "Авто-запрос".

Изменено пользователем IgorKossak
[codebox] для длинного кода, [code] - для короткого!

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


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

Там на форуме есть ссылки на SPL с готовыми примерами.

Потом появился pack для Keil - Milandr.MDR1986BExx.1.4.2.pack, там тоже примеры есть.

Еще на форуме выкладывали, как я понял, тестовые программы без SPL, называются так Examples_for_1986VE1_31_01_2012.rar или так 1986VE1T_demoprogramms___part1.rar

 

Правда у меня DMA в режиме ping-pong так и не заработал и я плюнул на него.

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

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


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

Там на форуме есть ссылки на SPL с готовыми примерами.

Потом появился pack для Keil - Milandr.MDR1986BExx.1.4.2.pack, там тоже примеры есть.

Еще на форуме выкладывали, как я понял, тестовые программы без SPL, называются так Examples_for_1986VE1_31_01_2012.rar или так 1986VE1T_demoprogramms___part1.rar

 

Правда у меня DMA в режиме ping-pong так и не заработал и я плюнул на него.

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

Да, нашел эти примеры. Там ДМА работает с УАРТом, но не суть. Проблема в том, что написано РОВНО то же самое, что и у меня... прямо строка в строку. Я сейчас даже порядок инициализации такой же как там сделал.

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


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

Да, нашел эти примеры. Там ДМА работает с УАРТом, но не суть. Проблема в том, что написано РОВНО то же самое, что и у меня... прямо строка в строку. Я сейчас даже порядок инициализации такой же как там сделал.

Также пробовал примеры с ДМА использовать, но не заработало. Так как не очень критично было - копать не стал.

Там вообще похоже документацию студенты писали - где-то прямой перевод документации ARM, где-то собственное творчество и в общем оно между собой не всегда стыкуется :(

Например про Ethernet написано что прерывания есть, а по факту, в чипе они не подключены к NVIC, про прерывания написано что бывают по уровню и по фронту, но по факту все прерывания NVIC работают по уровню, а если надо по фронту - то используйте таймер и его прерывание, и т.д. и т.п

.

У них работает саппорт, и даже отвечает на технические вопросы. Поэтому засылайте им запрос с исходником и обязательно приложите реквизиты своей фирмы.

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


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

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

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

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

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

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

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

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

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

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