Easyelectronics.ru

Электроника для всех
Текущее время: 13 июл 2020, 21:05

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 9 ] 
Автор Сообщение
 Заголовок сообщения: STM32 и LCD по FSMC 8bit
СообщениеДобавлено: 24 авг 2019, 17:55 
Только пришел

Зарегистрирован: 24 авг 2019, 17:45
Сообщения: 5
В общем есть модуль дисплея с разведенными 8бита данными на драйвере r61509v. Код прикреплю ниже. Суть проблемы: Пытаюсь прочитать ID дисплея и получаю не то что ожидается, если попробовать прочитать любой другой регистр, то вернутся тот же результат. В чем может быть причина?
Вопрос: в даташите драйвера нашел, чтобы разрешить чтение, то нужно подать на пин разрешения чтения логический 0. Оно по умолчанию в FSMC так или за это отвечает какая-то настройка в FSMC?

дефайны
Код:
#define CMD_ADR  (uint32_t*)0x60040000
#define DAT_ADR  (uint32_t*)0x60000000


инициализация
Код:
   bool LCD_R61509V::HardwareInit(void)
   {
      GPIO_InitTypeDef GPIO_InitStruct = { 0 };

      /* Clock Enable */      
      __HAL_RCC_GPIOD_CLK_ENABLE();
      __HAL_RCC_GPIOE_CLK_ENABLE();
      __HAL_RCC_GPIOH_CLK_ENABLE();
      __HAL_RCC_FSMC_CLK_ENABLE();
      

      /*Configure reset pin: PE5*/
      GPIO_InitStruct.Pin = GPIO_PIN_5;
      GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
      GPIO_InitStruct.Pull = GPIO_NOPULL;
      GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
      HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
      /*Configure reset pin Output Level */
      HAL_GPIO_WritePin(GPIOE, GPIO_PIN_5, GPIO_PIN_RESET);
      

      /*Configure GPIOD pins*/
      GPIO_InitStruct.Pin = GPIO_PIN_0 |    GPIO_PIN_1 | GPIO_PIN_4 | GPIO_PIN_5 |
                        GPIO_PIN_7 | GPIO_PIN_14 | GPIO_PIN_15 | GPIO_PIN_11;
      GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
      GPIO_InitStruct.Pull = GPIO_NOPULL;
      GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
      GPIO_InitStruct.Alternate = GPIO_AF12_FSMC;
      HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
      
      /*Configure GPIOE pins*/
      GPIO_InitStruct.Pin = GPIO_PIN_7 | GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10;
      GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
      GPIO_InitStruct.Pull = GPIO_NOPULL;
      GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
      GPIO_InitStruct.Alternate = GPIO_AF12_FSMC;
      HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
      
      
      
      FSMC_NORSRAM_TimingTypeDef Timing = { 0 };

      /** Perform the SRAM1 memory initialization sequence
      */
      ledSram.Instance = FSMC_NORSRAM_DEVICE;
      ledSram.Extended = FSMC_NORSRAM_EXTENDED_DEVICE;
      /* ledSram.Init */
      ledSram.Init.NSBank = FSMC_NORSRAM_BANK1;
      ledSram.Init.DataAddressMux = FSMC_DATA_ADDRESS_MUX_DISABLE;
      ledSram.Init.MemoryType = FSMC_MEMORY_TYPE_SRAM;
      ledSram.Init.MemoryDataWidth = FSMC_NORSRAM_MEM_BUS_WIDTH_8;
      ledSram.Init.BurstAccessMode = FSMC_BURST_ACCESS_MODE_DISABLE;
      ledSram.Init.WaitSignalPolarity = FSMC_WAIT_SIGNAL_POLARITY_LOW;
      ledSram.Init.WrapMode = FSMC_WRAP_MODE_DISABLE;
      ledSram.Init.WaitSignalActive = FSMC_WAIT_TIMING_BEFORE_WS;
      ledSram.Init.WriteOperation = FSMC_WRITE_OPERATION_ENABLE;
      ledSram.Init.WaitSignal = FSMC_WAIT_SIGNAL_DISABLE;
      ledSram.Init.ExtendedMode = FSMC_EXTENDED_MODE_DISABLE;
      ledSram.Init.AsynchronousWait = FSMC_ASYNCHRONOUS_WAIT_DISABLE;
      ledSram.Init.WriteBurst = FSMC_WRITE_BURST_DISABLE;
      ledSram.Init.PageSize = FSMC_PAGE_SIZE_NONE;
      /* Timing */
      Timing.AddressSetupTime = 15;
      Timing.AddressHoldTime = 15;
      Timing.DataSetupTime = 255;
      Timing.BusTurnAroundDuration = 15;
      Timing.CLKDivision = 16;
      Timing.DataLatency = 17;
      Timing.AccessMode = FSMC_ACCESS_MODE_A;
      /* ExtTiming */

      
      if (HAL_SRAM_Init(&ledSram, &Timing, NULL) != HAL_OK)
         return false;
      
      return true;
   }



пытаюсь читать так
Код:
    void LCD_R61509V::ReadReg16b(uint16_t reg, uint16_t* data)
   {
      //HAL_SRAM_WriteOperation_Enable(&ledSram);
      HAL_SRAM_Write_16b(&ledSram, CMD_ADR, &reg, 1);
      //HAL_SRAM_WriteOperation_Disable(&ledSram);
      
   
      HAL_SRAM_Read_16b(&ledSram, DAT_ADR, data, 1);
   }


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 и LCD по FSMC 8bit
СообщениеДобавлено: 24 авг 2019, 18:02 
Только пришел

Зарегистрирован: 24 авг 2019, 17:45
Сообщения: 5
Логического анализатора нет, но столкнувшись с этой проблемой уже заказал


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 и LCD по FSMC 8bit
СообщениеДобавлено: 24 авг 2019, 18:18 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1209
Если у тебя дисплей с 8-ми битной шиной, то зачем же обращаться к нему как к 16-ти битному? Обычно чтобы прочесть ID нужно отправить 2+2 байта и принять 2, побайтно, хотя есть дисплеи где второй байт отправлять/принимать не нужно. У меня был R61503, там первый вариант. И у тебя тут адрес неправильный:
Код:
#define CMD_ADR  (uint32_t*)0x60040000

Для 8 бит и A16 в качестве RS должно быть: (volatile uint8_t*)0x60010000. Volatile нельзя убирать, если для 16-ти бит еще может работать, то когда будет оправка пары 8-ми битных значений подряд оптимизатор оставит только второй байт.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 и LCD по FSMC 8bit
СообщениеДобавлено: 24 авг 2019, 18:39 
Только пришел

Зарегистрирован: 24 авг 2019, 17:45
Сообщения: 5
Reflector писал(а):
Если у тебя дисплей с 8-ми битной шиной, то зачем же обращаться к нему как к 16-ти битному? Обычно чтобы прочесть ID нужно отправить 2+2 байта и принять 2, побайтно, хотя есть дисплеи где второй байт отправлять/принимать не нужно. У меня был R61503, там первый вариант. И у тебя тут адрес неправильный:
Код:
#define CMD_ADR  (uint32_t*)0x60040000

Для 8 бит и A16 в качестве RS должно быть: (volatile uint8_t*)0x60010000. Volatile нельзя убирать, если для 16-ти бит еще может работать, то когда будет оправка пары 8-ми битных значений подряд оптимизатор оставит только второй байт.

А если использую A18?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 и LCD по FSMC 8bit
СообщениеДобавлено: 24 авг 2019, 18:42 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1209
sergeyfk05 писал(а):
А если использую A18?

Тогда нужно в коде поменять пин с PD11, на PD13.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 и LCD по FSMC 8bit
СообщениеДобавлено: 24 авг 2019, 18:58 
Только пришел

Зарегистрирован: 24 авг 2019, 17:45
Сообщения: 5
Reflector писал(а):
sergeyfk05 писал(а):
А если использую A18?

Тогда нужно в коде поменять пин с PD11, на PD13.

ну вот измели метод на такой
Код:
    void LCD_R61509V::ReadReg16b(uint16_t reg, uint16_t* data)
   {
      HAL_SRAM_Write_8b(&ledSram, (uint32_t*)CMD_ADR, (uint8_t*)&reg, 2);
      //HAL_SRAM_Write_8b(&ledSram, (uint32_t*)CMD_ADR, (uint8_t*)&reg, 2);
      HAL_SRAM_Write_8b(&ledSram, (uint32_t*)DAT_ADR, (uint8_t*)data, 2);
   }

Адреса оставил те же. Про пин не заметил. Я там эксперементировал просто. Но работает все равно не как ожидается. Возвращает 8193d,а должно 46345d


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 и LCD по FSMC 8bit
СообщениеДобавлено: 24 авг 2019, 19:35 
Только пришел

Зарегистрирован: 24 авг 2019, 17:45
Сообщения: 5
Сработал такой вариант. Ну и для активации записи/чтения, должен быть нулевой логический уровень на соотвествующем пине, поэтому адреса регистра и данных поменял между собой.
Код:
      *CMD_ADR = 0;
      HAL_Delay(100);
      uint8_t buf = *DAT_ADR;
      *data = buf;
      *data <<= 8;
      buf = *DAT_ADR;
      *data |= buf;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 и LCD по FSMC 8bit
СообщениеДобавлено: 24 авг 2019, 22:31 
Старожил

Зарегистрирован: 11 сен 2012, 11:19
Сообщения: 5879
sergeyfk05 писал(а):
Сработал такой вариант.

Ставь на черное, кодинг не для тебя...


sergeyfk05 писал(а):
HAL_Delay(100);

Тем более после сей хрени...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 и LCD по FSMC 8bit
СообщениеДобавлено: 25 авг 2019, 16:15 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 23 ноя 2010, 20:11
Сообщения: 106
Откуда: Омск
Последнее сообщение на странице. Вместе с решением.

viewtopic.php?f=35&t=34948


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 9 ] 


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB