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

Reystlin

Участник
  • Постов

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

  • Посещение

Репутация

0 Обычный

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

  • Звание
    Частый гость
    Частый гость

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

2 016 просмотров профиля
  1. STM32f103 Custom HID USB -> HIDAPI

    Доброго времени суток пытаюсь понять как работать с Custom HID на основе статьи https://microtechnics.ru/stm32cube-usb-custom-hid-sozdanie-deskriptorov-ustrojstva/?ysclid=lcfzgdcyrl345227162 в контроллере сделал вот так Проблемы с тем на базе какой библиотеки на компе код удобней делать. в исходной статье применяли libusb но почему-то не смог найти той версии, по которой делали статью. по другим статьям тоже ничего не вышло Смотрел WinUSB там вообще не понятно как этим пользоваться взял HIDAPI на ней по примерам получилось увидеть мою плату но не получается отправить и получить данные Кто какие библиотеки использует? Может у кого есть рабочий пример для стороны контроллера и компа?
  2. stm32f4 spi dma cmsis

    Организовал в итоге работу SPI через DMA вот таким образом #include "SPI3.h" uint8_t SPI3_buff[1024]; uint8_t Empty_Flag = 1; int rxCounter = 0; void SPI3_Init(void) { //DMA1 Stream 5 SPI3_TX channel 0 RCC->AHB1ENR |= RCC_AHB1ENR_DMA1EN; RCC->APB1ENR |= RCC_APB1ENR_SPI3EN; RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN | RCC_AHB1ENR_GPIOCEN; // GPIO GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.Speed = GPIO_SPEED_FAST; GPIO_InitStruct.Alternate = GPIO_AF6_SPI3; // PA10 - SS - Выход GPIOA->MODER |= GPIO_MODER_MODE10_0; // PC10 - SCK - Выход GPIO_InitStruct.Pin = GPIO_PIN_10; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); // PC11 - MISO - Вход GPIO_InitStruct.Pin = GPIO_PIN_11; GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); // PC12 - MOSI - Выход GPIO_InitStruct.Pin = GPIO_PIN_12; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); SPI3->CR2 = SPI_CR2_RXDMAEN| // Получение через DMA SPI_CR2_TXDMAEN; // Отправка через DMA SPI3->CR1 = 0 << SPI_CR1_DFF_Pos // Размер кадра 8 бит | 1<<SPI_CR1_SSM_Pos // Программное управление SS | 1<<SPI_CR1_SSI_Pos // SS в высоком состоянии | 0x02<<SPI_CR1_BR_Pos // Скорость передачи | 1<<SPI_CR1_MSTR_Pos // Режим Master | 0<<SPI_CR1_CPOL_Pos | 0<<SPI_CR1_CPHA_Pos | SPI_CR1_SPE; DMA1_Stream5->CR = 0; DMA1_Stream5->FCR = 0; DMA1_Stream5->PAR = (uint32_t)(&SPI3->DR); DMA1_Stream0->CR = 0; DMA1_Stream0->FCR = 0; DMA1_Stream0->PAR = (uint32_t)(&SPI3->DR); DMA1_Stream0->NDTR = 1024; DMA1_Stream0->M0AR = (uint32_t)SPI3_buff; DMA1_Stream0->CR = _VAL2FLD(DMA_SxCR_CHSEL, 0)| /// channe - tmigger _VAL2FLD(DMA_SxCR_DIR, 0)| /// peripheral to memory DMA_SxCR_MINC| /// memory increment mode DMA_SxCR_EN; } void SPI3_Send(uint8_t *data, uint16_t len) { while ((SPI3->SR & SPI_SR_BSY) | !(SPI3->SR & SPI_SR_TXE)) {} Empty_Flag = 1; GPIOA->BSRR = GPIO_BSRR_BS_10; // На прием DMA1_Stream0->CR &=~(DMA_SxCR_EN); DMA1_Stream0->NDTR = 1024; DMA1_Stream0->M0AR = (uint32_t)SPI3_buff; DMA1_Stream0->CR |=(DMA_SxCR_EN); // На передачу DMA1->HIFCR = (DMA_HIFCR_CTCIF5| DMA_HIFCR_CHTIF5 | DMA_HIFCR_CTEIF5 | DMA_HIFCR_CDMEIF5 | DMA_HIFCR_CFEIF5); DMA1_Stream5->NDTR = len; DMA1_Stream5->M0AR = (uint32_t)data; DMA1_Stream5->CR = _VAL2FLD(DMA_SxCR_CHSEL, 0)| /// channe - tmigger _VAL2FLD(DMA_SxCR_DIR, 1)| /// memory_to_peripheral DMA_SxCR_MINC| /// memory increment mode DMA_SxCR_TCIE| DMA_SxCR_EN; NVIC_EnableIRQ(SPI3_IRQn); NVIC_EnableIRQ(DMA1_Stream5_IRQn); } void DMA1_Stream5_IRQHandler(void) { if (DMA1->LISR & DMA_LISR_TCIF0) { DMA1->LIFCR = DMA_LIFCR_CTCIF0; // сброс флага события TCIF DMA1_Stream5->CR = 0; SPI3->CR2 |= SPI_CR2_TXEIE; //GPIOA->BSRR = GPIO_BSRR_BR_10; } } uint8_t SPI3_Is_Empty(void) { return Empty_Flag; } volatile uint8_t ssss; void SPI3_IRQHandler(void) { const uint32_t sr = SPI3->SR; const uint32_t cr2 = SPI3->CR2; if(READ_BIT(sr, SPI_SR_TXE)) { SPI3->SR = sr &(~SPI_SR_TXE); SPI3->CR2 = cr2 &(~SPI_CR2_TXEIE); Empty_Flag = 0; GPIOA->BSRR = GPIO_BSRR_BR_10; } else if(READ_BIT(sr, SPI_SR_OVR)) { __NOP(); } } Не могу добиться правильного варианта с опусканием вывода PA10. В прерыварии по DMA срабатывает рано, что понятно почему Прерывание по TXE не срабатывает...
  3. stm32f4 spi dma cmsis

    Методом тыка выяснил, что LWIP не дает работать, когда комментирую инициализацию LWIP то SPI через DMA заводится...
  4. stm32f4 spi dma cmsis

    При компиляции то ошибок нет, но при исполнении в статус регистрах появляются
  5. stm32f4 spi dma cmsis

    Флаги Transfer error и FIFO error устанавливаются после запуска DMA Я пытаюсь сейчас в простом виде запустить SPI+DMA чтобы что-нибудь выдало а дальше буду накручивать функционал т.к. не понятно чего оно не работает
  6. stm32f4 spi dma cmsis

    Проц STM32f407IGT6 Поместил весь код, касающийся SPI3, DMA1 и нужных GPIO в одну функцию, вызываю её один раз перед основным циклом. Проект большой, больше нигде ничего не трогается из этой периферии void SPI3_Send() { //DMA1 Stream 5 SPI3_TX channel 0 RCC->AHB1ENR |= RCC_AHB1ENR_DMA1EN; RCC->APB1ENR |= RCC_APB1ENR_SPI3EN; RCC->AHB1ENR |= RCC_AHB1ENR_GPIOCEN; // GPIO GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.Speed = GPIO_SPEED_FAST; GPIO_InitStruct.Alternate = GPIO_AF6_SPI3; // PC10 - SCK - Выход GPIO_InitStruct.Pin = GPIO_PIN_10; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); // PC11 - MISO - Вход GPIO_InitStruct.Pin = GPIO_PIN_11; GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); // PC12 - MOSI - Выход GPIO_InitStruct.Pin = GPIO_PIN_12; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); uint8_t data[] = {1,2,3}; uint8_t len = 3; DMA1_Stream5->CR = 0; DMA1_Stream5->PAR = (uint32_t)(&SPI3->DR); DMA1_Stream5->M0AR = (uint32_t)data; DMA1_Stream5->NDTR = len; DMA1_Stream5->FCR = 0; // Настройка FIFO буфера DMA1_Stream5->CR = (0x00) << DMA_SxCR_CHSEL_Pos // Выбор канала |(0x00) << DMA_SxCR_MBURST_Pos // |(0x00) << DMA_SxCR_PBURST_Pos // |0 << DMA_SxCR_CT_Pos // Текущий буфер |0 << DMA_SxCR_DBM_Pos // Двойной буфер |(0x03) << DMA_SxCR_PL_Pos // Приоритет |0 << DMA_SxCR_PINCOS_Pos // Инкремент адреса периферии |(0x00) << DMA_SxCR_MSIZE_Pos // Размер данных в памяти 8 бит |(0x00) << DMA_SxCR_PSIZE_Pos // Размер данных в периферии 8 бит |1 << DMA_SxCR_MINC_Pos // Инкремент адреса памяти |0 << DMA_SxCR_PINC_Pos // Инкремент адреса периферии |0 << DMA_SxCR_CIRC_Pos // Циркуляционный режим |(0x01) << DMA_SxCR_DIR_Pos // Направление данных из памяти в периферию |0 << DMA_SxCR_PFCTRL_Pos // DMA управляет процессом |0 << DMA_SxCR_TCIE_Pos // Прерывание по окончанию передачи |0 << DMA_SxCR_HTIE_Pos // Прерывание по половине передачи |0 << DMA_SxCR_TEIE_Pos // Прерывание по ошибке передачи |0 << DMA_SxCR_DMEIE_Pos // Прерывание по |1 << DMA_SxCR_EN_Pos; // Активация DMA SPI3->CR2 = 1<<SPI_CR2_TXDMAEN_Pos | 1<<SPI_CR2_SSOE_Pos; SPI3->CR1 = 0<<SPI_CR1_DFF_Pos //Размер кадра 8 бит | 0<<SPI_CR1_LSBFIRST_Pos //MSB first | 1<<SPI_CR1_SSM_Pos //Программное управление SS | 1<<SPI_CR1_SSI_Pos //SS в высоком состоянии | 0x04<<SPI_CR1_BR_Pos //Скорость передачи: F_PCLK/32 | 1<<SPI_CR1_MSTR_Pos //Режим Master (ведущий) | 0<<SPI_CR1_CPOL_Pos | 0<<SPI_CR1_CPHA_Pos //Режим работы SPI: 0 | 1<<SPI_CR1_SPE_Pos; //Включаем SPI } Нужно ли обработчик прерывания делать если оно у меня не используется?
  7. stm32f4 spi dma cmsis

    SPI вообще ничего не отправляет, если отправку делаю через DMA. ни один из выводов SPI не дергается.
  8. stm32f4 spi dma cmsis

    Инициализация DMA сейчас выглядит вот так //DMA1 Stream 7 SPI3_TX channel 0 DMA1_Stream7->CR = 0; DMA1_Stream7->PAR = (uint32_t)(&SPI3->DR); DMA1_Stream7->M0AR = (uint32_t)data; DMA1_Stream7->NDTR = len; DMA1_Stream7->FCR = 0; // Настройка FIFO буфера DMA1_Stream7->CR = (0x00) << DMA_SxCR_CHSEL_Pos // Выбор канала |(0x00) << DMA_SxCR_MBURST_Pos // |(0x00) << DMA_SxCR_PBURST_Pos // |0 << DMA_SxCR_CT_Pos // Текущий буфер |0 << DMA_SxCR_DBM_Pos // Двойной буфер |(0x03) << DMA_SxCR_PL_Pos // Приоритет |0 << DMA_SxCR_PINCOS_Pos // Инкремент адреса периферии |(0x00) << DMA_SxCR_MSIZE_Pos // Размер данных в памяти 8 бит |(0x00) << DMA_SxCR_PSIZE_Pos // Размер данных в периферии 8 бит |1 << DMA_SxCR_MINC_Pos // Инкремент адреса памяти |0 << DMA_SxCR_PINC_Pos // Инкремент адреса периферии |0 << DMA_SxCR_CIRC_Pos // Циркуляционный режим |(0x01) << DMA_SxCR_DIR_Pos // Направление данных из памяти в периферию |0 << DMA_SxCR_PFCTRL_Pos // DMA управляет процессом |0 << DMA_SxCR_TCIE_Pos // Прерывание по окончанию передачи |0 << DMA_SxCR_HTIE_Pos // Прерывание по половине передачи |0 << DMA_SxCR_TEIE_Pos // Прерывание по ошибке передачи |0 << DMA_SxCR_DMEIE_Pos // Прерывание по |1 << DMA_SxCR_EN_Pos; // Активация DMA
  9. stm32f4 spi dma cmsis

    Канал 0 какие я регистры не заполнил из обязательных? уже исправлено SPI3->CR1 = 0<<SPI_CR1_DFF_Pos //Размер кадра 8 бит | 0<<SPI_CR1_LSBFIRST_Pos //MSB first | 1<<SPI_CR1_SSM_Pos //Программное управление SS | 1<<SPI_CR1_SSI_Pos //SS в высоком состоянии | 0x04<<SPI_CR1_BR_Pos //Скорость передачи: F_PCLK/32 | 1<<SPI_CR1_MSTR_Pos //Режим Master (ведущий) | 0<<SPI_CR1_CPOL_Pos | 0<<SPI_CR1_CPHA_Pos; //Режим работы SPI: 0 SPI3->CR2 |= 1<<SPI_CR2_TXDMAEN_Pos; SPI3->CR2 |= 1<<SPI_CR2_SSOE_Pos; SPI3->CR2 |= 1<<SPI_CR2_RXDMAEN_Pos; SPI3->CR1 |= 1<<SPI_CR1_SPE_Pos; //Включаем SPI volatile uint8_t data[3] = {1,2,3}; SPI3_Send(data,3); Спасибо
  10. stm32f4 spi dma cmsis

    Поменял. На ситуацию не повлияло
  11. stm32f4 spi dma cmsis

    Без цикла тоже не работает. Одиночную отправку тоже не производит
  12. stm32f4 spi dma cmsis

    Доброго времени суток Подскажите пожалуйста, что я делаю не так в настройке DMA для SPI для отправки без DMA работает void SPI3_Init() { // SPI3 RCC->APB1ENR |= RCC_APB1ENR_SPI3EN; RCC->AHB1ENR |= RCC_AHB1ENR_DMA1EN; SPI3->CR1 = 0 << SPI_CR1_DFF_Pos // Размер кадра 8 бит | 0<<SPI_CR1_LSBFIRST_Pos // MSB first | 1<<SPI_CR1_SSM_Pos // Программное управление SS | 1<<SPI_CR1_SSI_Pos // SS в высоком состоянии | 0x00<<SPI_CR1_BR_Pos // Скорость передачи = Fpclk/2 | 1<<SPI_CR1_MSTR_Pos // Режим Master | 0<<SPI_CR1_CPOL_Pos | 0<<SPI_CR1_CPHA_Pos; SPI3->CR2 = SPI_CR2_TXDMAEN; // Отправка через DMA SPI3->CR1 |= SPI_CR1_SPE; // Включаем SPI3 } void SPI3_Send(volatile uint8_t *data, uint16_t len) { //DMA1 Stream 7 SPI3_TX DMA1_Stream7->CR = 0; DMA1_Stream7->CR |= 0x01 << DMA_SxCR_PSIZE_Pos; // SPI data register is 16 bit DMA1_Stream7->CR |= 0x00 << DMA_SxCR_MSIZE_Pos; // memory size is 8bit DMA1_Stream7->CR |= DMA_SxCR_MINC; // memory increment DMA1_Stream7->CR |= 0x01 << DMA_SxCR_DIR_Pos; // memory to peripheral DMA1_Stream7->CR |= 0x03 << DMA_SxCR_PL_Pos; // Priority level DMA1_Stream7->PAR = (uint32_t)(&SPI3->DR); DMA1_Stream7->M0AR = (uint32_t)data; DMA1_Stream7->NDTR = len; DMA1_Stream7->FCR = 0; // Настройка FIFO буфера DMA1_Stream7->CR |= DMA_SxCR_EN; } ................ volatile uint8_t data[3] = {1,2,3}; while(1) SPI3_Send(data,3);
  13. Степген для 8 двигателей много ресурсов жрет, да и функионала нет такого там чтобы ОС ставить. с компа через сеть получаю пакеты движений а в ответ отсылаю пакеты с положениями валов полученные по модбасу
×
×
  • Создать...