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