Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как настроить FSMC на адрес A16 ?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Memento Mori
Воюю с дисплеем на ILI9325.
Решил сменить библиотеку и дисплей перестал работать.
Это связано с тем, что библиотека была на FSMC 144 ногого камня, а у меня 100-ногий. Видимо я неправильно поправил код.

Библиотеки отличались синтаксисом работы с FSMC. Старая, рабочая:
CODE
#define Bank1_LCD_D ((uint32_t)0x60020000) //disp Data ADDR
#define Bank1_LCD_C ((uint32_t)0x60000000) //disp Reg ADDR


void LCD_WR_REG(unsigned int index)
{
*(__IO uint16_t *) (Bank1_LCD_C)= index;

}


void LCD_WR_CMD(unsigned int index,unsigned int val)
{
*(__IO uint16_t *) (Bank1_LCD_C)= index;
*(__IO uint16_t *) (Bank1_LCD_D)= val;
}

unsigned int LCD_RD_data(void){
unsigned int a=0;
a=*(__IO uint16_t *) (Bank1_LCD_D); //L

return(a);
}


void LCD_WR_Data(unsigned int val)
{
*(__IO uint16_t *) (Bank1_LCD_D)= val;
}

void LCD_WR_Data_8(unsigned int val)
{
*(__IO uint16_t *) (Bank1_LCD_D)= val;
}



Новая, с которой проблемы:
CODE
Библиотека была рассчинатана на 144 ногие корпуса

// for ~RS on address line a19
//#define LCD_BASE ((uint32_t)(0x60000000 | 0x0001fffe))
// for ~RS on address line a0
//#define LCD_BASE ((uint32_t)(0x60000000 | 0x00000000))


// А вот тут уже я подправил на адрес А16 - у меня корпус 100 ногий
#define LCD_BASE ((uint32_t)(0x60020000 | 0x00000000))
#define LCD ((LCD_TypeDef *)LCD_BASE)


void LCD_WriteReg(uint8_t LCD_Reg, uint16_t LCD_RegValue)
{
/* Write 16-bit Index, then Write Reg */
LCD->LCD_REG = LCD_Reg;
/* Write 16-bit Reg */
LCD->LCD_RAM = LCD_RegValue;
}

uint16_t LCD_ReadReg(uint8_t LCD_Reg)
{
volatile uint16_t i = 5;
/* Write 16-bit Index (then Read Reg) */
LCD->LCD_REG = LCD_Reg;
while(i--);
/* Read 16-bit Reg */
return (LCD->LCD_RAM);
}

void LCD_WriteRAM_Prepare(void)
{
LCD->LCD_REG = 0x0022;;
}

void LCD_WriteRAM(uint16_t RGB_Code)
{
/* Write 16-bit GRAM Reg */
LCD->LCD_RAM = RGB_Code;
}


Покопавшись, я пришел к выводу, что какой бы адрес регистра не задавался при чтении, всегда читается содержимое регистра по адресу 0x0000.

Где ошибка в программе?
Golikov A.
ну давайте найдем еще структуру
LCD_TypeDef
и посмотрим что там за поля...

*(__IO uint16_t *) (Bank1_LCD_C)= index;
*(__IO uint16_t *) (Bank1_LCD_D)= val;

у вас тут адреса 6000 0000 и 6002 0000
причем индекс пишется в адрес 6000 0000

в новой же редакции

/* Write 16-bit Index, then Write Reg */
LCD->LCD_REG = LCD_Reg;
/* Write 16-bit Reg */
LCD->LCD_RAM = LCD_RegValue;

ЛСД лежит сразу по адресу 6002 0000, и вы хоть умрите, но ни какое поле этой структуры не будет лежать в адресах меньше 6002 0000. Потому и записи в адрес 6000 0000 больше нет, вы всегда выбранный регистр пишите в адрес данных

Memento Mori
Да я уже переделал все по старому образцу.
Но хоть убей, интересно, как нужно написать, чтобы работало со структурой?
Golikov A.
чтобы работало надо писать в правильные адреса. Чтобы работало со структурой в этой структуре должны быть правильные поля и адреса, надо создать структуру, правильно ее запомнить и все будет работать....
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.