История началась с того, что на целевом устройстве на базе STM32F429 через определённое время перестаёт работать BULK OUT.
Раскопки привели к тому, что после программного сброса модуля OTG_FS и его инициализации, содержимое некоторых установленных регистров оказыватся испорченным.
Теперь конкретика. Я взял STM32F429 discovery, IDE IAR. Из STM32Cube_FW_F4_V1.13.0 пример UART_TwoBoards_ComPolling.
В main.c после установки системной частоты SystemClock_Config() я добавил такие строки:
Код
__HAL_RCC_USB_OTG_FS_CLK_ENABLE();
USB_OTG_FS->GRSTCTL |= USB_OTG_GRSTCTL_CSRST;
while (USB_OTG_FS->GRSTCTL & USB_OTG_GRSTCTL_CSRST);
{
volatile unsigned int i;
for (i = 0; i < 50000; i++); // ~2.8 ms delay (datasheet: at least 3 PHY clocks delay)
}
USB_OTG_FS->DIEPTXF0_HNPTXFSIZ = 0x03FF03FF;
BSP_LED_On(LED3);
while (USB_OTG_FS->DIEPTXF0_HNPTXFSIZ == 0x03FF03FF);
BSP_LED_Off(LED3);
while (1);
USB_OTG_FS->GRSTCTL |= USB_OTG_GRSTCTL_CSRST;
while (USB_OTG_FS->GRSTCTL & USB_OTG_GRSTCTL_CSRST);
{
volatile unsigned int i;
for (i = 0; i < 50000; i++); // ~2.8 ms delay (datasheet: at least 3 PHY clocks delay)
}
USB_OTG_FS->DIEPTXF0_HNPTXFSIZ = 0x03FF03FF;
BSP_LED_On(LED3);
while (USB_OTG_FS->DIEPTXF0_HNPTXFSIZ == 0x03FF03FF);
BSP_LED_Off(LED3);
while (1);
Записываю в Host non-periodic transmit FIFO size register значение 0x03FF03FF
Между BSP_LED_On(LED3); и BSP_LED_Off(LED3); проходит 58.4 мс, регистр оказывается наполовину сброшенным,
т.е. поле RAM start address остаётся 0x3FF, а поле TxFIFO depth сбрасывается в 0x200.
Перечитал 34 главу скудного Reference manual (DM00031020), но не смог найти объяснения такому поведению...