SergeyB 0 June 10, 2014 Posted June 10, 2014 (edited) · Report post Помогите ЛЮДИ!!!!!! у меня уже мозг взрывается. подключил память. все пины верно!. настроил, взял из примеров код и функции чтения и записи. Смотрел анализатором сигналы. как по даташиту, все нормально. читает последнее записанное, хоть треснию ХЕЛП!!!!!! #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 June 10, 2014 by IgorKossak [codebox] для длинного кода, [code] - для короткого!!! Quote Share this post Link to post Share on other sites More sharing options...
Axel 1 June 11, 2014 Posted June 11, 2014 · Report post "Не получается правильно - делай наоборот"©. Не пробовали вместо *pBuffer++ написать *(pBuffer++) ? Quote Share this post Link to post Share on other sites More sharing options...
demiurg_spb 0 June 11, 2014 Posted June 11, 2014 · Report post Не пробовали вместо *pBuffer++ написать *(pBuffer++) ?А смысл? Quote Share this post Link to post Share on other sites More sharing options...
SergeyDDD 0 June 11, 2014 Posted June 11, 2014 · Report post Возможно это поможет... 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 должны быть интристики на эти инструкции Quote Share this post Link to post Share on other sites More sharing options...
Axel 1 June 11, 2014 Posted June 11, 2014 · Report post Возможно это поможет... 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. Беда где-то в другом месте... Quote Share this post Link to post Share on other sites More sharing options...
SergeyDDD 0 June 11, 2014 Posted June 11, 2014 · Report post Может и поможет, только смысла в этом совете не больше, чем в моем предыдущем. ... Quote Share this post Link to post Share on other sites More sharing options...
SergeyB 0 June 11, 2014 Posted June 11, 2014 · Report post Чет даже не знаю что и делать. Должна была с пол пинка взлететь. по анализатору смотрю, память то читается, но именно она выдает постоянно последнее записанное значение. Адрес смотрю меняется нормально. бред короче на пустом месте. плата такая, на шине висит NAND, SRAM и ssd1963. Из этого всего только SRAM не работает нормально. Всё живет под FreeRTOS. Quote Share this post Link to post Share on other sites More sharing options...
DmitryM 0 June 11, 2014 Posted June 11, 2014 · Report post Чет даже не знаю что и делать. Должна была с пол пинка взлететь. по анализатору смотрю, память то читается, но именно она выдает постоянно последнее записанное значение. Адрес смотрю меняется нормально. бред короче на пустом месте. плата такая, на шине висит NAND, SRAM и ssd1963. Из этого всего только SRAM не работает нормально. Всё живет под FreeRTOS. Как включена SRAM, выводы BLE, BHE? Элементарно может читаться последнее записанное значение, если SRAM в Z-состоянии, а емкость шины еще содержит последнее выставленное значение и шина никуда не подтянута. Quote Share this post Link to post Share on other sites More sharing options...
SergeyB 0 June 11, 2014 Posted June 11, 2014 · Report post Как включена SRAM, выводы BLE, BHE? Элементарно может читаться последнее записанное значение, если SRAM в Z-состоянии, а емкость шины еще содержит последнее выставленное значение и шина никуда не подтянута. пины BLE, BHE подключены к чипу верно (но еще раз проверю). про Z состояние идея очень кстати верная, надо проанализовать еще раз сигналы управляющие. уже на столе другой проект раскидал. отпишусь обязательно немного позже. добрался. всем спасибо кто откликнулся. Дело было не в бабине.... за отсутствием идей что еще можно исправить, снял cpld с платы, которая тоже сидела на шине и отвечала за трассировщик шины для ssd1963 и ВСЁ стало норм. Quote Share this post Link to post Share on other sites More sharing options...