//====================================================================================
static void WR_CMD (unsigned char cmd) 
{
    unsigned char buf;
    unsigned char i;
    TP_CS(1);
    TP_DIN(0);
    TP_DCLK(0);
    TP_CS(0);
    for(i=0;i<8;i++) 
    {
        buf=(cmd>>(7-i))&0x1;
        TP_DIN(buf);
        Delayus(5);
        TP_DCLK(1);
        Delayus(5);
        TP_DCLK(0);
    }
}
/*
*********************************************************************************************************
*	函 数 名: XPT2046_WriteCMD
*	功能说明: 写命令
*	形    参:CHX 	0x90 	//通道Y+的选择控制字 CHY 	0xd0	//通道X+的选择控制字
*	返 回 值: 无
*********************************************************************************************************
*/
static void XPT2046_WriteCMD(unsigned char cmd) 
{
    unsigned char buf;
    unsigned char i;
//     TP_CS(1);
    TP_DIN(0);
    TP_DCLK(0);
//     TP_CS(0);
    for(i=0;i<8;i++) 
    {
        buf=(cmd>>(7-i))&0x1;
        TP_DIN(buf);
        //Delayus(5);
      DelayUS(5);
        TP_DCLK(1);
        //Delayus(5);
      DelayUS(5);
        TP_DCLK(0);
    }
}
static unsigned short XPT2046_ReadCMD(void) 
{
    unsigned short buf=0,temp;
    unsigned char i;
    TP_DIN(0);
    TP_DCLK(1);
    for(i=0;i<12;i++) 
    {
        TP_DCLK(0);          
        temp= (TP_DOUT) ? 1:0;
        buf|=(temp<<(11-i));
        TP_DCLK(1);
    }
    buf&=0x0fff;

    return(buf);
}
//====================================================================================
void TSC_Init(void)
{
	/* Enable SPI1 and GPIO clocks */
	RCC->AHB1ENR    |=((1UL <<  0) |      /* Enable GPIOA clock                 */
	                 (1UL <<  1) |      /* Enable GPIOB clock                 */
	                 (1UL <<  2));      /* Enable GPIOC clock                 */

	//PA.15 as CS OUTPUT
	GPIOA->MODER    &= ~0xC0000000;       /* Clear Bits                         */
	GPIOA->MODER    |=  0x40000000;       /* Alternate Function mode            */
	GPIOA->OSPEEDR  &= ~0xC0000000;       /* Clear Bits                         */
	GPIOA->OSPEEDR  |=  0x80000000;       /* 50 MHz Fast speed                  */
	GPIOA->AFR[0]   &= ~0x00000000;       /* Clear Bits                         */
	GPIOA->AFR[0]   |=  0x00000000;       /* Alternate Function mode AF12       */
	GPIOA->AFR[1]   &= ~0xF0000000;       /* Clear Bits                         */
	GPIOA->AFR[1]   |=  0x00000000;       /* Alternate Function mode AF12       */

	//PB.15 as IRQ[I], PB.04 as SCK[O], PB.05 as MISO[I], PB.01 as MOSI[O]
	GPIOB->MODER    &= ~0xC0000F0C;       /* Clear Bits                         */
	GPIOB->MODER    |=  0x00000104;       /* Alternate Function mode            */
	GPIOB->OSPEEDR  &= ~0xC0000F0C;       /* Clear Bits                         */
	GPIOB->OSPEEDR  |=  0x80000A08;       /* 50 MHz Fast speed                  */
	GPIOB->AFR[0]   &= ~0x00FF00F0;       /* Clear Bits                         */
	GPIOB->AFR[0]   |=  0x00000000;       /* Alternate Function mode AF12       */
	GPIOB->AFR[1]   &= ~0xF0000000;       /* Clear Bits                         */
	GPIOB->AFR[1]   |=  0x00000000;       /* Alternate Function mode AF12       */

	//PC.2 as BUSY[I]
	GPIOC->MODER    &= ~0x00000030;       /* Clear Bits                         */
	GPIOC->MODER    |=  0x00000000;       /* Alternate Function mode            */
	GPIOC->OSPEEDR  &= ~0x00000030;       /* Clear Bits                         */
	GPIOC->OSPEEDR  |=  0x00000020;       /* 50 MHz Fast speed                  */
	GPIOC->AFR[0]   &= ~0x00000F00;       /* Clear Bits                         */
	GPIOC->AFR[0]   |=  0x00000000;       /* Alternate Function mode AF12       */
	GPIOC->AFR[1]   &= ~0x00000000;       /* Clear Bits                         */
	GPIOC->AFR[1]   |=  0x00000000;       /* Alternate Function mode AF12       */

	TP_CS(1);
	TP_DCLK(0);
	TP_DIN(0);
}
//====================================================================================
static unsigned short RD_AD(void) 
{
    unsigned short buf=0,temp;
    unsigned char i;
    TP_DIN(0);
    TP_DCLK(1);
    for(i=0;i<12;i++) 
    {
        Delayus(5);
        TP_DCLK(0);         
        Delayus(5);   
        temp= (TP_DOUT) ? 1:0;
        buf|=(temp<<(11-i));
        
        Delayus(5);
        TP_DCLK(1);
    }
    TP_CS(1);
    buf&=0x0fff;
    return(buf);
}