Всех приветствую. В наши дни очень много людей занимаются любительской электроникой, создают разные девайсы, полезные технологичные устройства которые приносят пользу своим создателям. Рынок электроники этому сопутствует, в продаже много модулей и компонентов что не может не радовать заядлого электронщика. Я тоже люблю разработку, пощупать что то новенькое, поломать голову над тем то что может пригодится в будущих проектах. И как то один хороший человек подтолкнул к идее разобраться с емкостным тачскрином. Они большое применение получили в различной современной технике в частности в планшетах, телефонах, почему бы не применить и в наших устройствах. И вот, в руки мне попал подопытный 7" тачскрин от планшета. Он построен по проекционно-емкостной технологии и позволяет определять более одной точки прикосновения так называемая поддержка мультитач. По внутренней стороне стекла тачскрина расположены электроды, через которые контроллер подает постоянные сканирующие импульсные токи. При прикосновении к сенсорному слеклу, происходит утечка токов которые регистрирует и анализирует микроконтроллер GSL1680.
Если с самим стеклом все просто, то с контроллером GSL1680 пришлось разбираться и немного повозится. Вся суть проблемы заключалась в документации, которая просто отсутствовала. Поиски в инете привели к скудному ознакомительному даташиту, в котором ничего полезного нет. С живого планшета была скопирована схема подключения стекла к контроллеру. Резисторы R1 и R2 для выбора напряжения подтяжки интерфейса.
И единственно что немного помогло в разборе регистров, это небольшое описание на страничке Linux_соидов и мой небольшой реверс-инжиниринг с помощью логического анализатора.
Сопоставив информацию с протоколом анализатора стала прояснятся работа чипа. Существенным недостатком этого чипа стало то, что прошивка в него подгружается из вне. Что при применении с слабыми на память МК существенно ее отнимает. В данный момент она занимает 20к флеш памяти. Единственным выходом из этой ситуации думаю будет подключение дополнительной внешней флеш памяти, с последующей выгрузкой из нее прошивки.
Из собранной информации стало известно о регистрах:
0x00-0x7F : эти регистры используются для загрузки частей прошивки 0x80: содержит количество касаний на экране. 0x84-0x87: содержит координаты для первого касания. 0x88-0x8B: содержит координаты для второго касания. 0x8C-0xAB: содержит координаты для третьего, четвертого и т. д. (До пяти в некоторых устройствах, до десяти в других). 0xE0: STATUS регистр 0xE4, 0xBC-0xBF: какие-то контрольные регистры. Необходимые для загрузки прошивки и программного сброса микросхемы (о них больше нет данных). 0xF0: PAGE регистр. Содержит номер страницы памяти, отображаемой в данный момент в регистрах 0x00-0x7F..
Инициализация чипа: - Установить Shutdown в 1
- Сброс чипа
- Включить чип
- Сброс регистров
- Загрузить прошивку
- Включить чип
- Задержка 15 мс
- Сброс чипа
- Задержка 20 мс
- Включить чип
- Задержка 70 мс
Формат возвращаемых данных:
Четыре байта каждой группы координат содержат значения X и Y, а также идентификатор прикосновения. Первые два байта в формате с прямым порядком байтов содержат координату X в 12 младших битах. Два других байта содержат координату Y в 12 младших битах. 4 старших бита в координате Y содержат идентификатор пальца, который коснулся.
Пример:
Допустим, пользователь касается экрана одним пальцем. Регистр 0x80 будет содержать 1, а регистры 0x84 - 0x87 будут содержать координаты X и Y, и идентификатор. Причем старший байт по X будет находится в регистре 0x85, а младший в 0x84. По Y старший в 0x87, младший 0x86.
Если пользователь, не убирая первый палец, касается экрана вторым пальцем. Регистр 0x80 будет содержать 2. Регистры от 0x84 до 0x87 будут содержать координаты X и Y первого касания, а идентификатор пальца в них будет 1. Регистры 0x88 до 0x8B будут содержать координаты X и Y второго касания и палец Идентификатор в них будет 2. Теперь пользователь убирает первый палец, оставляя второй. Регистр 0x80 будет содержать 1. Регистры от 0x84 до 0x87 будут содержать координаты X и Y, но идентификатор пальца будет равен 2, потому что это палец, который остается на сенсоре.
На основании всех данных была написана библиотека функций и программа для теста в среде BascomAVR.
Shutdown alias Portd.5 : Config Shutdown = output : Shutdown = 1 IRQ alias Portd.2 : Config IRQ = input : IRQ = 1
Const debugs = 1 'информация отладки Const Touch_enable = 2 'колличество одновременных прикосновений 1-5 $include "Lib_GSL1680v3.bas" '------------------------------------ int0 ------------------------------------- Config Int0 = Rising On Int0 Isr_int0 '------------------------------------ I2c -------------------------------------- Config Sda = Portc.1 Config Scl = Portc.0 Config I2cdelay = 1 I2cinit Waitms 50 '------------------------------------- INIT ------------------------------------ Gosub GSL1680_Init '------------------------------------- MAIN ------------------------------------
Print "---- Touch GSL1680 test -----" Enable Int0 Enable interrupts
Do Idle Loop
End '-------------------------------------------------------------------------------
Isr_int0:
GSL1680_dataread Print "In touch " ; Ntouch
if Ntouch > 0 then
for bTemp = 1 to Ntouch print "id=" ; Finger_ID(bTemp); print " X=" ; Coords_X(bTemp); print " Y=" ; Coords_Y(bTemp) next
Return
'------------------------------------------------------------------------------- $include "FW_data_GSLX680 v3.bas" |
Единственное с чем не разобрался, так это с идентификатором. По непонятным причинам он выдает не корректные значения. Буду признателен в какой либо помощи..
Всем успешного использования. |