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

    

MasterElectric

Участник
  • Публикаций

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

  • Посещение

Репутация

0 Обычный

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

  • Звание
    Участник

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

52 просмотра профиля
  1. STM32L0 HardFault: заморочки с выравниванием

    Для доступа к байту выравнивать не нужно, для полуслова адрес должен быть кратен 2, для слова 4 байтам.
  2. Stack, 8-byte alligment, откуда ноги?

    Это связано с выравниванием стекового фрейма к двойному слову. Это можно отключить в NVIC регистр CCR бит STKALIGN, после чего выравнивание будет к слову. Но отключать можно не во всех МК, m7 нельзя точно. По идее падало во время переключения задач, т.е. при вызове прерывания.
  3. STM32H743 и SDIO

    Это мы рукожопые, а не они)
  4. STM32H743 SPI

    ну скорее всего ошибка в коде и он уходит в стоп режим. Я бы пока малоизучена система тактирования не разгонял бы его. Я имел в виду стабилизатор что в чипе, но раз признаки жизни подает значит живой.
  5. STM32H743 SPI

    Печалька, а где вы ее кстати покупали, в китае? у нас поискал еще нет в продаже. Может полетел встроенный стабилизатор (на 400 тоже не стабильно подключался поэтому сижу на HSI, но я настраивал по мануалу режим стабилизатора установил, память настроил, делители, PLL и то стремно пока что), иногда во время экспериментов неудачных, проц попав видимо в исключение не реагирует на отладчик, помогает только ресет подключить от программатора. Попробуйте загнать его в заводской бут.
  6. STM32H743 SPI

    У меня план ковыряний примерно такой же, QSPI давно хотел попробовать. Доделаю ДМА и начну USART (вроде как в F7 1 в 1, так что не сложно), с ДМА пришла в голову мысль (раз уж каналы стали полностью идентичные) динамически раздавать каналы по запросу периферии, все-равно запуск от полной инициализации отличаеться не сильно по размеру, но страдаю с общими регистрами (RCC, и общие ДМА, особенно с ДМА, совсем не красиво). Пока в голову пришли одни таблицы, зависимостей не видать совсем.
  7. STM32H743 SPI

    Да не заметил. Я думаю под себя перепишите. Пример. NRF24_SPI->Connect(); NRF24_SPI->SendByte(0x55); NRF24_SPI->SendByte(0xaa); NRF24_SPI->Disconnect(); функции библиотеки: void TSPI::Connect(void) { // конфигурируем SPI1 this->SPI->CFG1 = SPI_CFG1_MBR_0 | SPI_CFG1_MBR_2 | SPI_CFG1_DSIZE_0 | SPI_CFG1_DSIZE_1 | SPI_CFG1_DSIZE_2; this->SPI->CFG2 = SPI_CFG2_SSOE | SPI_CFG2_MASTER | SPI_CFG2_AFCNTR; // старт передаем неопределенное кол-во байт this->SPI->CR2 = 0; this->SPI->CR1 |= SPI_CR1_SPE; this->SPI->CR1 |= SPI_CR1_CSTART; } void TSPI::Disconnect(void) { this->SPI->CR1 |= SPI_CR1_CSUSP; this->SPI->CR1 &= ~SPI_CR1_SPE; // еще можно сбросить сам модуль // ... } uint8_t TSPI::SendByte(uint8_t data_out) { uint8_t data_in = 0; while (!(this->SPI->SR & SPI_SR_TXP)); *((__IO uint8_t *)&this->SPI->TXDR) = data_out; // Ждать завершения приёма while(!(this->SPI->SR & SPI_SR_RXP)); data_in = *(volatile uint8_t *) &(this->SPI)->RXDR; return data_in; } P.S. Да первый модуль который я разбираю и столько граблей, то ли нужно глубже вникать, то ли сыроват еще.
  8. STM32H743 SPI

    Вы же не указываете кол-во передаваемых байт?
  9. STM32H743 SPI

    тут наверное ошибочка // Disable SPI SET_BIT( SPI_PORT->CR1, SPI_CR1_SPE); ну по логике так же как и на прерываниях только постоянным опросом флагов, скорее всего прийдеться опрашивать несколько флагов в вечном цикле, выход из вечного цикла после EOT.
  10. STM32H743 SPI

    может полярность или фаза не так настроена. пока просто пробую на анализатор нужно еще rx пдп попробовать.не работала с упакованными данными, особо не печалит
  11. STM32H743 SPI

    После отключения SPI (SPE), в регистре статуса появляеться черти что, мол данные не все ушли, RxFIFO не пуст. Я плюнул играться и после передачи пакета просто сбрасываю модуль, кстати в эррате есть подобная фигня на счет ДМА, но немного не такая. Теперь работает нормально. Благо инициализация SPI 2 регистра записать. С другой стороны не так уж и печально задача заняла ресурс попользовала и отключила.
  12. STM32H743 SPI

    Да вроде нормальный. https://drive.google.com/open?id=1Jibo-gxol...5AZZYmEYEfauK-Q Пытаюсь выполнить рекомендованную последовательность: To close communication it is mandatory to follow these steps in order: 1. Disable DMA request for Tx and Rx in the DMA registers, if the DMA issued. 2. Disable the SPI by following the SPI disable procedure. 3. Disable DMA Tx and Rx buffers by clearing the TXDMAEN and RXDMAEN bits in the SPI_CFG1 register, if DMA Tx and/or DMA Rx are used. Не совсем понятен первый пункт, ДМА стрим я отключаю, но как отключить запросы ДМА по Tx в регистрах ДМА я не понял.
  13. STM32H743 SPI

    Да, в обработчике прерывания EOT, отключаю.
  14. STM32H743 SPI

    Удалось побороть как всегда благодаря RM: When starting communication using DMA, to prevent DMA channel management raising error events, these steps must be followed in order: 1. Enable DMA Rx buffer in the RXDMAEN bit in the SPI_CFG1 register, if DMA Rx is used. 2. Enable DMA requests for Tx and Rx in DMA registers, if the DMA is used. 3. Enable DMA Tx buffer in the TXDMAEN bit in the SPI_CFG1 register, if DMA Tx is used. 4. Enable the SPI by setting the SPE bit. Все нормально в двух режимах, когда DMA ведет SPI, и когда SPI ведет DMA, без ошибок и прочего, но... только 1 раз... второй пакет вообще не идет, совсем... нет запроса ДМА. Прием по прерыванию. Совсем не ожидал что столь незначительная разница в инициализации дала такой результат.
  15. STM32H743 SPI

    Я смотрел Ваш код (частично взял оттуда), вроде бы все как обычно. Мой почти такой же. Если есть возможность попробуйте передать пакет > 16 байт. Мой код: // RCC->D2CCIP1R = RCC_D2CCIP1R_SPI123SEL_2; // kernel clock выбираем per_ck RCC->AHB1ENR |= RCC_AHB1ENR_DMA2EN; RCC->AHB2ENR |= RCC_AHB2ENR_D2SRAM1EN | RCC_AHB2ENR_D2SRAM2EN | RCC_AHB2ENR_D2SRAM3EN; RCC->AHB4ENR |= RCC_AHB4ENR_GPIOAEN; // разрешили тактирование GPIO на котором висит SPI RCC->APB2ENR |= RCC_APB2ENR_SPI1EN; // включаем тактирование модуля SPI_NRF = new TSPI(); SPI_NRF->SPI = SPI1; // конфигурируем SPI1 SPI_NRF->SPI->CFG1 = SPI_CFG1_MBR_0 | SPI_CFG1_MBR_2 | SPI_CFG1_DSIZE_0 | SPI_CFG1_DSIZE_1 | SPI_CFG1_DSIZE_2; SPI_NRF->SPI->CFG2 = SPI_CFG2_SSOE | SPI_CFG2_MASTER | SPI_CFG2_AFCNTR; SPI_NRF->SPI->CR1 |= SPI_CR1_SPE; // настраиваем ДМА на передачу SPI1 DMAMUX1_Channel11->CCR = 38 * DMAMUX_CxCR_DMAREQ_ID_0; // SPI1_TX DMA2_Stream3->PAR = (uint32_t)&SPI_NRF->SPI->TXDR; DMA2_Stream3->FCR &= ~ DMA_SxFCR_DMDIS; // use direct mode DMA2_Stream3->CR = DMA_SxCR_MINC | DMA_SxCR_DIR_0 | DMA_SxCR_PFCTRL; NVIC_EnableIRQ(SPI1_IRQn); // передаем a = 10; SPI_NRF->SendBuff_DMA(SPI1_TxBuff, SPI1_RxBuff, a); функция передачи: void TSPI::SendBuff_DMA(uint8_t *aTxBuff, uint8_t *aRxBuff, uint16_t aCnt) { DMA2_Stream3->CR &= ~(DMA_SxCR_EN); RxBuffPos = 0; TxBuffPos = 0; RxBuff = aRxBuff; TxBuff = aTxBuff; TransLength = aCnt; SPI->CR2 = aCnt; SPI->CFG1 |= SPI_CFG1_TXDMAEN; DMA2->LIFCR = DMA_LIFCR_CFEIF3 | DMA_LIFCR_CDMEIF3 | DMA_LIFCR_CTEIF3 | DMA_LIFCR_CHTIF3 | DMA_LIFCR_CTCIF3; DMA2_Stream3->M0AR = (uint32_t)aTxBuff; DMA2_Stream3->CR |= DMA_SxCR_EN; SPI->CR1 |= SPI_CR1_CSTART; SPI->IER |= SPI_IER_EOTIE | SPI_IER_RXPIE; } Genadi Zawidowski, с пакетом < 16 байт передает нормально, хоть у канала ДМА ошибка. Но если пакеты при работе с неким устройством меньше 16 байт, то смысла в ДМА нет вовсе. А вот если > 16 байт, как я и писал передает 16 и процесс прекращаеться, когда ДМА рулит SPI передает напимер все 19 но после 16 байта мусор, во всех случаях у ДМА ошибка.