Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: stm32f103 + 16c754
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
cpl
Здравствуйте
Необходимо подключить дополнительные уарты (помимо штатных) к 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
Разобрался, оказалось что глючат переходные отвестия на плате (то есть контакт, то нет ).
smile3009.gif
Mareng
Ситуация один в один.
Проверил уже все что можно, все сигналы формируются идеально, однако rhr читается как 0. Все остальные регистры читаются/пишутся. rhr даже на запись работает правильно, передается все верно. Сомневаюсь, что у нас одинаково глючат переходные отверстия. На шине еще есть NAND, работает отлично. Можно поподробнее изложить методику "лечения" той платы? может все же дело было не в отверстиях?
aaarrr
Тайминги проверьте: если не ошибаюсь, длительность строба чтения должна быть не меньше двух тактов клока tl16c754b. Скажется как раз на RHR/THR.
Mareng
Изначально было около 2 тактов частоты, увеличивал длительность в 10 раз, все также.
cpl
Методика проста(при небольшом условие – требуется наличие логического анализатора): цепляется логический анализатор на все выводы(их немного) и просматривается весь обмен.
Для начала проверяется чтение самой мсх т.е. ее присутствие, потом инит, потом прием байтов.
НаНД это хорошо, какой контролер используете ? Смотрите как настроен контролер памяти. Потом какой частотой тактируете 754 ? соблюдаются временные диаграммы ? Например может быть проблема в том что слишком быстро обмен идет 754 не успевает или контролер памяти глючит, помогает выставить время доступа как можно больше для начала.
Mareng
cpl, т.е. все заработало с этим же кодом инициализации, но с исправными переходными отверстиями?
Сейчас то работает стабильно?
cpl
smile3046.gif
Инит:
Код
                // 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
Изменил скорость на линии чтения(RD) с 50Mhz на 2Mhz и все заработало. Слишком острый фронт мешал ей работать правильно? какие мысли?
cpl
Цитата(cpl @ May 29 2012, 12:20) *
какой частотой тактируете 754 ?

Mareng
14745600
aaarrr
Цитата(Mareng @ May 29 2012, 14:33) *
какие мысли?

Похоже, звенит ваша плата на быстрых фронтах. Посмотрите RD осциллографом с хорошей полосой.
cpl
Цитата(cpl @ May 29 2012, 12:20) *
соблюдаются временные диаграммы ? Например может быть проблема в том что слишком быстро обмен идет 754 не успевает или контролер памяти глючит, помогает выставить время доступа как можно больше для начала.

импульс RD по времени сколько получается ?
Mareng
Цитата(cpl @ May 29 2012, 17:40) *
импульс RD по времени сколько получается ?

Длительность импульса изначально была около 200нс, делал больше в 10, 100 раз...
Думаю все дело в длительности паузы между CS и RD. Скорость понизил, фронт чтения немного растянулся, видимо этого хватило микрухе.
scifi
Ух, сколько сложностей. Не проще ли было поставить ещё один STM32 с нужным числом UARTов?
Mareng
Во время разборок с этим чудом от тексаса, очень жалел, что не поставил на ее место плиску. Давно бы уже все работало.
aaarrr
Цитата(scifi @ May 29 2012, 14:49) *
Ух, сколько сложностей. Не проще ли было поставить ещё один STM32 с нужным числом UARTов?

ИМХО, не проще. Я бы поставил пару SPI->UART типа SC16IS752 - проводов меньше тащить.
cpl
Цитата(Mareng @ May 29 2012, 13:44) *
Длительность импульса изначально была около 200нс, делал больше в 10, 100 раз...
Думаю все дело в длительности паузы между CS и RD. Скорость понизил, фронт чтения немного растянулся, видимо этого хватило микрухе.

Не поленитесь и проверьте еще раз настройки контролера памяти в микроконтроллере, на страницах 19-20(документации на 754) даются временные диаграммы и время на установление сигналов, это нужно сделать один раз.
Тоже хотел поставить FPGA, не дали, с другой стороны 754 Вещь дубовая проверенная если соблюдать временные диаграммы то проблем не будет.
В моем проекта используется 2шт-754, 1шт-рам.
Mareng
Цитата(cpl @ May 29 2012, 17:54) *
Не поленитесь и проверьте еще раз настройки контролера памяти в микроконтроллере, на страницах 19-20(документации на 754) даются временные диаграммы и время на установление сигналов, это нужно сделать один раз.

Они мне сниться будут сегодня.
Что нужно покрутить в настройках контроллера, чтобы увеличить T7h(пауза между cs и rd)?
cpl
Цитата(Mareng @ May 29 2012, 13:58) *
Они мне сниться будут сегодня.
Что нужно покрутить в настройках контроллера, чтобы увеличить T7h(пауза между cs и rd)?

В регистрах контролера внешней памяти нужно прописать соответствующее значение.
Mareng
Цитата(cpl @ May 29 2012, 18:04) *
В регистрах контролера внешней памяти

Ставил разные настройки задержек, и смотрел чего получается. Именно эту паузу ничем сдвинуть не удалось.
cpl
Цитата(Mareng @ May 29 2012, 14:07) *
Ставил разные настройки задержек, и смотрел чего получается. Именно эту паузу ничем сдвинуть не удалось.

Для начала уточните соблюдение для вашей системы следующих временных интервалов: T7w, T8d, T9d, T13w, T15d.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.