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

athlon64

Свой
  • Постов

    157
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Информация о athlon64

  • Звание
    Частый гость
    Частый гость
  • День рождения 19.03.1987

Контакты

  • Сайт
    Array
  • ICQ
    Array

Информация

  • Город
    Array

Посетители профиля

2 029 просмотров профиля
  1. STM32F746 FMC + LCD

    Оказалось, что первое обращение по указателю 0x64000000 отрабатывалось, а последующие пропускались. Причина во включенном кэшировании записи в Cortex-M7 для адресного пространства 0x60000000 - 0x7FFFFFFF. Решение - включить ремап на адресное пространство 0xC0000000-0xDFFFFFFF, где кэширование записи отключено HAL_EnableFMCMemorySwapping();
  2. STM32F746 FMC + LCD

    Коллеги, добрый день Использую STM32F746G (на плате StarterKit SK-STM32F746). Пытаюсь подключить используя FMC небольшой дисплей с параллельным интерфейсом, но перед подключением решил проверить логическим анализатором правильность выдачи сигналов на линии D0-D15, WR, RS, CS. Оказалось, что при записи по адресу в соответствующем банке памяти данные на D0-D15 не выставляются, WR, CS (в моем случае NE2) также не изменяют свои состояния. При обращении к памяти использую указатель 0x64000000 (1 банк, 2 подбанк). Все используемые ноги FMC инициализированы, скорость GPIO_SPEED_FREQ_VERY_HIGH. При этом если инициализировать SDRAM (которая уже есть на плате), то при обращении к адресному пространству SDRAM на шине данных сигналы появляются и SDRAM работает хорошо. Вроде всё просто, не понимаю что я мог упустить. Прошу вашей помощи
  3. Добрый день Возможно кто-нибудь сталкивался с коммерческими САПР для проектирования печатных плат, доступ к которым можно было бы арендовать на время? Скажем на 6 или 12 месяцев. Было бы интересно оценить целесообразность покупки такой аренды для не сильно большого проекта.
  4. Что именно не похоже? При частоте 100 КГц частоты атмеги в 1 МГц уже недостаточно, не говоря уже о 400 КГц
  5. После поднятия частоты атмеги всё заработало! Рекомендацию эту нашёл в документе "AVR311: Using the TWI module as I2C slave" - частота работы avr должна быть хотя бы в 16 раз выше частоты работы twi.
  6. В общем в итоге имею вот что. После включения питания магнитолы (и атмеги) сразу попадаю в обработчик TWI с TWSR=0x00, переинициализирую TWI. Больше в обработчик не попадаю. Тем временем шина в магнитоле работает, TDA7563 включается. Напоминаю, что атмега и TDA7563 сидят на одной шине с одинаковыми i2c-slave адресами. Возможно с этим связана проблема, хотя, с моей точки зрения, так делать можно и если выдавать мастеру в данных только байты = 0xFF, то всё должно работать. Или я не прав? Ещё завтра попробую поднять частоту атмеги до 8МГц, сейчас 1МГц
  7. Спасибо за совет, это я попробовал сразу же :) тоже накалывался, и не раз но в даташите на атмегу и TDA всё однозначно написано, нужно именно TWAR = 0x6C << 1;
  8. В общем выяснилось, что была ошибка в обработчике прерывания от TWI, неправильно разбирался регистр TWSR, из-за чего автомат TWI оказывался в непонятном состоянии. Для магнитолы это выглядело как 0 на SDA и включаться она отказывалась. Теперь другая проблема - атмега не фиксирует обращений по i2c-адресу TDA7563 (0x6C). Пока разбираюсь.. На случай если кому то будет интересно глянуть: Инициализация TWI: void Init_Twi(void) { __disable_interrupt(); TWAR = 0x6C << 1; TWCR |= (1 << TWEN) | (1 << TWIE) | (1 << TWEA); __enable_interrupt(); } Обработчик: #pragma vector=TWI_vect __interrupt void TWI_ISR() { LED_Flash(5); switch (TWSR & 0xF8) { //=== Передача данных case 0xa8: // Принят свой адрес, будет выдача Data. case 0xb8: // Выдан байт Data, получен ACK. case 0xc0: // Выдан байт Data, получен NACK. TWDR = 0xFF; break; //=== Прием данных case 0x60: // Принят свой адрес, будет прием Data. TWI_Buff_Idx = 0; break; case 0x80: // Принят байт Data, выдан ACK. case 0x88: // Принят байт Data, выдан NACK. Tst[TWI_Buff_Idx] = TWDR; TWI_Buff_Idx++; break; case 0xa0: // При приеме в своем адресе был принят STOP или RESTART. CheckTWIbuff(); break; default: break; } TWCR |= (1 << TWINT); // Сброс флага прерывания. }
  9. Приветствую всех Делаю устройство на atmega8, которое подключается к шине i2c автомагнитолы и являясь i2c-слейвом, перехватывает команды включения/выключения встроенного усилителя на TDA7563. i2c в магнитоле 3,3-вольтовая. Так вот, атмегу запрограммировал, она исправна, тактируется от внутреннего генератора 1МГц. Использую аппаратный TWI, i2c адрес установил как у TDA, но столкнулся в внезапной проблемой. Подключаю свою плату к SDA, SCL и GND магнитолы и шина магнитолы перестаёт работать, т.к. уровень на SDA, SCL держится в районе нуля. Сама атмега не запитана (пробовал и запитывать), т.е. VCC в воздухе. При отключении GND магнитолы от атмеги, работа шины восстанавливается, а на GND атмеги напряжение ~3В. Плата атмеги простейшая, стабилизатора нет (планирую питаться от 3,3В магнитолы, есть только 2 отладочных LED и всё. КЗ между SDA, SCL и GND атмеги нет.
  10. Корпус/шасси 2U

    Излазил каталог Schroff и ещё нескольких производителей, не могу найти каркас который изображен на фото. В принципе сильно похож на euroPac PRO, но у europac высота бывает только 3 или 6 юнитов. Те модели, которые предлагаются в 2U, как правило не имеют рейку с отверстиями ближе к передней панели (нужно для крепления внутрь модулей). Также обычно на боковых стенках отсутствует направляющая для удобного монтажа/демонтажа в стойку.
  11. Видимо пропуск прерывания происходит из-за того, что при обработке прерывания от одного таймера между строками uint32_t timer_status = *pTIMER_STATUS; и *pTIMER_STATUS = 0x00FF00FF; устанавливается флаг TIMIL другого таймера и, соответственно, сразу сбрасывается без обработки. Хотя, казалось бы, вероятность такого события чрезвычайно мала) Переписал обработчик следующим образом #define TIMER_STATUS_FLAGS_MASK_T0 0x00000001 #define TIMER_STATUS_FLAGS_MASK_T1 0x00000002 #define TIMER_STATUS_FLAGS_MASK_T2 0x00000004 #define TIMER_STATUS_FLAGS_MASK_T3 0x00000008 #define TIMER_STATUS_FLAGS_MASK_T4 0x00010000 #define TIMER_STATUS_FLAGS_MASK_T5 0x00020000 #define TIMER_STATUS_FLAGS_MASK_T6 0x00040000 #define TIMER_STATUS_FLAGS_MASK_T7 0x00080000 ISR(ivg13_isr) { ssync(); if (*pTIMER_STATUS & TIMIL0) { *pTIMER_STATUS = TIMER_STATUS_FLAGS_MASK_T0; ssync(); } if (*pTIMER_STATUS & TIMIL1) { *pTIMER_STATUS = TIMER_STATUS_FLAGS_MASK_T1; ssync(); } if (*pTIMER_STATUS & TIMIL2) { *pTIMER_STATUS = TIMER_STATUS_FLAGS_MASK_T2; ssync(); } if (*pTIMER_STATUS & TIMIL3) { *pTIMER_STATUS = TIMER_STATUS_FLAGS_MASK_T3; ssync(); } if (*pTIMER_STATUS & TIMIL4) { *pTIMER_STATUS = TIMER_STATUS_FLAGS_MASK_T4; ssync(); } if (*pTIMER_STATUS & TIMIL5) { *pTIMER_STATUS = TIMER_STATUS_FLAGS_MASK_T5; ssync(); } if (*pTIMER_STATUS & TIMIL6) { *pTIMER_STATUS = TIMER_STATUS_FLAGS_MASK_T6; ssync(); } if (*pTIMER_STATUS & TIMIL7) { *pTIMER_STATUS = TIMER_STATUS_FLAGS_MASK_T7; ssync(); } }
  12. Добрый день У меня в проекте на BlackFin BF523 используются 3 таймера общего назначения с генерацией прерывания по достижению значения из TIMERx_PERIOD. Случайно обнаружил что периодически происходит пропуск обработки интервала счёта. Пересмотрел ещё раз даташит на тему таймеров и не нашёл у себя ничего криминального. Функции настройки таймера: uint32_t Timer_Get_SICmask(uint8_t TimerNum) { uint32_t SIC_IAR_Mask = 0xFFFFFFFF; SIC_IAR_Mask &= ~(0xF << (TimerNum << 2)); return SIC_IAR_Mask; } int8_t Timer7_Start(uint32_t FreqHz) { if (!FreqHz) return -1; // Выключаем таймер *pTIMER_DISABLE = TIMDIS7; // Настраиваем таймер *pTIMER7_CONFIG = OUT_DIS | PWM_OUT | PERIOD_CNT | IRQ_ENA; // Выход ШИМ отключен, режим PWM_OUT, счёт до периода, прерывание включено, сброс таймера в 1 (не в 0) // Ширина испульса ШИМ (в данном случае не важно) *pTIMER7_WIDTH = 1; // Период счёта таймера до обнуления с формированием запроса на прерывание *pTIMER7_PERIOD = (TMR_SCLK / FreqHz);// - 1; // Приоритет *pSIC_IAR4 = (*pSIC_IAR4 & Timer_Get_SICmask(7)) | P39_IVG(12); // Присваиваем вектор прерывания для IVG 14 REGISTER_ISR(12, ivg12_isr); // Включаем у SIC вход от периферии *pSIC_IMASK1 |= IRQ_TIMER7; // Обнуляем регистр-счётчик *pTIMER7_COUNTER = 0; // Запускаем таймер *pTIMER_ENABLE = TIMEN7; return 0; } Обработчик прерываний, общий для всех таймеров: ISR(ivg12_isr) { ssync(); uint32_t timer_status = *pTIMER_STATUS; // Снимаем флаги TIMILx и TOVF_ERRx с помощью W1C *pTIMER_STATUS = 0x00FF00FF; if (timer_status & TIMIL0) { } if (timer_status & TIMIL1) { } if (timer_status & TIMIL2) { } if (timer_status & TIMIL3) { } if (timer_status & TIMIL4) { } if (timer_status & TIMIL5) { } if (timer_status & TIMIL6) { } if (timer_status & TIMIL7) { } }
  13. Вы в правильном направлении движетесь. Любой переворот делается регистрами ILI (Бит AM и биты I/D регистра Entry Mode). Также посмотрите низкоуровневые процедуры работы с экраном (очистка экрана, закрашивание прямоугольника, вывод символа), в одном из китайских проектов видел зеркалирование на уровне этих процедур.
  14. Всё, что вы описали, взаимосвязано и причина ему - косяк в sys_arch.c. Решение я приводил здесь.
  15. У этого примера от ST несколько проблем, по которым есть информация в форуме. В вашем случае скорее всего теряются пакеты из-за косяков в порте Lwip для FreeRTOS.
×
×
  • Создать...