Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы
Непрочитано 16.08.2011, 21:41  
DarkEN_ANGEL
Частый гость
 
Регистрация: 01.08.2011
Адрес: Украина, Киев
Сообщений: 24
Сказал спасибо: 4
Сказали Спасибо 10 раз(а) в 9 сообщении(ях)
DarkEN_ANGEL на пути к лучшему
По умолчанию stm32 + xpt2046 (аналог ads7846)

Доброе время суток!
Имею дисплей с тачскрином, которым рулит xtp2046 (хотя китайцы головы на отсечение давали что установлен ads7846 =) ).
Контроллер подключен через spi интерфейс к stm32f103, работающему на частоте в 72 мГц. Предделитель SPI установлен в 256, т.е. интерфейс работает на частоте 281 кГц (не многовато ли для нещастного контроллера тача?). Написан драйвер.

И, есстественно, есть проблемма (ну куда ведь без нее...). Состоит она в том что икс-координата читается нормально, а игрек - всегда 256. Икс читается первым, игрек - вторым. Если поменять чтения местами - игрек читается, икс - угадайте(нет)... Странно, ведь вычисления при обоих чтениях одинаковы, задержки при чтениях тоже одинаковы - по 1 микросекунде. Задержки формируются пропуском 72х тактов n раз.
Чего я только уже не делал, даже бубен, и тот не помогает =)

Короче, вот код:
Код:
void SPI_WR(u8 cmd)
{
  while (SPI1-›SR & !SPI_SR_TXE) ;
  SPI1-›DR = cmd;
  while (SPI1-›SR & !SPI_SR_RXNE) ;
}

u8 SPI_RD()
{
  u8 buf;
  DelayUS(1);
  SPI_WR(0x00);
  buf = SPI1-›DR;

  return buf;
}


void ReadADS7846(int16_t *X, int16_t *Y)
{
  int8_t a, b, i;
  int16_t dataX, dataY, pressure;
  
  cpin_m(TP_SPIPORT, TP_CS_MASK);
  SPI_WR(CMD_START | CMD_8BIT | CMD_DIFF | CMD_Z1_POS);
  a = SPI_RD();
  DelayUS(1);
  SPI_WR(CMD_START | CMD_8BIT | CMD_DIFF | CMD_Z2_POS);
  b = 127 - SPI_RD();
  spin_m(TP_SPIPORT, TP_CS_MASK);
  pressure = a + b;

  if(pressure ›= MIN_PRESSURE)
  {
    for(i = 4; i != 0; i--) //4 samples
    {
      dataX = 0;
      dataY = 0;
      a = 0;
      b = 0;
      cpin_m(TP_SPIPORT, TP_CS_MASK);
      //get X data
      SPI_WR(CMD_START | CMD_12BIT | CMD_DIFF | CMD_X_POS);
      a = SPI_RD();
      DelayUS(1);
      b = SPI_RD();
      dataX += ((a ‹‹ 4) | (b ›› 4));
      
      //get Y data
      SPI_WR(CMD_START | CMD_12BIT | CMD_DIFF | CMD_Y_POS);
      a = SPI_RD();
      DelayUS(1);
      b = SPI_RD();
      dataY += 1023 - ((a ‹‹ 4) | (b ›› 4)); 
      spin_m(TP_SPIPORT, TP_CS_MASK);
    }
    dataX ››= 2; //x/4
    dataY ››= 2; //y/4
  }
  else
  {
    pressure = 0;
  }
  
  *X = dataX;
  *Y = dataY;
  
#ifdef debug
  char str[64];
  sprintf(str, "X = %i           ", dataX);
  GUI_Text(10, 50, str, Yellow, Black);
  sprintf(str, "Y = %i           ", dataY);
  GUI_Text(10, 66, str, Yellow, Black);
  sprintf(str, "aY = %i, bY = %i      ", a, b);
  GUI_Text(10, 82, str, Red, Black);
#endif
}


extern "C" 
__irq void EXTI9_5_IRQHandler()
{
  if (EXTI-›PR & EXTI_PR_PR5)
  {
    int16_t X[1], Y[1];
    ReadADS7846(X, Y);
    EXTI-›PR |= EXTI_PR_PR5;
  }
}
Кстати если на втором spin_m() поставить брейкпоинт, то видно что переменные a и b имеют вполне адекватные значения. То есть вносится пауза и все ок. Если поставить DelayUS(1) между считываниями, то игрек равен нулю.

Кто работал с этими тачскринами? Может кто чем помочь?
Реклама:

Последний раз редактировалось DarkEN_ANGEL; 17.08.2011 в 09:05.
DarkEN_ANGEL вне форума  
Сказали "Спасибо" DarkEN_ANGEL
warel (28.06.2019)
Непрочитано 18.08.2011, 09:35  
DarkEN_ANGEL
Частый гость
 
Регистрация: 01.08.2011
Адрес: Украина, Киев
Сообщений: 24
Сказал спасибо: 4
Сказали Спасибо 10 раз(а) в 9 сообщении(ях)
DarkEN_ANGEL на пути к лучшему
По умолчанию Re: stm32 + xpt2046(аналог ads7846)

Ау, люди? Неужели никто с тачскринами не работал?
DarkEN_ANGEL вне форума  
Сказали "Спасибо" DarkEN_ANGEL
warel (28.06.2019)
Непрочитано 18.08.2011, 14:34  
Solomiichuk
Временная регистрация
 
Регистрация: 29.01.2011
Адрес: Украина, Киев-Ялта
Сообщений: 12
Сказал спасибо: 1
Сказали Спасибо 8 раз(а) в 7 сообщении(ях)
Solomiichuk на пути к лучшему
По умолчанию Re: stm32 + xpt2046(аналог ads7846)

Сегодня сам начинаю писать драйвер под СТМ32 для такого же тачскрина. Если есть желание, то можем скооперироваться.
Solomiichuk вне форума  
Сказали "Спасибо" Solomiichuk
warel (28.06.2019)
Непрочитано 18.08.2011, 18:45  
DarkEN_ANGEL
Частый гость
 
Регистрация: 01.08.2011
Адрес: Украина, Киев
Сообщений: 24
Сказал спасибо: 4
Сказали Спасибо 10 раз(а) в 9 сообщении(ях)
DarkEN_ANGEL на пути к лучшему
По умолчанию Re: stm32 + xpt2046(аналог ads7846)

Сообщение от Solomiichuk Посмотреть сообщение
Сегодня сам начинаю писать драйвер под СТМ32 для такого же тачскрина. Если есть желание, то можем скооперироваться.
Конечно же желание есть!
Прикладываю к сообщению архив с драйвером. В принципе работает, надо только разобратся с задержками...

Микросхема контроллера тача подключена к SPI1, для отслеживания нажатия использую пин penirq и exti-контроллер stm32 (т.е. генерируется прерывание, из которого потом и вызывается чтение).

В в ReadADS7846 есть здоровый закомментированый кусок кода - это альтернативный не доделанный вариант чтения. Суть его в считывании координат 10 раз (все координаты помещаются в массивы dataX, dataY), отбросе 2х минимальных и 2х максимальных значений (просто обнуление в массиве) и среднее арифметическое оставшихся шести.

Попробуйте запустить мой вариант драйвера для начала. Будут вопросы - обращайтесь.
Вложения:
Тип файла: rar ads7843 stm32.rar (2.5 Кб, 480 просмотров)
DarkEN_ANGEL вне форума  
Эти 2 пользователя(ей) сказали Спасибо DarkEN_ANGEL за это сообщение:
Solomiichuk (18.08.2011), warel (28.06.2019)
Непрочитано 18.08.2011, 21:47  
Solomiichuk
Временная регистрация
 
Регистрация: 29.01.2011
Адрес: Украина, Киев-Ялта
Сообщений: 12
Сказал спасибо: 1
Сказали Спасибо 8 раз(а) в 7 сообщении(ях)
Solomiichuk на пути к лучшему
По умолчанию Re: stm32 + xpt2046(аналог ads7846)

Сейчас посмотрю Ваш код и попытаюсь что-то изваять по-своему.
Все результаты выложу.
Solomiichuk вне форума  
Сказали "Спасибо" Solomiichuk
warel (28.06.2019)
Непрочитано 19.08.2011, 12:43  
DarkEN_ANGEL
Частый гость
 
Регистрация: 01.08.2011
Адрес: Украина, Киев
Сообщений: 24
Сказал спасибо: 4
Сказали Спасибо 10 раз(а) в 9 сообщении(ях)
DarkEN_ANGEL на пути к лучшему
По умолчанию Re: stm32 + xpt2046(аналог ads7846)

Кстати, советую заюзать вывод BUSY контроллера... Таким образом можно отказаться от задержек в коде - после посылки просто мониторить этот пин на предмет спадания уровня с "1" к "0" а затем читать координату(исходя из даташита переход из "1" в "0" означает окончание преобразования).

На моем дисплее китайцы не подпаяли этот пин контроллера, поэтому пришлось навешивать прямо на ногу проводок. Благо на интерфейсном разъеме платы дисплея был один неиспользуемый контакт - его я и задействовал как вывод BUSY.

Сейчас переделаю драйвер и протестирую. О результатах напишу.
DarkEN_ANGEL вне форума  
Сказали "Спасибо" DarkEN_ANGEL
warel (28.06.2019)
Непрочитано 19.08.2011, 19:45  
Solomiichuk
Временная регистрация
 
Регистрация: 29.01.2011
Адрес: Украина, Киев-Ялта
Сообщений: 12
Сказал спасибо: 1
Сказали Спасибо 8 раз(а) в 7 сообщении(ях)
Solomiichuk на пути к лучшему
По умолчанию Re: stm32 + xpt2046(аналог ads7846)

Вчера написал обработчик прерывания по нажатию на экран: работает. В отличии от Вашего кода, я задействовал только перепад вниз. Сейчас буду писать обмен по SPI.
Solomiichuk вне форума  
Сказали "Спасибо" Solomiichuk
warel (28.06.2019)
Непрочитано 19.08.2011, 20:08  
DarkEN_ANGEL
Частый гость
 
Регистрация: 01.08.2011
Адрес: Украина, Киев
Сообщений: 24
Сказал спасибо: 4
Сказали Спасибо 10 раз(а) в 9 сообщении(ях)
DarkEN_ANGEL на пути к лучшему
По умолчанию Re: stm32 + xpt2046(аналог ads7846)

Сообщение от Solomiichuk Посмотреть сообщение
Вчера написал обработчик прерывания по нажатию на экран: работает. В отличии от Вашего кода, я задействовал только перепад вниз. Сейчас буду писать обмен по SPI.
И реагирует только на перепад вниз (т.е. именно нажатие, а не отпускание) ? Странно, ибо у меня возникает как при спадании, так и наростании. Оставлял только бит в FTSR (или как его) - все ровно дважды генерируется.
DarkEN_ANGEL вне форума  
Сказали "Спасибо" DarkEN_ANGEL
warel (28.06.2019)
Непрочитано 19.08.2011, 22:12  
Solomiichuk
Временная регистрация
 
Регистрация: 29.01.2011
Адрес: Украина, Киев-Ялта
Сообщений: 12
Сказал спасибо: 1
Сказали Спасибо 8 раз(а) в 7 сообщении(ях)
Solomiichuk на пути к лучшему
По умолчанию Re: stm32 + xpt2046(аналог ads7846)

Цитата:
Оставлял только бит в FTSR (или как его) - все ровно дважды генерируется.
Этот глюк у меня тоже был. Пофиксил его тем, что выключил подтяжку вверх на входе прерывания от тачскрина (PENIRQ).
Solomiichuk вне форума  
Эти 2 пользователя(ей) сказали Спасибо Solomiichuk за это сообщение:
DarkEN_ANGEL (20.08.2011), warel (28.06.2019)
Непрочитано 21.08.2011, 14:48  
Solomiichuk
Временная регистрация
 
Регистрация: 29.01.2011
Адрес: Украина, Киев-Ялта
Сообщений: 12
Сказал спасибо: 1
Сказали Спасибо 8 раз(а) в 7 сообщении(ях)
Solomiichuk на пути к лучшему
По умолчанию Re: stm32 + xpt2046(аналог ads7846)

Пытаюсь читать данные АЦП. Получаются, чуть ли не случайные значения.
Скиньте в личку свой e-mail - пришлю весь проект.
Solomiichuk вне форума  
Сказали "Спасибо" Solomiichuk
warel (28.06.2019)
 

Закладки
Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Изучаем STM32 Cortex M3 EugVor ARM 6166 19.02.2024 18:22
smd аналог 580вв55а execute Информация по радиокомпонентам 11 07.08.2009 16:14
Есть ли более дешевый аналог MAX312? или аналог КР590КН5 phoenix_87 Информация по радиокомпонентам 0 11.03.2009 10:10


Часовой пояс GMT +4, время: 22:52.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot