Easyelectronics.ru

Электроника для всех
Текущее время: 23 сен 2019, 21:08

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



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 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
Сообщения: 1009
Если у тебя дисплей с 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
Сообщения: 1009
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
Сообщения: 5652
sergeyfk05 писал(а):
Сработал такой вариант.

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


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

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


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

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

viewtopic.php?f=35&t=34948


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

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


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

Сейчас этот форум просматривают: Eddy_Em, meykj, xDriver


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

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

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