Всем привет.
Устал уже биться с такой простой вещью (мне так казалось) как контроллер тач скрина XPT2016.
Все вроде просто, в инете есть разные примеры, но у меня так и не получилось завести контроллер.
В итоге за основу взял исходники UTouch (http://www.rinkydinkelectronics.com/library.php?id=55), взял из них все основное и у меня получился следующий код:
CODE
#define F_CPU 8000000
#define MEGA32
#include <avr/io.h>
#include <util/delay.h>

#define PinUp(PORTX, PIN) PORTX |= (1<<PIN); asm ("nop");
#define PinsUp(PORTX, PINS) PORTX |= PINS; asm ("nop");
#define PinDown(PORTX, PIN) PORTX &= ~(1<<PIN); asm ("nop");
#define CheckPin(PINX, PIN) (PINX & (1<<PIN))

void Nop3(){
asm volatile ("nop");
asm volatile ("nop");
asm volatile ("nop");
}

void PulseCLK(){
//ePins lCLK = Pin7;

Nop3();
PinUp(PORTB, 7);
Nop3();
PinDown(PORTB, 7);
Nop3();
}


void WriteData(uint8_t data) {
//ePins lMOSI = Pin5;
//ePins lCLK = Pin7;
uint8_t temp;

temp=data;
PinDown(PORTB, 7);

for(uint8_t count=0; count<8; count++) {
if(temp & 0x80){
PinUp(PORTB, 5);
}
else {
PinDown(PORTB, 5);
}

temp = temp << 1;
PinDown(PORTB, 7);
Nop3();
PinUp(PORTB, 7);
}
}

uint16_t ReadData() {
//ePins lMISO = Pin6;
//ePins lCLK = Pin7;
//ePins lCS = Pin4;
uint16_t data = 0;

for(uint8_t count=0; count<12; count++) {
data <<= 1;
PinUp(PORTB, 7);
Nop3();
PinDown(PORTB, 7);
if (CheckPin(PORTB, 6))
data++;
}
return(data);
}



int main(void){
//PortStruct lSPIPort(&PORTB, &DDRB, &PINB);
//ePins lMISO = Pin6;
//ePins lMOSI = Pin5;
//ePins lCLK = Pin7;
//ePins lCS = Pin4;
//ePins lIRQ = Pin0;



PinsUp(DDRB, _BV(5) + _BV(7) + _BV(4));
PinDown(DDRB, 6);

uint8_t touch_x;
uint16_t x;


while (true){

_delay_ms(50);
if (!CheckPin(PINA, 0)){

PinDown(PORTB, 4);

touch_x = 0x90;
WriteData(touch_x);
PulseCLK();
x = ReadData();
touch_x = uint8_t(x);

//touch_x всегда 0 или 255 в зависимости от инициализации MISO
PinUp(PORTB, 4);
}
}
}


Но и он у меня ничего хорошего не дает. Вроде все нормально. Протеус показывается, что SPI передает нормальный код. Но в ответ всегда приходит либо 0, либо 255 (если включить подтягивающий резистор к MISO).
Сам тач, проверял - отлично работает (сопротивление между + и - есть, замыкание между X и Y при нажатии есть), прерывание при нажатии срабатывает.
Контроллер подключил по следующей схеме - http://res.tech.ifeng.com/dci_2011/0419/or...acf1b6150cf.gif (конденсаторы только не ставил).

Какие есть идеи - почему может не работать? У меня уже иссякли идеи... :/