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

Дмитрий239

Members
  • Постов

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

  • Посещение

Информация о Дмитрий239

  • День рождения 23.09.2003

Информация

  • Пол
    Мужчина
  • Город
    Таганрог

Электроника

  • Стаж в электронике
    Не связан с электроникой
  • Сфера радиоэлектроники
    -
  • Оборудование
    Мультиметр за 300 рублей, паяльник с диммером

Достижения Дмитрий239

Новичок

Новичок (1/14)

  • 10 постов на форуме
  • Неделя на форуме
  • Месяц на форуме
  • Год на форуме

Последние значки

0

Репутация

  1. Ё-моё Меня, конечно, смущало полное отключение SPI, но я попытался. Оказалось всё куда проще - отключать надо разрешение DMA на использование устройства То есть SPI2->CR2 &= ~SPI_CR2_TXDMAEN; DMA1_Stream4->NDTR = WIDTH * HEIGHT * 2; DMA1_Stream4->CR |= DMA_SxCR_EN; SPI2->CR2 |= SPI_CR2_TXDMAEN;
  2. void ST7735s::startScreenUpdate() { stopScreenUpdate(); sendCommand(ST77XX_RAMWR); CS_Down(); DC_Up(); SPI2->CR1 &= ~SPI_CR1_SPE; DMA1->HIFCR = DMA_HIFCR_CFEIF4 | DMA_HIFCR_CHTIF4 | DMA_HIFCR_CTCIF4 | DMA_HIFCR_CTEIF4 | DMA_HIFCR_CDMEIF4; DMA1_Stream4->NDTR = WIDTH * HEIGHT * 2; DMA1_Stream4->CR |= DMA_SxCR_EN; __NOP(); /* NDTR = 25'599 // (-1) FS[2:0] = 0b011 // 3/4 FEIF4 = 1 // error */ SPI2->CR1 |= SPI_CR1_SPE; } Модифицировал функцию: теперь перед запуском отключаю SPI включаю DMA включаю SPI Но в отладчике видно, что после включения DMA всё равно устанавливается флаг ошибки. Передача работает. Также пробовал: MSIZE[1:0] = 0b10 (32 bit) MBURST[1:0] = 0b01 (incremental burst of 4 beats) - так же ошибка.
  3. Добрый день! Пытаюсь наладить передачу по SPI данных к дисплею с DMA. Передача работает, дисплей полностью закрашивается, но устанавливается флаг ошибки FIFO в регистрах DMA. МК: STM32F401CEU6 Инициализация //Где-то там alignas(32) uint16_t buff[80 * 160]; // SPI init SPI2->CR1 |= (0b000 << SPI_CR1_BR_Pos) | SPI_CR1_MSTR | SPI_CR1_SSI | SPI_CR1_SSM; SPI2->CR2 |= SPI_CR2_TXDMAEN; SPI2->CR1 |= SPI_CR1_SPE; // DMA init DMA1_Stream4->CR |= (0b01 << DMA_SxCR_DIR_Pos) | (0 << DMA_SxCR_CHSEL_Pos) | (0b11 << DMA_SxCR_MBURST_Pos) | DMA_SxCR_MINC; DMA1_Stream4->PAR = (uint32_t)&SPI2->DR; DMA1_Stream4->M0AR = (uint32_t)getBuffer(); DMA1_Stream4->FCR &= ~DMA_SxFCR_FTH; DMA1_Stream4->FCR |= DMA_SxFCR_DMDIS; __DMB(); DMA1_Stream4->FCR |= (0b11 << DMA_SxFCR_FTH_Pos); Функции отправки void ST7735s::stopScreenUpdate() { DMA1_Stream4->CR &= ~DMA_SxCR_EN; while (DMA2_Stream4->CR & DMA_SxCR_EN) ; CS_Up(); } void ST7735s::startScreenUpdate() { stopScreenUpdate(); sendCommand(ST77XX_RAMWR); CS_Down(); DC_Up(); DMA1->HIFCR = DMA_HIFCR_CFEIF4 | DMA_HIFCR_CHTIF4 | DMA_HIFCR_CTCIF4 | DMA_HIFCR_CTEIF4 | DMA_HIFCR_CDMEIF4; DMA1_Stream4->NDTR = WIDTH * HEIGHT * 2; DMA1_Stream4->CR |= DMA_SxCR_EN; } После передачи устанавливается флаг ошибки работы FIFO-буфера в DMA. Флаг приходится сбрасывать вручную + ненормально это как-то. Ошибка, как-никак. Выдержка из документации 80 пикселей * 160 пикселей * 2 байта = 25 600 байт. Итого, если я правильно понял логику, при размере пакета в 16 кусков, при размере куска = MSIZE = 1 байту, должно всё работать, т.к. конфигурации допустима + 25 600 байт ровно делиться на транзакции по 16 байт. Пробовал менять NDTR - делил на 16, но это не помогло, т.к. надо указать именно количество передаваемых байт. С делением на 16 заполняется лишь 1/16 часть дисплея. Перезаписи (ovverun) тоже нет - все пиксели занимают свои места Ошибок SPI нет Выравнивание сделал с запасом. Пробовал ранее 4 - без результата (Точнее результат - ошибка).
  4. Создал секцию: SECTIONS { .rodata : { . = ALIGN(16); _start_cmdList = .; *(.cmdList) KEEP(*(.cmdList)) _stop_cmdList = .; } } объявил структуру и указатель на начало: typedef struct { const char *cmdName; const void (*const commandVoid)(uint8_t, char *[], char[]); } CommandHandler; extern const CommandHandler _start_cmdList[]; для теста занёс одну функцию: const void kek(uint8_t argc, char *argv[], char answ[]) { strcpy_P(answ, PSTR("wow")); } static PROGMEM const char __attribute__((__used__)) kekAlias[] = "lol"; const CommandHandler __attribute__((section(".cmdList"))) __attribute__((__used__)) CMDHandler_kek = {.cmdName = kekAlias, .commandVoid = kek}; и проверяю: const CommandHandler *in = &_start_cmdList[0]; const CommandHandler *out = &CMDHandler_kek; if (in == out) uart.println(F("ok")); uart.println((unsigned int)(in), HEX); uart.println((unsigned int)(out), HEX); uart.println((unsigned int)out->cmdName); uart.println((unsigned int)out->commandVoid); uart.println((unsigned int)in->cmdName); uart.println((unsigned int)in->commandVoid); Выводит: 1560 1560 124 801 12800 0 МК атмега168. Platform IO Avr gcc 11 Линкер скрипт стандартный, с добавкой сверху Вопрос: как получить первый элемент массива в секции?
  5. Спаял - не работает. Вот и решил спросить что не так. В холостую напряжение в норме, но модем работает нестабильно.
  6. Спасибо за схемы, но всё хотел узнать правильность расчёта R3. Проверить знание той теории что у мня имеется.
  7. Здравствуйте! Я бы хотел узнать, будет ли работоспособна данная схема. Вторым вопросом является расчет резистора R3. (5-VBEкт816(1,3)-VCEs8050(0,5))÷0,2(ток для открытия кт816) Верны ли расчёты выше? Цель: питание модема от 5 Вольт. Модем питается от 4 Вольт.
  8. Спасибо большое, Геннадий. К сожалению, я "не в теме", но вы случаем не может объяснить алгоритм или дать ссылку на книгу или документ?
  9. Здравствуйте. Я бы хотел узнать как измеряется данным методом (а.с.) внутреннее сопротивление аккумулятора. Знаю про синус с размахом в 10мВ, про замер тока по первой паре проводов и напряжения по второй. Но при размахе в 5мВ с 8мОм'и выходит ток ~600мА, так и должно быть? А как же напряжение самого аккумулятора? В общем, хотелось узнать схему и алгоритм, т.к. Гугл мне не помог. Спасибо за внимание.
×
×
  • Создать...