源码修改自:
http://aiothome.net/read.php?tid-13182.html复制代码- #define GPH1CON (*(volatile unsigned long *)0xE0200C20)
- #define GPH1DAT (*(volatile unsigned long *)0xE0200C24)
- #define PWMTIMER_BASE (0xE2500000)
- #define TCFG0 ( *((volatile unsigned long *)(PWMTIMER_BASE+0x00)) )
- #define TCFG1 ( *((volatile unsigned long *)(PWMTIMER_BASE+0x04)) )
- #define TCON ( *((volatile unsigned long *)(PWMTIMER_BASE+0x08)) )
- #define TCNTB0 ( *((volatile unsigned long *)(PWMTIMER_BASE+0x0C)) )
- #define TCMPB0 ( *((volatile unsigned long *)(PWMTIMER_BASE+0x10)) )
- #define TCNTO0 ( *((volatile unsigned long *)(PWMTIMER_BASE+0x14)) )
- #define TCNTB1 ( *((volatile unsigned long *)(PWMTIMER_BASE+0x18)) )
- #define TCMPB1 ( *((volatile unsigned long *)(PWMTIMER_BASE+0x1C)) )
- #define TCNTO1 ( *((volatile unsigned long *)(PWMTIMER_BASE+0x20)) )
- #define TCNTB2 ( *((volatile unsigned long *)(PWMTIMER_BASE+0x24)) )
- #define TCMPB2 ( *((volatile unsigned long *)(PWMTIMER_BASE+0x28)) )
- #define TCNTO2 ( *((volatile unsigned long *)(PWMTIMER_BASE+0x2C)) )
- #define TCNTB3 ( *((volatile unsigned long *)(PWMTIMER_BASE+0x30)) )
- #define TCMPB3 ( *((volatile unsigned long *)(PWMTIMER_BASE+0x34)) )
- #define TCNTO3 ( *((volatile unsigned long *)(PWMTIMER_BASE+0x38)) )
- #define TCNTB4 ( *((volatile unsigned long *)(PWMTIMER_BASE+0x3C)) )
- #define TCNTO4 ( *((volatile unsigned long *)(PWMTIMER_BASE+0x40)) )
- #define TINT_CSTAT ( *((volatile unsigned long *)(PWMTIMER_BASE+0x44)) )
- #define REQ_TS 0x40U
- #define REQ_INFO 0x60U
- typedef struct
- {
- unsigned short x; //x坐标
- unsigned short y; //y坐标
- }TS_RET;
- TS_RET TS_points;
- static void set_pin_as_input(void)
- {
- GPH1CON &= ~ (3<<8);
- }
- static void set_pin_as_output(void)
- {
- GPH1CON &= ~ (3<<8);
- GPH1CON |= 1<<8;
- }
- static void set_pin_value(int v)
- {
- if (v) {
- GPH1DAT |= 1<<2;
- } else {
- GPH1DAT &= ~(1<<2);
- }
- }
- static int get_pin_value(void)
- {
- if(GPH1DAT & (1<<2))
- return 1;
- else
- return 0;
- }
- static void InitTimer(void)
- {
- TCFG0 &= ~0xf0;
- TCFG0 |= 65<<8;
- TCFG1 &= ~(0xf<<12);
- TCNTB3 = 104;
- TCMPB3 = 104;
- TCON |= 1<<17;
- TCON &= ~(1<<17);
- TCON &= ~(0x1f<<16);
- TCON |= (1<<19);
- TINT_CSTAT |= 1<<3;
- }
- static void StartTimer(void)
- {
-
- TCON |= (1<<16);
- }
- static void StopTimer(void)
- {
- TCON &= ~(1<<16);/* 停止定时器3 */
- }
- static void WaitTimerTick(void)
- {
- while ((TINT_CSTAT & (1U << 8)) == 0) ;
- TINT_CSTAT |= 1<<8;
- }
- static unsigned char crc8(unsigned v, unsigned len);
- static int OneWireSession(unsigned char req, unsigned char res[])
- {
- unsigned Req;
- unsigned *Res;
- unsigned int i;
- Req = (req << 24) | (crc8(req << 24, 8) << 16);
- Res = (unsigned *)res;
- set_pin_value(1);
- set_pin_as_output();
- StartTimer();
- for (i = 0; i < 60; i++) {
- WaitTimerTick();
- }
- set_pin_value(0);
- for (i = 0; i < 2; i++) {
- WaitTimerTick();
- }
- for (i = 0; i < 16; i++) {
- int v = !!(Req & (1U << 31));
- Req <<= 1;
- set_pin_value(v);
- WaitTimerTick();
- }
- WaitTimerTick();
- set_pin_as_input();
- WaitTimerTick();
- for (i = 0; i < 32; i++) {
- (*Res) <<= 1;
- (*Res) |= get_pin_value();
- WaitTimerTick();
- }
- StopTimer();
- set_pin_value(1);
- set_pin_as_output();
- return crc8(*Res, 24) == res[0];
- }
- static int TryOneWireSession(unsigned char req, unsigned char res[])
- {
- int i;
- for (i = 0; i < 3; i++) {
- if (OneWireSession(req, res)) {
- return 1;
- }
- }
- return 0;
- }
- void InitOneWire(void)
- {
- InitTimer();
- }
- int GetInfo(unsigned char *Lcd, unsigned short *FirmwareVer)
- {
- unsigned char res[4];
- if (!TryOneWireSession(REQ_INFO, res)) {
- return 0;
- }
- *Lcd = res[3];
- *FirmwareVer = res[2] * 100 + res[1];
- return 1;
- }
- int SetBacklightOfLCD(unsigned Brightness)
- {
- unsigned char res[4];
- int ret;
- if (Brightness > 127) {
- Brightness = 127;
- }
- ret = TryOneWireSession(Brightness | 0x80U, res);
- return ret;
- }
- static unsigned char crc8(unsigned v, unsigned len)
- {
- unsigned char crc = 0xACU;
- while (len--) {
- if ((crc & 0x80U) != 0) {
- crc <<= 1;
- crc ^= 0x7U;
- } else {
- crc <<= 1;
- }
- if ((v & (1U << 31)) != 0) {
- crc ^= 0x7U;
- }
- v <<= 1;
- }
- return crc;
- }
- void ARM1Wire_SET_Backlight(unsigned Brightness)
- {
- //InitOneWire();
- SetBacklightOfLCD(Brightness);
- }
- #define level ((3770-317)/(480))
- #define vertical ((3839-192)/(272))
- int ARM1Wire_GET_XY(int *x,int *y)
- {
- int ret;
- unsigned char res[4];
- unsigned short x1,y1;
- //unsigned char pressed;
- //unsigned int ts_status;
-
- ret = TryOneWireSession(0x40U, res);
- y1 = ((res[3] >> 4U) << 8U) + res[2];
- x1 = ((res[3] & 0xFU) << 8U) + res[1];
-
- //pressed = (x != 0xFFFU) && (y != 0xFFFU);
- *x= x1;//((x1-200)*480/(3880-200));
- *y= y1;//((3772-y1)*272/(3772-324));
- //ts_status=((x1 << 16) | (y1)) | (pressed << 31);
- return ret;
- }
|
InitOneWire(); // 初始化timer3
ARM1Wire_SET_Backlight(10) ; // 屏幕变暗了,证明通信没问题
ARM1Wire_GET_XY(&x,&y); // 但读出的XY总是0xFFF
求教高手如何解决
[ 此帖被wenwu2013在2013-02-03 11:18重新编辑 ]