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

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

Изменено пользователем IgorKossak
[codebox] для длинного кода, [code] - для короткого!!!

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


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

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

 

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


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

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

 

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 должны быть интристики на эти инструкции

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


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

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

 

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. Беда где-то в другом месте...

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


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

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

 

:biggrin:

...

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


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

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

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

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

 

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

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

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


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

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

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

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

 

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

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

 

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

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


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

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

 

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

 

добрался.

sram%20err%20read.PNG

 

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

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

 

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

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


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

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

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

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

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

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

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

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

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

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