Jump to content
    

stm32f1xx + ext SRAM (CY7C1041DV33)

Помогите ЛЮДИ!!!!!! у меня уже мозг взрывается.

 

подключил память. все пины верно!.

настроил, взял из примеров код и функции чтения и записи. Смотрел анализатором сигналы. как по даташиту, все нормально.

читает последнее записанное, хоть треснию ХЕЛП!!!!!!

 

#define Bank1_SRAM3_ADDR  ((uint32_t)0x68000000)

void SRAM_Init(void)
{
 FSMC_NORSRAMInitTypeDef  FSMC_NORSRAMInitStructure;
 FSMC_NORSRAMTimingInitTypeDef  p;
 GPIO_InitTypeDef GPIO_InitStructure; 

 /* Enable GPIOs clock */
 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_GPIOF |
					 RCC_AHB1Periph_GPIOG, ENABLE);

 /* Enable FSMC clock */
 RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC, ENABLE); 

/*-- GPIOs Configuration -----------------------------------------------------*/
/*
+-------------------+--------------------+------------------+------------------+
| PD0  <-> FSMC_D2  | PE0  <-> FSMC_NBL0 | PF0 <-> FSMC_A0  | PG0 <-> FSMC_A10 |
| PD1  <-> FSMC_D3  | PE1  <-> FSMC_NBL1 | PF1 <-> FSMC_A1  | PG1 <-> FSMC_A11 |
| PD4  <-> FSMC_NOE | PE2  <-> FSMC_A23* | PF2 <-> FSMC_A2  | PG2 <-> FSMC_A12 |
| PD5  <-> FSMC_NWE | PE3  <-> FSMC_A19  | PF3 <-> FSMC_A3  | PG3 <-> FSMC_A13 |
| PD8  <-> FSMC_D13 | PE4  <-> FSMC_A20* | PF4 <-> FSMC_A4  | PG4 <-> FSMC_A14 |
| PD9  <-> FSMC_D14 | PE5  <-> FSMC_A21* | PF5 <-> FSMC_A5  | PG5 <-> FSMC_A15 |
| PD10 <-> FSMC_D15 | PE6  <-> FSMC_A22* | PF12 <-> FSMC_A6 | PG9 <-> FSMC_NE2*|  ne3
| PD11 <-> FSMC_A16 | PE7  <-> FSMC_D4   | PF13 <-> FSMC_A7 |------------------+
| PD12 <-> FSMC_A17 | PE8  <-> FSMC_D5   | PF14 <-> FSMC_A8 |
| PD13 <-> FSMC_A18 | PE9  <-> FSMC_D6   | PF15 <-> FSMC_A9 |
| PD14 <-> FSMC_D0  | PE10 <-> FSMC_D7   |------------------+
| PD15 <-> FSMC_D1  | PE11 <-> FSMC_D8   |
+-------------------| PE12 <-> FSMC_D9   |
				 | PE13 <-> FSMC_D10  |
				 | PE14 <-> FSMC_D11  |
				 | PE15 <-> FSMC_D12  |
				 +--------------------+
*/

 /* GPIOD configuration */
 GPIO_PinAFConfig(GPIOD, GPIO_PinSource0, GPIO_AF_FSMC);
 GPIO_PinAFConfig(GPIOD, GPIO_PinSource1, GPIO_AF_FSMC);
 GPIO_PinAFConfig(GPIOD, GPIO_PinSource4, GPIO_AF_FSMC);
 GPIO_PinAFConfig(GPIOD, GPIO_PinSource5, GPIO_AF_FSMC);
 GPIO_PinAFConfig(GPIOD, GPIO_PinSource8, GPIO_AF_FSMC);
 GPIO_PinAFConfig(GPIOD, GPIO_PinSource9, GPIO_AF_FSMC);
 GPIO_PinAFConfig(GPIOD, GPIO_PinSource10, GPIO_AF_FSMC);
 GPIO_PinAFConfig(GPIOD, GPIO_PinSource11, GPIO_AF_FSMC); 
 GPIO_PinAFConfig(GPIOD, GPIO_PinSource12, GPIO_AF_FSMC);
 GPIO_PinAFConfig(GPIOD, GPIO_PinSource13, GPIO_AF_FSMC);
 GPIO_PinAFConfig(GPIOD, GPIO_PinSource14, GPIO_AF_FSMC);
 GPIO_PinAFConfig(GPIOD, GPIO_PinSource15, GPIO_AF_FSMC);

 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0  | GPIO_Pin_1  | GPIO_Pin_4  | GPIO_Pin_5  | 
		GPIO_Pin_8  | GPIO_Pin_9  | GPIO_Pin_10 | GPIO_Pin_11 |
		GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
 GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;

 GPIO_Init(GPIOD, &GPIO_InitStructure);


 /* GPIOE configuration */
 GPIO_PinAFConfig(GPIOE, GPIO_PinSource0 , GPIO_AF_FSMC);
 GPIO_PinAFConfig(GPIOE, GPIO_PinSource1 , GPIO_AF_FSMC);
 //GPIO_PinAFConfig(GPIOE, GPIO_PinSource2 , GPIO_AF_FSMC);
 GPIO_PinAFConfig(GPIOE, GPIO_PinSource3 , GPIO_AF_FSMC);
 //GPIO_PinAFConfig(GPIOE, GPIO_PinSource4 , GPIO_AF_FSMC);
 //GPIO_PinAFConfig(GPIOE, GPIO_PinSource5 , GPIO_AF_FSMC);
 //GPIO_PinAFConfig(GPIOE, GPIO_PinSource6 , GPIO_AF_FSMC);
 GPIO_PinAFConfig(GPIOE, GPIO_PinSource7 , GPIO_AF_FSMC);
 GPIO_PinAFConfig(GPIOE, GPIO_PinSource8 , GPIO_AF_FSMC);
 GPIO_PinAFConfig(GPIOE, GPIO_PinSource9 , GPIO_AF_FSMC);
 GPIO_PinAFConfig(GPIOE, GPIO_PinSource10 , GPIO_AF_FSMC);
 GPIO_PinAFConfig(GPIOE, GPIO_PinSource11 , GPIO_AF_FSMC);
 GPIO_PinAFConfig(GPIOE, GPIO_PinSource12 , GPIO_AF_FSMC);
 GPIO_PinAFConfig(GPIOE, GPIO_PinSource13 , GPIO_AF_FSMC);
 GPIO_PinAFConfig(GPIOE, GPIO_PinSource14 , GPIO_AF_FSMC);
 GPIO_PinAFConfig(GPIOE, GPIO_PinSource15 , GPIO_AF_FSMC);

 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0  | GPIO_Pin_1  | /*GPIO_Pin_2  |*/ GPIO_Pin_3 |  
		/*GPIO_Pin_4  | GPIO_Pin_5  | GPIO_Pin_6  |*/ GPIO_Pin_7 |
		GPIO_Pin_8  | GPIO_Pin_9  | GPIO_Pin_10 | GPIO_Pin_11|
		GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;

 GPIO_Init(GPIOE, &GPIO_InitStructure);


 /* GPIOF configuration */
 GPIO_PinAFConfig(GPIOF, GPIO_PinSource0 , GPIO_AF_FSMC);
 GPIO_PinAFConfig(GPIOF, GPIO_PinSource1 , GPIO_AF_FSMC);
 GPIO_PinAFConfig(GPIOF, GPIO_PinSource2 , GPIO_AF_FSMC);
 GPIO_PinAFConfig(GPIOF, GPIO_PinSource3 , GPIO_AF_FSMC);
 GPIO_PinAFConfig(GPIOF, GPIO_PinSource4 , GPIO_AF_FSMC);
 GPIO_PinAFConfig(GPIOF, GPIO_PinSource5 , GPIO_AF_FSMC);
 GPIO_PinAFConfig(GPIOF, GPIO_PinSource12 , GPIO_AF_FSMC);
 GPIO_PinAFConfig(GPIOF, GPIO_PinSource13 , GPIO_AF_FSMC);
 GPIO_PinAFConfig(GPIOF, GPIO_PinSource14 , GPIO_AF_FSMC);
 GPIO_PinAFConfig(GPIOF, GPIO_PinSource15 , GPIO_AF_FSMC);

 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0  | GPIO_Pin_1  | GPIO_Pin_2  | GPIO_Pin_3  | 
		GPIO_Pin_4  | GPIO_Pin_5  | GPIO_Pin_12 | GPIO_Pin_13 |
		GPIO_Pin_14 | GPIO_Pin_15;	  

 GPIO_Init(GPIOF, &GPIO_InitStructure);


 /* GPIOG configuration */
 GPIO_PinAFConfig(GPIOG, GPIO_PinSource0 , GPIO_AF_FSMC);
 GPIO_PinAFConfig(GPIOG, GPIO_PinSource1 , GPIO_AF_FSMC);
 GPIO_PinAFConfig(GPIOG, GPIO_PinSource2 , GPIO_AF_FSMC);
 GPIO_PinAFConfig(GPIOG, GPIO_PinSource3 , GPIO_AF_FSMC);
 GPIO_PinAFConfig(GPIOG, GPIO_PinSource4 , GPIO_AF_FSMC);
 GPIO_PinAFConfig(GPIOG, GPIO_PinSource5 , GPIO_AF_FSMC);
 GPIO_PinAFConfig(GPIOG, GPIO_PinSource7 , GPIO_AF_FSMC);
 GPIO_PinAFConfig(GPIOG, GPIO_PinSource9 , GPIO_AF_FSMC);
 GPIO_PinAFConfig(GPIOG, GPIO_PinSource10 , GPIO_AF_FSMC);

 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0  | GPIO_Pin_1  | GPIO_Pin_2  | GPIO_Pin_3 | 
		GPIO_Pin_4  | GPIO_Pin_5  | GPIO_Pin_10
		 | GPIO_Pin_9 | GPIO_Pin_7;	  

 GPIO_Init(GPIOG, &GPIO_InitStructure);

/*-- FSMC Configuration ------------------------------------------------------*/
 p.FSMC_AddressSetupTime = 20;
 p.FSMC_AddressHoldTime = 10;
 p.FSMC_DataSetupTime = 30;
 p.FSMC_BusTurnAroundDuration = 10;
 p.FSMC_CLKDivision = 0;
 p.FSMC_DataLatency = 10;
 p.FSMC_AccessMode = FSMC_AccessMode_A;

 FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM3;
 FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;
 FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM;
 FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;
 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_SRAM3 Bank */
 FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM3, ENABLE); 

}

 

**
 * @brief  Writes a Half-word buffer to the FSMC SRAM memory.
 * @param  pBuffer : pointer to buffer.
 * @param  WriteAddr : SRAM memory internal address from which the data will be
 *		 written.
 * @param  NumHalfwordToWrite : number of half-words to write.
 * @retval None
 */
void SRAM_WriteBuffer(uint16_t* pBuffer, uint32_t WriteAddr, uint32_t NumHalfwordToWrite)
{
 for (; NumHalfwordToWrite != 0; NumHalfwordToWrite--) /* while there is data to write */
 {
/* Transfer data to the memory */
*(__IO uint16_t *) (Bank1_SRAM3_ADDR + WriteAddr) = *pBuffer++;

/* Increment the address*/
WriteAddr += 2;
 }
}

/**
 * @brief  Reads a block of data from the FSMC SRAM memory.
 * @param  pBuffer : pointer to the buffer that receives the data read from the
 *		 SRAM memory.
 * @param  ReadAddr : SRAM memory internal address to read from.
 * @param  NumHalfwordToRead : number of half-words to read.
 * @retval None
 */
void SRAM_ReadBuffer(uint16_t* pBuffer, uint32_t ReadAddr, uint32_t NumHalfwordToRead)
{
 for (; NumHalfwordToRead != 0; NumHalfwordToRead--) /* while there is data to read */
 {
/* Read a half-word from the memory */
*pBuffer++ = *(__IO uint16_t*) (Bank1_SRAM3_ADDR + ReadAddr);

/* Increment the address*/
ReadAddr += 2;
 }
}

Edited by IgorKossak
[codebox] для длинного кода, [code] - для короткого!!!

Share this post


Link to post
Share on other sites

"Не получается правильно - делай наоборот"©. Не пробовали вместо *pBuffer++ написать *(pBuffer++) ?

Share this post


Link to post
Share on other sites

Не пробовали вместо *pBuffer++ написать *(pBuffer++) ?
А смысл?

 

Share this post


Link to post
Share on other sites

Возможно это поможет...

 

DMB - The Data Memory Barrier (DMB) instruction ensures that outstanding memory transactions complete before subsequent memory transactions.

DSB - The Data Synchronization Barrier (DSB) instruction ensures that outstanding memory transactions complete before subsequent instructions execute.

ISB - The Instruction Synchronization Barrier (ISB) ensures that the effect of all completed memory transactions is recognizable by subsequent instructions.

 

в CMSIS должны быть интристики на эти инструкции

Share this post


Link to post
Share on other sites

Возможно это поможет...

 

DMB - The Data Memory Barrier (DMB) instruction ensures that outstanding memory transactions complete before subsequent memory transactions.

DSB - The Data Synchronization Barrier (DSB) instruction ensures that outstanding memory transactions complete before subsequent instructions execute.

ISB - The Instruction Synchronization Barrier (ISB) ensures that the effect of all completed memory transactions is recognizable by subsequent instructions.

 

в CMSIS должны быть интристики на эти инструкции

 

Может и поможет, только смысла в этом совете не больше, чем в моем предыдущем. У меня внешняя SRAM без всяких реверансов работает с LPC17 и с STM32F1/F4. Беда где-то в другом месте...

Share this post


Link to post
Share on other sites

Может и поможет, только смысла в этом совете не больше, чем в моем предыдущем.

 

:biggrin:

...

Share this post


Link to post
Share on other sites

Чет даже не знаю что и делать. Должна была с пол пинка взлететь.

по анализатору смотрю, память то читается, но именно она выдает постоянно последнее записанное значение. Адрес смотрю меняется нормально.

бред короче на пустом месте.

 

плата такая, на шине висит NAND, SRAM и ssd1963. Из этого всего только SRAM не работает нормально.

Всё живет под FreeRTOS.

Share this post


Link to post
Share on other sites

Чет даже не знаю что и делать. Должна была с пол пинка взлететь.

по анализатору смотрю, память то читается, но именно она выдает постоянно последнее записанное значение. Адрес смотрю меняется нормально.

бред короче на пустом месте.

 

плата такая, на шине висит NAND, SRAM и ssd1963. Из этого всего только SRAM не работает нормально.

Всё живет под FreeRTOS.

 

Как включена SRAM, выводы BLE, BHE? Элементарно может читаться последнее записанное значение, если SRAM в Z-состоянии, а емкость шины еще содержит последнее выставленное значение и шина никуда не подтянута.

Share this post


Link to post
Share on other sites

Как включена SRAM, выводы BLE, BHE? Элементарно может читаться последнее записанное значение, если SRAM в Z-состоянии, а емкость шины еще содержит последнее выставленное значение и шина никуда не подтянута.

 

пины BLE, BHE подключены к чипу верно (но еще раз проверю). про Z состояние идея очень кстати верная, надо проанализовать еще раз сигналы управляющие. уже на столе другой проект раскидал. отпишусь обязательно немного позже.

 

добрался.

sram%20err%20read.PNG

 

всем спасибо кто откликнулся. Дело было не в бабине....

за отсутствием идей что еще можно исправить, снял cpld с платы, которая тоже сидела на шине и отвечала за трассировщик шины для ssd1963

 

и ВСЁ стало норм.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...