| Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
stm32 + xpt2046 (аналог ads7846)
02.09.2011, 20:10
|
|
|
Частый гость
Регистрация: 01.08.2011
Адрес: Украина, Киев
Сообщений: 24
Сказал спасибо: 4
Сказали Спасибо 10 раз(а) в 9 сообщении(ях)
|
Re: stm32 + xpt2046 (аналог ads7846)
Solomiichuk, а я ведь заставил нормально его работать! =) И таки с помощью софтварного SPI.
Вот драйвер. Пины не менял, т.е. если у Вас тач на SPI1 то менять ничего не придётся. Кстати, spin_m(), cpin_m(), pinOutPP_b() и иже с ним можете не убирать - объявления этих макросов есть в xpt2046exp.h
Как проверите - напишите.
|
|
|
|
04.09.2011, 18:37
|
|
|
Временная регистрация
Регистрация: 29.01.2011
Адрес: Украина, Киев-Ялта
Сообщений: 12
Сказал спасибо: 1
Сказали Спасибо 8 раз(а) в 7 сообщении(ях)
|
Re: stm32 + xpt2046 (аналог ads7846)
Попробовал. Значения получаются более вменяемые, чем при аппаратном SPI, но все-равно далеки от истины. Буду править и пробовать.
Прислать Вам мой проект?
|
|
|
|
05.09.2011, 10:45
|
|
|
Частый гость
Регистрация: 01.08.2011
Адрес: Украина, Киев
Сообщений: 24
Сказал спасибо: 4
Сказали Спасибо 10 раз(а) в 9 сообщении(ях)
|
Re: stm32 + xpt2046 (аналог ads7846)
Сообщение от Solomiichuk
|
Попробовал. Значения получаются более вменяемые, чем при аппаратном SPI, но все-равно далеки от истины. Буду править и пробовать.
Прислать Вам мой проект?
|
В смысле далеки от истины?
А смысл присылать, если там мой код? ))
Хотя если как-то улучшите - присылайте.
Кстати, вот тут
|
Код:
|
.....
x = ((a‹‹4)|(b››4)); //12bit: ((a‹‹4)|(b››4)) //10bit: ((a‹‹2)|(b››6))
.....
y = ((a‹‹4)|(b››4)); //12bit: ((a‹‹4)|(b››4)) //10bit: ((a‹‹2)|(b››6)) |
правильнее было бы заменить на
|
Код:
|
.....
int16_t tmpX = a ‹‹ 8;
tmpX |= b;
tmpX ››= 3;
tmpX &= 0xfff;
x += tmpX;
.....
int16_t tmpY = a ‹‹ 8;
tmpY |= b;
tmpY ››= 3;
tmpY &= 0xfff;
y += tmpY; |
Есстественнно достаточно одного tmp, и объявить его где-то вначале...
Последний раз редактировалось DarkEN_ANGEL; 07.09.2011 в 21:11.
|
|
|
|
02.10.2011, 21:43
|
|
|
Временная регистрация
Регистрация: 29.01.2011
Адрес: Украина, Киев-Ялта
Сообщений: 12
Сказал спасибо: 1
Сказали Спасибо 8 раз(а) в 7 сообщении(ях)
|
Re: stm32 + xpt2046 (аналог ads7846)
Вроде, я на конец-то победил этот тачскрин. 
Оказалось, что ему мешала висящая на том же SPI
микросхема AT45DB321. Кроме того, аппаратный
SPI контроллера STM32 таки слишком быстрый для
работы с xpt2046.
Вот код:
|
Цитата:
|
static void TouchScreen_SPI_WR(u8 cmd)
{
u8 i, mask ;
for(mask=0x80; mask!=0; mask››=1)
{
for( i = 0; i ‹ 50; i++ ); /* 200ns */
TouchScreen_Clr_SCK; /* SCK \ */
if (cmd & mask) TouchScreen_Set_MOSI /* MOSI =1 */
else TouchScreen_Clr_MOSI; /* MOSI =0 */
for( i = 0; i ‹ 50; i++ ); /* 200ns */
TouchScreen_Set_SCK; /* SCK / */
}
for( i = 0; i ‹ 50; i++ ); /* 200ns */
TouchScreen_Clr_SCK; /* SCK \ */
}
static u16 TouchScreen_SPI_RD(void)
{
u16 buf ;
u8 i, j ;
buf=0;
for( i = 0; i ‹ 12; i++ )
{
buf = buf ‹‹ 1 ;
TouchScreen_Set_SCK; /* SCK / */
for( j = 0; j ‹ 50; j++ ); //200ns
TouchScreen_Clr_SCK; /* SCK \ */
for( j = 0; j ‹ 50; j++ ); //200ns
if ( TouchScreen_MISO_GPIO-›IDR & TouchScreen_MISO_PIN_IDR )
{
buf = buf + 1 ;
}
for( j = 0; j ‹ 50; j++ ); //200ns
}
return( buf ) ;
}
static void TouchScreen_Read_XY(int *X_Addata,int *Y_Addata)
{
u16 i, j, x_addata=0, y_addata=0;
char *c[5];
char d[5];
for(i=8;i›0;i--)
{
TouchScreen_SPI_WR( xpt2046_X ) ;
for( j = 0; j ‹ 50; j++ ); //200ns
y_addata += TouchScreen_SPI_RD() ;
for( j = 0; j ‹ 50; j++ ); //200ns
TouchScreen_SPI_WR( xpt2046_Y ) ;
for( j = 0; j ‹ 50; j++ ); //200ns
x_addata += TouchScreen_SPI_RD() ;
for( j = 0; j ‹ 50; j++ ); //200ns
}
x_addata››=4;
y_addata››=4; //AVG.
sprintf(d,"X=%x",x_addata);
*c=d;
LCD_WriteString_5x7(23, 120, *c, BLACK, RED, 0, 4 );
sprintf(d,"Y=%x",y_addata);
*c=d;
LCD_WriteString_5x7(23, 70, *c, BLACK, RED, 0, 4 );
/**X_Addata=x_addata;
*Y_Addata=y_addata; */
}
extern "C"
__irq void EXTI15_10_IRQHandler()
{
if (EXTI-›PR & TouchScreen_IRQ_PIN_PR)
{
int *X, *Y;
TouchScreen_Read_XY (X,Y);
EXTI-›PR |= TouchScreen_IRQ_PIN_PR;
}
}
|
Значения теперь получаются более вменяемыми. Остается написание медианного фильтра значений и процедуры калибровки.
Последний раз редактировалось Solomiichuk; 02.10.2011 в 21:50.
|
|
|
|
Сказали "Спасибо" Solomiichuk
|
|
|
03.10.2011, 11:39
|
|
|
Частый гость
Регистрация: 01.08.2011
Адрес: Украина, Киев
Сообщений: 24
Сказал спасибо: 4
Сказали Спасибо 10 раз(а) в 9 сообщении(ях)
|
Re: stm32 + xpt2046 (аналог ads7846)
Сообщение от Solomiichuk
|
|
Вроде, я на конец-то победил этот тачскрин.
|
Я Вас поздравляю!
Вечером приду домой - опробую Ваш код.
Сообщение от Solomiichuk
|
Кроме того, аппаратный
SPI контроллера STM32 таки слишком быстрый для
работы с xpt2046.
|
Есть размышления по поводу деления частоты, приходящей на SPI1, с помощью настройки APB2 Prescaler (регистр RCC-›CFGR, PPRE2, биты 13-11).
Поставил дивайдер на 4 (72/4 = 18 мГц на входе spi1, делитель самой spi 256, соотв. 70 кГц), но результата почему-то нету...
Может быть Вы попробуете этот способ?
Последний раз редактировалось DarkEN_ANGEL; 03.10.2011 в 12:45.
|
|
|
|
09.10.2011, 17:54
|
|
|
Временная регистрация
Регистрация: 29.01.2011
Адрес: Украина, Киев-Ялта
Сообщений: 12
Сказал спасибо: 1
Сказали Спасибо 8 раз(а) в 7 сообщении(ях)
|
Re: stm32 + xpt2046 (аналог ads7846)
|
Цитата:
|
|
Может быть Вы попробуете этот способ?
|
В первоначальном варианте моей схемы отладочной платы на SPI1 висели тачскрин, microSD и AT45DB321. Сейчас тачскрин я выбросил на GPIO. Думаю, так оно будет более правильно: самое медленное устройство ушло в сад, дабы не мешать двум быстрым собратьям.
Но отладочных плат у меня сейчас две : одна с описанной доработкой, вторая - без нее. Поэтому на днях могу проверить ради эксперимента Ваш метод, хотя и вряд ли остановлюсь на нем как на окончательном варианте.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 18:45.
|
|