| Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
stm32 + xpt2046 (аналог ads7846)
21.08.2011, 18:04
|
|
|
Частый гость
Регистрация: 01.08.2011
Адрес: Украина, Киев
Сообщений: 24
Сказал спасибо: 4
Сказали Спасибо 10 раз(а) в 9 сообщении(ях)
|
Re: stm32 + xpt2046 (аналог ads7846)
Принял проект.
Вот же совпадение - у меня тоже HY32D дисплейчик =)
После беглого просмотра:
1. В настройках SPI Вы устанавливаете 16тибитный режим передачи, коего ни ads78**, ни даже наш китаец xpt2046 не поддерживал никогда в жизни.
2. Отправку данных в контроллер и приём лучше разделить на 2 отдельных функции.
3. Зачем в TP_SPI_RW() производить сдвиг LSB вправо аж на 12?
Всё же попробуйте моё чтение - всего то и нужно три функции в проект скопировать (SPI_WR(), SPI_RD() и ReadADS7846(), последнюю немного подправить)
ОФФТОП:
1. Если у вас 100ногий stm32, то лучше для управления дисплеем заюзать FSMC - он быстрее. Могу дать код если надо
2. Чем делали шрифты для LCD? =)
Последний раз редактировалось DarkEN_ANGEL; 21.08.2011 в 20:06.
|
|
|
|
21.08.2011, 20:34
|
|
|
Временная регистрация
Регистрация: 29.01.2011
Адрес: Украина, Киев-Ялта
Сообщений: 12
Сказал спасибо: 1
Сказали Спасибо 8 раз(а) в 7 сообщении(ях)
|
Re: stm32 + xpt2046 (аналог ads7846)
Опробовал Ваш код: все заработало. Обе координаты читаются, хотя и с большим разбросом. Дальше дело за написанием процедуры калибровки.
Для начала буду курить вот этот мануал : ТЫЦ
|
|
|
|
21.08.2011, 21:05
|
|
|
Частый гость
Регистрация: 01.08.2011
Адрес: Украина, Киев
Сообщений: 24
Сказал спасибо: 4
Сказали Спасибо 10 раз(а) в 9 сообщении(ях)
|
Re: stm32 + xpt2046 (аналог ads7846)
Сообщение от Solomiichuk
|
|
Опробовал Ваш код: все заработало. Обе координаты читаются, хотя и с большим разбросом.
|
В каком смысле с большим разбросом?
У меня при такой расстановке задержек читается нормально только первая ось, вторая - всегда 256... Настройки SPI не меняли?
Скиньте мне на мыло ваш проект ещё раз...
|
|
|
|
21.08.2011, 21:33
|
|
|
Временная регистрация
Регистрация: 29.01.2011
Адрес: Украина, Киев-Ялта
Сообщений: 12
Сказал спасибо: 1
Сказали Спасибо 8 раз(а) в 7 сообщении(ях)
|
Re: stm32 + xpt2046 (аналог ads7846)
|
Цитата:
|
|
В каком смысле с большим разбросом?
|
Даже закономерность поймать не могу. Попробуйте запустить мой проект - все увидите. Сам проект ушел в мыло.
|
Цитата:
|
|
Если у вас 100ногий stm32, то лучше для управления дисплеем заюзать FSMC - он быстрее.
|
Мое устройство на основе контроллера STM32F107VCT6. У него нет FSMC.
|
Цитата:
|
|
Чем делали шрифты для LCD? =)
|
Шрифт 5х7 делал вручную, 8х16 стянул с сайта ST.
|
|
|
|
21.08.2011, 22:58
|
|
|
Частый гость
Регистрация: 01.08.2011
Адрес: Украина, Киев
Сообщений: 24
Сказал спасибо: 4
Сказали Спасибо 10 раз(а) в 9 сообщении(ях)
|
Re: stm32 + xpt2046 (аналог ads7846)
Сообщение от Solomiichuk
|
|
Даже закономерность поймать не могу.
|
Закономерность, как мне кажется, в задержках.
Попробуйте поменять задержку в функции SPI_RD с одной микросекунды на 2 и посмотреть как его заколбасит что будет.
Кстати на изиэлектроникс человек посоветовал делать по 10 замеров обоих координат за раз, затем отбрасывать 2 максимальных и 2 минимальных значения, а из оставшихся шести подсчитывать среднее арифметическое.
Последний раз редактировалось DarkEN_ANGEL; 21.08.2011 в 23:03.
|
|
|
|
22.08.2011, 20:56
|
|
|
Частый гость
Регистрация: 01.08.2011
Адрес: Украина, Киев
Сообщений: 24
Сказал спасибо: 4
Сказали Спасибо 10 раз(а) в 9 сообщении(ях)
|
Re: stm32 + xpt2046 (аналог ads7846)
Solomiichuk, ну как успехи? Не пробовали с задержками играться?
Кстати, вот кое как набросал сортировку координат, но проверить не имею возможности пока. Не могли бы Вы проверить?
|
Код:
|
void Sort (uint16_t *mas)
{
unsigned char i,j;
unsigned k;
for(i=1; i‹10; i++)
for(j=0; j‹9; j++)
if(mas[i] › mas[j])
{
k=mas[i];
mas[i]=mas[j];
mas[j]=k;
}
}
void ReadADS7846(uint16_t *X, uint16_t *Y)
{
uint8_t a, b, i;
uint16_t dataX[10], dataY[10], pressure;
uint16_t kX, kY;
// ïîëó÷åíèå äàâëåíèÿÿ íà ýêðàí
cpin_m(TP_SPIPORT, TP_CS_MASK);
DelayUS(5);
SPI_WR(CMD_START | CMD_8BIT | CMD_DIFF | CMD_Z1_POS);
//while (GetBUSY() != DISABLE)
{ }
a = SPI_RD(0x00);
SPI_WR(CMD_START | CMD_8BIT | CMD_DIFF | CMD_Z2_POS);
//while (GetBUSY() != DISABLE)
{ }
b = SPI_RD(0x00);
spin_m(TP_SPIPORT, TP_CS_MASK);
pressure = a + b;
// åñëè ñèëà íàæàòèÿ äîñòàòî÷íà òî íà÷èíàåì èçìåðÿòü êîîðäèíàòû íàæàòèÿ
if(pressure ›= MIN_PRESSURE)
{
for(i = 0; i != 10; i++)
{
cpin_m(TP_SPIPORT, TP_CS_MASK);
// ÷òåíèå X
SPI_WR(CMD_START | CMD_12BIT | CMD_DIFF | CMD_X_POS);
//while (GetBUSY() != DISABLE)
{ }
a = SPI_RD(0x00);
//DelayUS(1);
b = SPI_RD(0x00);
dataX[i] = (((a‹‹4)|(b››4)) ›› 4);
// ÷òåíèå Y
DelayUS(1);
SPI_WR(CMD_START | CMD_12BIT | CMD_DIFF | CMD_Y_POS);
//while (GetBUSY() != DISABLE)
{ }
a = SPI_RD(0x00);
//DelayUS(1);
b = SPI_RD(0x00);
dataY[i] = (((a‹‹4)|(b››4)) ›› 4);
spin_m(TP_SPIPORT, TP_CS_MASK);
}
// ñîðòèðîâêà
Sort(dataX);
Sort(dataY);
for (i=2; i!=8; i++)
{
kX += dataX[i];
kY += dataY[i];
}
kX /= 6;
kY /= 6;
*X = kX;
*Y = kY;
}
#ifdef debug
char str[64];
sprintf(str, "PRESSURE = %i ", pressure);
GUI_Text(10, 32, str, Yellow, Black);
sprintf(str, "X = %i ", kX);
GUI_Text(10, 50, str, Yellow, Black);
sprintf(str, "Y = %i ", kY);
GUI_Text(10, 66, str, Yellow, Black);
//sprintf(str, "aY = %i, bY = %i ", a, b);
//GUI_Text(10, 82, str, Red, Black);
#endif
} |
Последний раз редактировалось DarkEN_ANGEL; 22.08.2011 в 20:59.
|
|
|
|
23.08.2011, 18:19
|
|
|
Временная регистрация
Регистрация: 29.01.2011
Адрес: Украина, Киев-Ялта
Сообщений: 12
Сказал спасибо: 1
Сказали Спасибо 8 раз(а) в 7 сообщении(ях)
|
Re: stm32 + xpt2046 (аналог ads7846)
Попробовал Ваш код с сортировкой: тоже сшибка нервных процессов.
Заметил, что ось Y дает постоянно 2 одинаковых значения, где бы не тыкалось в экран, и использую ли я код с сортировкой, или без нее.
Ось Х бредит без закономерности...
|
|
|
|
26.08.2011, 20:21
|
|
|
Частый гость
Регистрация: 01.08.2011
Адрес: Украина, Киев
Сообщений: 24
Сказал спасибо: 4
Сказали Спасибо 10 раз(а) в 9 сообщении(ях)
|
Re: stm32 + xpt2046 (аналог ads7846)
Ну что, изменений нет?
Я пока не занимался этим - работа... Завтра уже займусь.
Планирую попробовать сделать софтварный SPI, который работал бы на частоте где-то 10-20 кГц (в отличии от hardware SPI, 281 кГц минимум) - вот тогда по идее будет гуд...
Последний раз редактировалось DarkEN_ANGEL; 27.08.2011 в 12:37.
|
|
|
|
01.09.2011, 17:16
|
|
|
Временная регистрация
Регистрация: 29.01.2011
Адрес: Украина, Киев-Ялта
Сообщений: 12
Сказал спасибо: 1
Сказали Спасибо 8 раз(а) в 7 сообщении(ях)
|
Re: stm32 + xpt2046 (аналог ads7846)
Я тоже был занят другими делами. Завтра -послезавтра планирую вернуться к этой теме.
Как успехи у Вас?
|
|
|
|
02.09.2011, 13:04
|
|
|
Частый гость
Регистрация: 01.08.2011
Адрес: Украина, Киев
Сообщений: 24
Сказал спасибо: 4
Сказали Спасибо 10 раз(а) в 9 сообщении(ях)
|
Re: stm32 + xpt2046 (аналог ads7846)
Сообщение от Solomiichuk
|
Я тоже был занят другими делами. Завтра -послезавтра планирую вернуться к этой теме.
Как успехи у Вас?
|
У меня практически полная переделка прошивки устройства, плюс начал делать софтвэрный SPI для тача. Попробую рассчитать задержки так, чтобы DCLK дёргался с частотой где-то 15-20 кГц (при хардварном - 281 кГц минимум)
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 19:38.
|
|