Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
16.08.2011, 21:41
|
|
Частый гость
Регистрация: 01.08.2011
Адрес: Украина, Киев
Сообщений: 24
Сказал спасибо: 4
Сказали Спасибо 10 раз(а) в 9 сообщении(ях)
|
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
|
|
|
18.08.2011, 09:35
|
|
Частый гость
Регистрация: 01.08.2011
Адрес: Украина, Киев
Сообщений: 24
Сказал спасибо: 4
Сказали Спасибо 10 раз(а) в 9 сообщении(ях)
|
Re: stm32 + xpt2046(аналог ads7846)
Ау, люди? Неужели никто с тачскринами не работал?
|
|
|
Сказали "Спасибо" DarkEN_ANGEL
|
|
|
18.08.2011, 14:34
|
|
Временная регистрация
Регистрация: 29.01.2011
Адрес: Украина, Киев-Ялта
Сообщений: 12
Сказал спасибо: 1
Сказали Спасибо 8 раз(а) в 7 сообщении(ях)
|
Re: stm32 + xpt2046(аналог ads7846)
Сегодня сам начинаю писать драйвер под СТМ32 для такого же тачскрина. Если есть желание, то можем скооперироваться.
|
|
|
Сказали "Спасибо" Solomiichuk
|
|
|
18.08.2011, 18:45
|
|
Частый гость
Регистрация: 01.08.2011
Адрес: Украина, Киев
Сообщений: 24
Сказал спасибо: 4
Сказали Спасибо 10 раз(а) в 9 сообщении(ях)
|
Re: stm32 + xpt2046(аналог ads7846)
Сообщение от Solomiichuk
|
Сегодня сам начинаю писать драйвер под СТМ32 для такого же тачскрина. Если есть желание, то можем скооперироваться.
|
Конечно же желание есть!
Прикладываю к сообщению архив с драйвером. В принципе работает, надо только разобратся с задержками...
Микросхема контроллера тача подключена к SPI1, для отслеживания нажатия использую пин penirq и exti-контроллер stm32 (т.е. генерируется прерывание, из которого потом и вызывается чтение).
В в ReadADS7846 есть здоровый закомментированый кусок кода - это альтернативный не доделанный вариант чтения. Суть его в считывании координат 10 раз (все координаты помещаются в массивы dataX, dataY), отбросе 2х минимальных и 2х максимальных значений (просто обнуление в массиве) и среднее арифметическое оставшихся шести.
Попробуйте запустить мой вариант драйвера для начала. Будут вопросы - обращайтесь.
|
|
|
Эти 2 пользователя(ей) сказали Спасибо DarkEN_ANGEL за это сообщение:
|
|
|
18.08.2011, 21:47
|
|
Временная регистрация
Регистрация: 29.01.2011
Адрес: Украина, Киев-Ялта
Сообщений: 12
Сказал спасибо: 1
Сказали Спасибо 8 раз(а) в 7 сообщении(ях)
|
Re: stm32 + xpt2046(аналог ads7846)
Сейчас посмотрю Ваш код и попытаюсь что-то изваять по-своему.
Все результаты выложу.
|
|
|
Сказали "Спасибо" Solomiichuk
|
|
|
19.08.2011, 12:43
|
|
Частый гость
Регистрация: 01.08.2011
Адрес: Украина, Киев
Сообщений: 24
Сказал спасибо: 4
Сказали Спасибо 10 раз(а) в 9 сообщении(ях)
|
Re: stm32 + xpt2046(аналог ads7846)
Кстати, советую заюзать вывод BUSY контроллера... Таким образом можно отказаться от задержек в коде - после посылки просто мониторить этот пин на предмет спадания уровня с "1" к "0" а затем читать координату(исходя из даташита переход из "1" в "0" означает окончание преобразования).
На моем дисплее китайцы не подпаяли этот пин контроллера, поэтому пришлось навешивать прямо на ногу проводок. Благо на интерфейсном разъеме платы дисплея был один неиспользуемый контакт - его я и задействовал как вывод BUSY.
Сейчас переделаю драйвер и протестирую. О результатах напишу.
|
|
|
Сказали "Спасибо" DarkEN_ANGEL
|
|
|
19.08.2011, 19:45
|
|
Временная регистрация
Регистрация: 29.01.2011
Адрес: Украина, Киев-Ялта
Сообщений: 12
Сказал спасибо: 1
Сказали Спасибо 8 раз(а) в 7 сообщении(ях)
|
Re: stm32 + xpt2046(аналог ads7846)
Вчера написал обработчик прерывания по нажатию на экран: работает. В отличии от Вашего кода, я задействовал только перепад вниз. Сейчас буду писать обмен по SPI.
|
|
|
Сказали "Спасибо" Solomiichuk
|
|
|
19.08.2011, 20:08
|
|
Частый гость
Регистрация: 01.08.2011
Адрес: Украина, Киев
Сообщений: 24
Сказал спасибо: 4
Сказали Спасибо 10 раз(а) в 9 сообщении(ях)
|
Re: stm32 + xpt2046(аналог ads7846)
Сообщение от Solomiichuk
|
Вчера написал обработчик прерывания по нажатию на экран: работает. В отличии от Вашего кода, я задействовал только перепад вниз. Сейчас буду писать обмен по SPI.
|
И реагирует только на перепад вниз (т.е. именно нажатие, а не отпускание) ? Странно, ибо у меня возникает как при спадании, так и наростании. Оставлял только бит в FTSR (или как его) - все ровно дважды генерируется.
|
|
|
Сказали "Спасибо" DarkEN_ANGEL
|
|
|
19.08.2011, 22:12
|
|
Временная регистрация
Регистрация: 29.01.2011
Адрес: Украина, Киев-Ялта
Сообщений: 12
Сказал спасибо: 1
Сказали Спасибо 8 раз(а) в 7 сообщении(ях)
|
Re: stm32 + xpt2046(аналог ads7846)
Цитата:
|
Оставлял только бит в FTSR (или как его) - все ровно дважды генерируется.
|
Этот глюк у меня тоже был. Пофиксил его тем, что выключил подтяжку вверх на входе прерывания от тачскрина (PENIRQ).
|
|
|
Эти 2 пользователя(ей) сказали Спасибо Solomiichuk за это сообщение:
|
|
|
21.08.2011, 14:48
|
|
Временная регистрация
Регистрация: 29.01.2011
Адрес: Украина, Киев-Ялта
Сообщений: 12
Сказал спасибо: 1
Сказали Спасибо 8 раз(а) в 7 сообщении(ях)
|
Re: stm32 + xpt2046(аналог ads7846)
Пытаюсь читать данные АЦП. Получаются, чуть ли не случайные значения.
Скиньте в личку свой e-mail - пришлю весь проект.
|
|
|
Сказали "Спасибо" Solomiichuk
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 22:52.
|
|