cpl 0 22 марта, 2011 Опубликовано 22 марта, 2011 · Жалоба Здравствуйте Необходимо подключить дополнительные уарты (помимо штатных) к stm32f103, решено поставить tl16c754b (внутри 4-uart). tl16c754b подключена к stm32 как внешняя sram, используется в tl16c754b только первый cs. Не могу прочитать приходящие байты, всегда читается RHR=0 (в независимости от того что пришло) Пробовал смотреть логически анализатором шину, тоже самое всегда RHR=0, если читаю другой регистр то значения соответствуют записанным, пробовал понизить частоту тактирования tl16c754 результат один и тот же. tl16c754 настроена на работу в dma0 + fifo, при приеме байта прерывания генерируются. Замечена была следующая странность поведения tl16c754: пришел байт - переходим в прерывание, считывается RHR=0 и так пока количество пришедших байт не станет равно RX TRIGGER LEVEL, после прерывания прекращают генерироваться tl16c754. Получается что RHR не был считан ? Код инициализации tl16c754(clk=7372800Гц): LCR_UART1 = LCR_DEV_LANCH_ENABLE; /* Enable divisor access */ DLL_UART1 = 0x04;//d; DLM_UART1 = 0x00;// 115200 LCR_UART1 = LCR_WORD_8BIT | LCR_NO_PARITY | LCR_STOP_BIT1; /* Set 8,N,1 data */ FCR_UART1 = FCR_TRIGER_RX_FIFO_60_CHAR | FCR_DMA_MODE0 | FCR_RST_TX_FIFO | FCR_RST_RX_FIFO | FCR_ENABLE_FIFO; IER_UART1 = IER_RX_DATA; MCR_UART1 = 0; Код инициализации sram stm32: /*-- FSMC Configuration ------------------------------------------------------*/ p.FSMC_AddressSetupTime = 0; p.FSMC_AddressHoldTime = 0; p.FSMC_DataSetupTime = 250; p.FSMC_BusTurnAroundDuration = 0; p.FSMC_CLKDivision = 0; p.FSMC_DataLatency = 0; p.FSMC_AccessMode = FSMC_AccessMode_A; FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM1; FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable; FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM; FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_8b; FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable; FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable; FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low; FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable; FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState; FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable; FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable; FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable; FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable; FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p; FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p; FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure); /*!< Enable FSMC Bank1_SRAM Bank */ FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE); Код прерывания от внешнего вывода stm32: void EXTI0_IRQHandler(void) { uint8_t c; c = RHR_UART1; THR_UART1 = c; EXTI_ClearITPendingBit(EXTI_Line0); } Регистры tl16c754: #define RHR_UART (0x00) /*Receiver Buffer Register of chA */ #define THR_UART (0x00) /*Transmitter Holding Register of chA */ #define IER_UART (0x01) /*Interrupt Enable Register of chA */ #define IIR_UART (0x02) /*Interrupt Identify Register of chA */ /* BANK RAM FOR STM32 NE1 NE2 NE3 NE4 -> CSA CSB CSC CSD */ #define BANK1_EXT_SRAM (0x60000000) #define RHR_UART1 *((volatile uint8_t*)(BANK1_EXT_SRAM + RHR_UART)) /*Receiver Buffer Register of chA */ ............... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
cpl 0 20 марта, 2012 Опубликовано 20 марта, 2012 · Жалоба Разобрался, оказалось что глючат переходные отвестия на плате (то есть контакт, то нет ). :smile3009: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Mareng 0 29 мая, 2012 Опубликовано 29 мая, 2012 · Жалоба Ситуация один в один. Проверил уже все что можно, все сигналы формируются идеально, однако rhr читается как 0. Все остальные регистры читаются/пишутся. rhr даже на запись работает правильно, передается все верно. Сомневаюсь, что у нас одинаково глючат переходные отверстия. На шине еще есть NAND, работает отлично. Можно поподробнее изложить методику "лечения" той платы? может все же дело было не в отверстиях? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 68 29 мая, 2012 Опубликовано 29 мая, 2012 · Жалоба Тайминги проверьте: если не ошибаюсь, длительность строба чтения должна быть не меньше двух тактов клока tl16c754b. Скажется как раз на RHR/THR. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Mareng 0 29 мая, 2012 Опубликовано 29 мая, 2012 · Жалоба Изначально было около 2 тактов частоты, увеличивал длительность в 10 раз, все также. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
cpl 0 29 мая, 2012 Опубликовано 29 мая, 2012 · Жалоба Методика проста(при небольшом условие – требуется наличие логического анализатора): цепляется логический анализатор на все выводы(их немного) и просматривается весь обмен. Для начала проверяется чтение самой мсх т.е. ее присутствие, потом инит, потом прием байтов. НаНД это хорошо, какой контролер используете ? Смотрите как настроен контролер памяти. Потом какой частотой тактируете 754 ? соблюдаются временные диаграммы ? Например может быть проблема в том что слишком быстро обмен идет 754 не успевает или контролер памяти глючит, помогает выставить время доступа как можно больше для начала. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Mareng 0 29 мая, 2012 Опубликовано 29 мая, 2012 · Жалоба cpl, т.е. все заработало с этим же кодом инициализации, но с исправными переходными отверстиями? Сейчас то работает стабильно? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
cpl 0 29 мая, 2012 Опубликовано 29 мая, 2012 · Жалоба :smile3046: Инит: // init 16c754 LCR_UART1 = LCR_DEV_LANCH_ENABLE; /* Enable divisor access */ DLL_UART1 = baud_16c754; /* set divisor */ DLM_UART1 = baud_16c754>>8; LCR_UART1 = LCR_WORD_8BIT | LCR_NO_PARITY | LCR_STOP_BIT1; /* Set 8,N,1 data */ FCR_UART1 = FCR_TRIGER_RX_FIFO_60_CHAR | FCR_DMA_MODE0 | FCR_RST_TX_FIFO | FCR_RST_RX_FIFO | FCR_ENABLE_FIFO; /* Enable and clear FIFOs, Rcv thresh=60 */ IER_UART1 = IER_RX_DATA;//enable rx only int MCR_UART1 = MCR_IRQ_ENABLE; /* eNABLE IRQ Disable flow control */ Прием: c = LSR_UART1; if (c & LSR_DATA_RX ){ b = RHR_UART1; } Передача: c = LSR_UART1; if (c & LSR_THR_EMPTY ){ THR_UART1 = b; } где то так. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Mareng 0 29 мая, 2012 Опубликовано 29 мая, 2012 · Жалоба Изменил скорость на линии чтения(RD) с 50Mhz на 2Mhz и все заработало. Слишком острый фронт мешал ей работать правильно? какие мысли? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
cpl 0 29 мая, 2012 Опубликовано 29 мая, 2012 · Жалоба какой частотой тактируете 754 ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Mareng 0 29 мая, 2012 Опубликовано 29 мая, 2012 · Жалоба 14745600 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 68 29 мая, 2012 Опубликовано 29 мая, 2012 · Жалоба какие мысли? Похоже, звенит ваша плата на быстрых фронтах. Посмотрите RD осциллографом с хорошей полосой. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
cpl 0 29 мая, 2012 Опубликовано 29 мая, 2012 · Жалоба соблюдаются временные диаграммы ? Например может быть проблема в том что слишком быстро обмен идет 754 не успевает или контролер памяти глючит, помогает выставить время доступа как можно больше для начала. импульс RD по времени сколько получается ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Mareng 0 29 мая, 2012 Опубликовано 29 мая, 2012 · Жалоба импульс RD по времени сколько получается ? Длительность импульса изначально была около 200нс, делал больше в 10, 100 раз... Думаю все дело в длительности паузы между CS и RD. Скорость понизил, фронт чтения немного растянулся, видимо этого хватило микрухе. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 29 мая, 2012 Опубликовано 29 мая, 2012 · Жалоба Ух, сколько сложностей. Не проще ли было поставить ещё один STM32 с нужным числом UARTов? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться