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

Здравствуйте

Необходимо подключить дополнительные уарты (помимо штатных) к 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 */
...............

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Разобрался, оказалось что глючат переходные отвестия на плате (то есть контакт, то нет ).

:smile3009:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ситуация один в один.

Проверил уже все что можно, все сигналы формируются идеально, однако rhr читается как 0. Все остальные регистры читаются/пишутся. rhr даже на запись работает правильно, передается все верно. Сомневаюсь, что у нас одинаково глючат переходные отверстия. На шине еще есть NAND, работает отлично. Можно поподробнее изложить методику "лечения" той платы? может все же дело было не в отверстиях?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тайминги проверьте: если не ошибаюсь, длительность строба чтения должна быть не меньше двух тактов клока tl16c754b. Скажется как раз на RHR/THR.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Методика проста(при небольшом условие – требуется наличие логического анализатора): цепляется логический анализатор на все выводы(их немного) и просматривается весь обмен.

Для начала проверяется чтение самой мсх т.е. ее присутствие, потом инит, потом прием байтов.

НаНД это хорошо, какой контролер используете ? Смотрите как настроен контролер памяти. Потом какой частотой тактируете 754 ? соблюдаются временные диаграммы ? Например может быть проблема в том что слишком быстро обмен идет 754 не успевает или контролер памяти глючит, помогает выставить время доступа как можно больше для начала.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

cpl, т.е. все заработало с этим же кодом инициализации, но с исправными переходными отверстиями?

Сейчас то работает стабильно?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

: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;
        }

где то так.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Изменил скорость на линии чтения(RD) с 50Mhz на 2Mhz и все заработало. Слишком острый фронт мешал ей работать правильно? какие мысли?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

какие мысли?

Похоже, звенит ваша плата на быстрых фронтах. Посмотрите RD осциллографом с хорошей полосой.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

соблюдаются временные диаграммы ? Например может быть проблема в том что слишком быстро обмен идет 754 не успевает или контролер памяти глючит, помогает выставить время доступа как можно больше для начала.

импульс RD по времени сколько получается ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

импульс RD по времени сколько получается ?

Длительность импульса изначально была около 200нс, делал больше в 10, 100 раз...

Думаю все дело в длительности паузы между CS и RD. Скорость понизил, фронт чтения немного растянулся, видимо этого хватило микрухе.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ух, сколько сложностей. Не проще ли было поставить ещё один STM32 с нужным числом UARTов?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...