Раз никто не хочет участвовать в теме, то продолжу диалог с самим собой
.
Угробил вчера около 3-х часов на изучение даташита на контроллер. Самые интересные для меня моменты:
1)
Так, включаем питание. Делаем RST=0, ждем 1мс., подымаем RST в 1, ждем 5мс. Сложно, но мы и не с таким справлялись
. Далее настраиваем питание, НО, я то хочу прочитать ID.
В даташите нет ни слова о том, когда мне можно прочитать ID чипа, поэтому делаю как все - читаю сразу после ресета. Едем к списку команд:
Вот он родненький, самый первый в списке
. И в нем мы сразу видим, что в результате чтения с этого регистра мы должны получить 01110101, тобишь 0x75. Что это за однобайтный идентификатор - понятия не имею, так как во всех других дисплеях они двухбайтные. Ну да и черт с ним пока, у нас более важная проблема - как передать 16-бит регистра по 8-ми битной шине? Опят головой в даташит:
Это единственное, что можно найти по интересующему нас вопросу. Из этого можно предположить, что каждая кучка данных отправляется и принимается стробом RNW или NRN. И предполагаем, что контроллер вкурсе, что у нас шина на 8 бит, и что все команды и данные более 8-ми бит будут передаваться/приниматься
в несколько заходов. Только вот что он будет делать если мы передаем/принимаем 8 бит - завершать запись/чтение или ждать нулевые биты? Пока загадка. Ладно, черт с ним пока. Едем далее.
А далее пишем код:
Код:
void hx8347G_Reset (void)
{
HX8347G_LCD_RESET_DISABLE;
_hx8347G_Delay_ms(10);
HX8347G_LCD_CS_DISABLE;
HX8347G_LCD_CD_DATA;
HX8347G_LCD_WR_DISABLE;
HX8347G_LCD_RD_DISABLE;
HX8347G_SET_DATA = 0xFF;
_hx8347G_Delay_ms(1);
HX8347G_LCD_RESET_ENABLE;
_hx8347G_Delay_us(3);
HX8347G_LCD_RESET_DISABLE;
_hx8347G_Delay_us(10);
HX8347G_LCD_RESET_ENABLE;
_hx8347G_Delay_us(10);
HX8347G_LCD_RESET_DISABLE;
_hx8347G_Delay_ms(150);
}
uint32_t hx8347G_Read_Reg (uint8_t Reg_Value, uint8_t Number_Of_Bytes_For_Read)
{
uint32_t Readed_Data = 0;
uint8_t x = 1;
if (Data_PINs_State == 1) {hx8347G_PINs_Data_Out();}
HX8347G_LCD_CS_DISABLE;
HX8347G_LCD_RD_DISABLE;
HX8347G_LCD_WR_DISABLE;
HX8347G_LCD_CD_DATA;
HX8347G_LCD_CS_ENABLE;
HX8347G_LCD_CD_COMMAND;
HX8347G_SET_DATA = Reg_Value;
_hx8347G_Delay_us(1);
HX8347G_WR_STROBE;
_hx8347G_Delay_us(1);
HX8347G_LCD_CS_DISABLE;
HX8347G_LCD_CS_ENABLE;
HX8347G_LCD_CD_DATA;
hx8347G_PINs_Data_In();
for (x = 1; x <= Number_Of_Bytes_For_Read; x++)
{
_hx8347G_Delay_us(1);
HX8347G_LCD_RD_ENABLE;
_hx8347G_Delay_us(1);
Readed_Data <<= 8;
Readed_Data |= HX8347G_READ_DATA;
HX8347G_LCD_RD_DISABLE;
}
HX8347G_LCD_CS_DISABLE;
return Readed_Data;
}
Внимательный глаз, наверное, заметит строчки
HX8347G_LCD_CS_DISABLE; HX8347G_LCD_CS_ENABLE;. Не смотря на то, что на графике NCS не отключается, код работает только в таком виде. Если убрать эти строки, то в ответ придут нули. Почему так сделано - понятия не имею
.
Тайминги взяты с последних страниц даташита.
Теперь если в main.c добавить
hx8347G_Reset (); test1 = hx8347G_Read_Reg (0x00, 1);, т.е. считать 1 байт из регистра 0x00, то в ответ получим 0x75. Вернемся к даташиту и посмотрим регистр 0x00 подробнее:
Вот этот загадочный ID 0x75. Смею предположить, что я уже общаюсь с дисплеем
.
P.S. похоже поторопился с выводами. При чтении любого регистра в ответ летят 0x75 либо 0x7D. Пошел искать причину....