|
|
  |
Миландр 1986ВЕ1Т |
|
|
|
Mar 26 2017, 21:09
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(jcxz @ Mar 26 2017, 12:34)  Пауза между словами вносится самой схемой SSP вне зависимости от загрузки FIFO. Это как? На сколько тактов задержка? В Документации есть Цитата Так в режиме ведущего устройства для обеспечения максимальной скорости обмена 1.8432 Мбит/с Видимо, ~2.2МГц низя...
|
|
|
|
|
Mar 27 2017, 07:43
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(jcxz @ Mar 27 2017, 00:27)  Не знаю. Я её зрительно на осциллограммах видел. Мне в принципе она никогда критична не была. Так на глаз - примерно 0.5...1 клока SCLK насколько помню. По осциллограмме зрительно можно и ошибиться (я, например, не различаю длительности 2 или 3 бита). Использовал SPI для генерации видео и задержка даже в 0.5 бита была бы видна. Дык, это на STM32 с его "полутораземлекоповским" буфером, а тут полноценный FIFO. Вряд ли инженеры настолько плохо все спроектировали, что задержка должна быть принципиально.
|
|
|
|
|
Mar 27 2017, 13:12
|

фанат Linux'а
    
Группа: Свой
Сообщений: 1 353
Регистрация: 23-10-05
Из: SPB.RU
Пользователь №: 10 008

|
Цитата(adnega @ Mar 27 2017, 00:09)  В Документации есть Видимо, ~2.2МГц низя... Очень даже ЗЯ  Максимальная это F_CPU / 12 для слейва ~6.7 МГц, но кажется предел для мастера F_CPU / 2, если не ошибаюсь. Осциллографу я верю - вижу 2.2 МГц. Цитата пауза из-за CS, эти паузы между словами не убрать Я понимаю задержку CS перед первым словом, но между - обидно... Я обойду это тем, что подмухлюю ноль на эту паузу, так подгадаю делители. Но вот есть ли там другая периферия без этого недостатка? Так бы ПЛИС можно было бы заменить в каких-то применениях, где нужна точность тайминга. Да вообще я бы увешал МК кучей подобных универсальных полезняшек, чтобы заменять ПЛИСы в каких-то случаях.
--------------------
|
|
|
|
|
Mar 27 2017, 19:48
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(AVR @ Mar 27 2017, 15:12)  Я понимаю задержку CS перед первым словом, но между - обидно... Я обойду это тем, что подмухлюю ноль на эту паузу, так подгадаю делители. Но вот есть ли там другая периферия без этого недостатка? Если так критично, можно попробовать сделать так: SSP - в режим слэйва, запрограммировать любой таймер на желаемую SCLK, подать эту SCLK на вход своего SSP и её-же - удалённому устройству, так же сгенерить CS (себе на вход SP и его-же - удалённому устройству), не забыть поменять местами MISO/MOSI. Оба устройства буду работать в режиме слэйва. Хотя, если на то пошло, то лучше не проектировать так устройство, чтобы оно было чувствительно к непрерывности клока.
|
|
|
|
|
Apr 6 2017, 09:42
|
Группа: Участник
Сообщений: 7
Регистрация: 23-03-17
Пользователь №: 95 986

|
Вот дошли руки до ДМА и что-то второй день ни в какую не могу заставить это работать. Кое-как из того, что написано в документации (а написано, надо сказать коряво) родил такой код: CODE 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): CODE { 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. И ПОСЛЕ: CODE { 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> Что я забыл/не учел?  Из так называемого даташита - не смог понять что за передачи с кэшированием/буферизацией и как это использовать. Аналогично - не понятно в чем разница между режимами "Основной" и "Авто-запрос".
Сообщение отредактировал IgorKossak - Apr 6 2017, 17:58
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!
|
|
|
|
|
Apr 6 2017, 10:50
|
Группа: Участник
Сообщений: 7
Регистрация: 23-03-17
Пользователь №: 95 986

|
Цитата(HardEgor @ Apr 6 2017, 12:56)  Там на форуме есть ссылки на SPL с готовыми примерами. Потом появился pack для Keil - Milandr.MDR1986BExx.1.4.2.pack, там тоже примеры есть. Еще на форуме выкладывали, как я понял, тестовые программы без SPL, называются так Examples_for_1986VE1_31_01_2012.rar или так 1986VE1T_demoprogramms___part1.rar
Правда у меня DMA в режиме ping-pong так и не заработал и я плюнул на него. Если что, могу ссылочкой на свой архив с упомянутыми файлами поделиться. Да, нашел эти примеры. Там ДМА работает с УАРТом, но не суть. Проблема в том, что написано РОВНО то же самое, что и у меня... прямо строка в строку. Я сейчас даже порядок инициализации такой же как там сделал.
|
|
|
|
|
Apr 6 2017, 11:25
|
Гуру
     
Группа: Свой
Сообщений: 2 223
Регистрация: 3-03-06
Из: Tomsk
Пользователь №: 14 925

|
Цитата(Captain @ Apr 6 2017, 17:50)  Да, нашел эти примеры. Там ДМА работает с УАРТом, но не суть. Проблема в том, что написано РОВНО то же самое, что и у меня... прямо строка в строку. Я сейчас даже порядок инициализации такой же как там сделал. Также пробовал примеры с ДМА использовать, но не заработало. Так как не очень критично было - копать не стал. Там вообще похоже документацию студенты писали - где-то прямой перевод документации ARM, где-то собственное творчество и в общем оно между собой не всегда стыкуется  Например про Ethernet написано что прерывания есть, а по факту, в чипе они не подключены к NVIC, про прерывания написано что бывают по уровню и по фронту, но по факту все прерывания NVIC работают по уровню, а если надо по фронту - то используйте таймер и его прерывание, и т.д. и т.п . У них работает саппорт, и даже отвечает на технические вопросы. Поэтому засылайте им запрос с исходником и обязательно приложите реквизиты своей фирмы.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|