реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> stm32f103 + 16c754, Внешний uart.
cpl
сообщение Mar 22 2011, 12:16
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 378
Регистрация: 6-12-04
Пользователь №: 1 340



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

Go to the top of the page
 
+Quote Post
cpl
сообщение Mar 20 2012, 10:04
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 378
Регистрация: 6-12-04
Пользователь №: 1 340



Разобрался, оказалось что глючат переходные отвестия на плате (то есть контакт, то нет ).
smile3009.gif
Go to the top of the page
 
+Quote Post
Mareng
сообщение May 29 2012, 09:10
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 53
Регистрация: 19-02-07
Пользователь №: 25 487



Ситуация один в один.
Проверил уже все что можно, все сигналы формируются идеально, однако rhr читается как 0. Все остальные регистры читаются/пишутся. rhr даже на запись работает правильно, передается все верно. Сомневаюсь, что у нас одинаково глючат переходные отверстия. На шине еще есть NAND, работает отлично. Можно поподробнее изложить методику "лечения" той платы? может все же дело было не в отверстиях?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 29 2012, 09:15
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Тайминги проверьте: если не ошибаюсь, длительность строба чтения должна быть не меньше двух тактов клока tl16c754b. Скажется как раз на RHR/THR.
Go to the top of the page
 
+Quote Post
Mareng
сообщение May 29 2012, 09:19
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 53
Регистрация: 19-02-07
Пользователь №: 25 487



Изначально было около 2 тактов частоты, увеличивал длительность в 10 раз, все также.
Go to the top of the page
 
+Quote Post
cpl
сообщение May 29 2012, 09:20
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 378
Регистрация: 6-12-04
Пользователь №: 1 340



Методика проста(при небольшом условие – требуется наличие логического анализатора): цепляется логический анализатор на все выводы(их немного) и просматривается весь обмен.
Для начала проверяется чтение самой мсх т.е. ее присутствие, потом инит, потом прием байтов.
НаНД это хорошо, какой контролер используете ? Смотрите как настроен контролер памяти. Потом какой частотой тактируете 754 ? соблюдаются временные диаграммы ? Например может быть проблема в том что слишком быстро обмен идет 754 не успевает или контролер памяти глючит, помогает выставить время доступа как можно больше для начала.
Go to the top of the page
 
+Quote Post
Mareng
сообщение May 29 2012, 09:44
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 53
Регистрация: 19-02-07
Пользователь №: 25 487



cpl, т.е. все заработало с этим же кодом инициализации, но с исправными переходными отверстиями?
Сейчас то работает стабильно?
Go to the top of the page
 
+Quote Post
cpl
сообщение May 29 2012, 10:29
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 378
Регистрация: 6-12-04
Пользователь №: 1 340



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

где то так.
Go to the top of the page
 
+Quote Post
Mareng
сообщение May 29 2012, 10:33
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 53
Регистрация: 19-02-07
Пользователь №: 25 487



Изменил скорость на линии чтения(RD) с 50Mhz на 2Mhz и все заработало. Слишком острый фронт мешал ей работать правильно? какие мысли?
Go to the top of the page
 
+Quote Post
cpl
сообщение May 29 2012, 10:37
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 378
Регистрация: 6-12-04
Пользователь №: 1 340



Цитата(cpl @ May 29 2012, 12:20) *
какой частотой тактируете 754 ?

Go to the top of the page
 
+Quote Post
Mareng
сообщение May 29 2012, 10:37
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 53
Регистрация: 19-02-07
Пользователь №: 25 487



14745600
Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 29 2012, 10:38
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



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

Похоже, звенит ваша плата на быстрых фронтах. Посмотрите RD осциллографом с хорошей полосой.
Go to the top of the page
 
+Quote Post
cpl
сообщение May 29 2012, 10:40
Сообщение #13


Местный
***

Группа: Свой
Сообщений: 378
Регистрация: 6-12-04
Пользователь №: 1 340



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

импульс RD по времени сколько получается ?
Go to the top of the page
 
+Quote Post
Mareng
сообщение May 29 2012, 10:44
Сообщение #14


Участник
*

Группа: Участник
Сообщений: 53
Регистрация: 19-02-07
Пользователь №: 25 487



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

Длительность импульса изначально была около 200нс, делал больше в 10, 100 раз...
Думаю все дело в длительности паузы между CS и RD. Скорость понизил, фронт чтения немного растянулся, видимо этого хватило микрухе.
Go to the top of the page
 
+Quote Post
scifi
сообщение May 29 2012, 10:49
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Ух, сколько сложностей. Не проще ли было поставить ещё один STM32 с нужным числом UARTов?
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 15th July 2025 - 07:56
Рейтинг@Mail.ru


Страница сгенерированна за 0.01551 секунд с 7
ELECTRONIX ©2004-2016