Устал уже биться с такой простой вещью (мне так казалось) как контроллер тач скрина 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);
}
}
}
#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 (конденсаторы только не ставил).
Какие есть идеи - почему может не работать? У меня уже иссякли идеи... :/