jcxz 184 26 марта, 2017 Опубликовано 26 марта, 2017 · Жалоба Спасибо за информацию, а то я бился головой в стену. Если задержка фиксированная, то я смогу подгадать, чтобы ноль приходился на эту паузу... Ну я это говорю про LPC17... Но если говорят что там всё так же.... Нетрудно самому проверить и убедиться: запретить прерывания, загрузить FIFO полностью и посмотреть осциллограмму. Сделать это лучше на малой частоте SCLK. И повторить в разных режимах. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 10 26 марта, 2017 Опубликовано 26 марта, 2017 · Жалоба Пауза между словами вносится самой схемой SSP вне зависимости от загрузки FIFO. Это как? На сколько тактов задержка? В Документации есть Так в режиме ведущего устройства для обеспечения максимальной скорости обмена 1.8432 Мбит/с Видимо, ~2.2МГц низя... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 26 марта, 2017 Опубликовано 26 марта, 2017 · Жалоба Это как? На сколько тактов задержка? Не знаю. Я её зрительно на осциллограммах видел. Мне в принципе она никогда критична не была. Так на глаз - примерно 0.5...1 клока SCLK насколько помню. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 10 27 марта, 2017 Опубликовано 27 марта, 2017 · Жалоба Не знаю. Я её зрительно на осциллограммах видел. Мне в принципе она никогда критична не была. Так на глаз - примерно 0.5...1 клока SCLK насколько помню. По осциллограмме зрительно можно и ошибиться (я, например, не различаю длительности 2 или 3 бита). Использовал SPI для генерации видео и задержка даже в 0.5 бита была бы видна. Дык, это на STM32 с его "полутораземлекоповским" буфером, а тут полноценный FIFO. Вряд ли инженеры настолько плохо все спроектировали, что задержка должна быть принципиально. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 27 марта, 2017 Опубликовано 27 марта, 2017 · Жалоба Ещё раз повторю - дело не в фифо (естественно он полностью загружен) и не в плохом проектировании (думаю это было сделано специально). Различить 2 и 3 бита может и сложно, но вот 0.5 и 0 бит - совершенно чётко различаются на глаз. Но правда я уже давно не работал с LPC17xx, так что может быть путаю их с Tiva (с которыми работал не так давно). Да, и я говорю не про SPI, а про SSP. Если Вы работали с LPC17xx, то должны понимать разницу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KRS 0 27 марта, 2017 Опубликовано 27 марта, 2017 · Жалоба пауза из-за CS посмотрите на картинку SPI там видно. И в стандартной реализации которую использует milandr (так же NXP, кстати описание можно на роlном сайте ARM найти) эти паузы между словами не убрать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 27 марта, 2017 Опубликовано 27 марта, 2017 · Жалоба пауза из-за CS Вот и у меня сложилось впечатление, что быстрей всего по этой причине. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
1891ВМ12Я 0 27 марта, 2017 Опубликовано 27 марта, 2017 · Жалоба В Документации есть Видимо, ~2.2МГц низя... Очень даже ЗЯ ;) Максимальная это F_CPU / 12 для слейва ~6.7 МГц, но кажется предел для мастера F_CPU / 2, если не ошибаюсь. Осциллографу я верю - вижу 2.2 МГц. пауза из-за CS, эти паузы между словами не убрать Я понимаю задержку CS перед первым словом, но между - обидно... Я обойду это тем, что подмухлюю ноль на эту паузу, так подгадаю делители. Но вот есть ли там другая периферия без этого недостатка? Так бы ПЛИС можно было бы заменить в каких-то применениях, где нужна точность тайминга. Да вообще я бы увешал МК кучей подобных универсальных полезняшек, чтобы заменять ПЛИСы в каких-то случаях. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 27 марта, 2017 Опубликовано 27 марта, 2017 · Жалоба Я понимаю задержку CS перед первым словом, но между - обидно... Я обойду это тем, что подмухлюю ноль на эту паузу, так подгадаю делители. Но вот есть ли там другая периферия без этого недостатка? Если так критично, можно попробовать сделать так: SSP - в режим слэйва, запрограммировать любой таймер на желаемую SCLK, подать эту SCLK на вход своего SSP и её-же - удалённому устройству, так же сгенерить CS (себе на вход SP и его-же - удалённому устройству), не забыть поменять местами MISO/MOSI. Оба устройства буду работать в режиме слэйва. Хотя, если на то пошло, то лучше не проектировать так устройство, чтобы оно было чувствительно к непрерывности клока. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KRS 0 28 марта, 2017 Опубликовано 28 марта, 2017 · Жалоба Я понимаю задержку CS перед первым словом, но между - обидно... Так откуда контроллер знает где первое слово, где последнее... В данной реализации CS дергается между словами, длина слова в конфигурационном регистре (до 16 бит). Вот у Atmelовских ARM - навороченная реализация... там даже можно несколькими CS аппаратно управлять... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 28 марта, 2017 Опубликовано 28 марта, 2017 · Жалоба Вот у Atmelовских ARM - навороченная реализация... там даже можно несколькими CS аппаратно управлять... У Infineon-а ещё навороченней: кроме нескольких CS, можно произвольно (в тактах) задать длительность паузы в начале передачи (между CS=0 и первым SCLK), в конце и между словами, и длина слова произвольная - от 1-го до 16 бит ;) У OMAP L-137/L-138 тоже есть управление несколькими CS. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Captain 0 6 апреля, 2017 Опубликовано 6 апреля, 2017 (изменено) · Жалоба Вот дошли руки до ДМА и что-то второй день ни в какую не могу заставить это работать. Кое-как из того, что написано в документации (а написано, надо сказать коряво) родил такой код: 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: Из так называемого даташита - не смог понять что за передачи с кэшированием/буферизацией и как это использовать. Аналогично - не понятно в чем разница между режимами "Основной" и "Авто-запрос". Изменено 6 апреля, 2017 пользователем IgorKossak [codebox] для длинного кода, [code] - для короткого! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HardEgor 63 6 апреля, 2017 Опубликовано 6 апреля, 2017 · Жалоба Там на форуме есть ссылки на SPL с готовыми примерами. Потом появился pack для Keil - Milandr.MDR1986BExx.1.4.2.pack, там тоже примеры есть. Еще на форуме выкладывали, как я понял, тестовые программы без SPL, называются так Examples_for_1986VE1_31_01_2012.rar или так 1986VE1T_demoprogramms___part1.rar Правда у меня DMA в режиме ping-pong так и не заработал и я плюнул на него. Если что, могу ссылочкой на свой архив с упомянутыми файлами поделиться. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Captain 0 6 апреля, 2017 Опубликовано 6 апреля, 2017 · Жалоба Там на форуме есть ссылки на SPL с готовыми примерами. Потом появился pack для Keil - Milandr.MDR1986BExx.1.4.2.pack, там тоже примеры есть. Еще на форуме выкладывали, как я понял, тестовые программы без SPL, называются так Examples_for_1986VE1_31_01_2012.rar или так 1986VE1T_demoprogramms___part1.rar Правда у меня DMA в режиме ping-pong так и не заработал и я плюнул на него. Если что, могу ссылочкой на свой архив с упомянутыми файлами поделиться. Да, нашел эти примеры. Там ДМА работает с УАРТом, но не суть. Проблема в том, что написано РОВНО то же самое, что и у меня... прямо строка в строку. Я сейчас даже порядок инициализации такой же как там сделал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HardEgor 63 6 апреля, 2017 Опубликовано 6 апреля, 2017 · Жалоба Да, нашел эти примеры. Там ДМА работает с УАРТом, но не суть. Проблема в том, что написано РОВНО то же самое, что и у меня... прямо строка в строку. Я сейчас даже порядок инициализации такой же как там сделал. Также пробовал примеры с ДМА использовать, но не заработало. Так как не очень критично было - копать не стал. Там вообще похоже документацию студенты писали - где-то прямой перевод документации ARM, где-то собственное творчество и в общем оно между собой не всегда стыкуется :( Например про Ethernet написано что прерывания есть, а по факту, в чипе они не подключены к NVIC, про прерывания написано что бывают по уровню и по фронту, но по факту все прерывания NVIC работают по уровню, а если надо по фронту - то используйте таймер и его прерывание, и т.д. и т.п . У них работает саппорт, и даже отвечает на технические вопросы. Поэтому засылайте им запрос с исходником и обязательно приложите реквизиты своей фирмы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться