ADS7846

ipqiqplxx   2009-8-14 11:14 楼主
小弟在写一个触摸屏驱动,在ADS上调试遇到了一些问题。
#define X_LOCATION_CMD  0xd0
#define Y_LOCATION_CMD  0x90
……………………省略若干……………………………………
/******************************************************************
*函数名:TpInit
*入口参数:无
*返回参数:无
*函数功能:初始化touchpad
*******************************************************************/
void TpInit(void)
{        mask_irq(INTSRC_EXINT8);
        s_tp_openflag = 1;
    zpix = 4;//4 means up
    xpix = 0;
    ypix = 0;
    s_pen_status  = PEN_UP;  
   
   
   
        *(RP)GPIO_PORTA_SEL |= 0x100;
        *(RP)GPIO_PORTA_DIR |= 0x100;  //        EXINT8
        *(RP)GPIO_PORTA_INCTL |= 0x100;                         
        *(RP)GPIO_PORTA_INTRCTL |= 0x30000;                 
    *(RP)GPIO_PORTA_INTRCLR |= 0x100;  // pull up               
           *(RP)GPIO_PORTA_INTRCLR &= 0x0;   // down
           // 中断设置,初始化中断
    *(RP)GPIO_PORTD_SEL        |= 0x1<<3;           //portD3设置为通用(普通io)
    *(RP)GPIO_PORTD_DIR  &= ~(0x1<<3);        // portD3(SSI_CS1) 输出
   
    //设置CS线
   
    *(RP)SSI_SSIENR = 0x0; //设置前紧禁止能SSI
   
    *(RP)SSI_CONTROL0 = 0x7;  //SPI协议,数据帧长度为16,停止位为低电平
    *(RP)SSI_CONTROL1 = 0x00; //数据帧数量为1
//    *(RP)SSI_MWCR          = 0x4;  
    *(RP)SSI_BAUDR  = 0x10; //设置波特率
    *(RP)SSI_TXFTLR = 0x1;  //发送阈值为1
    *(RP)SSI_RXFTLR = 0x1;  //接受阈值为1
    *(RP)SSI_IMR        = 0x1f; //  不屏蔽中断
//    *(RP)SSI_IMR        = 0x0;  //屏蔽中断
    *(RP)SSI_DMACR  =0x0;//未使能DMA
    *(RP)SSI_DR =0x0;
   
   
   
    *(RP)SSI_SSIENR = 0x1; //设置完使能ssi
   irq_enable(INTSRC_EXINT8);     
   unmask_irq(INTSRC_EXINT8);  
   return ;

}
/******************************************************************
*函数名:SendCommand
*入口参数:ADCommand
*返回参数:data
*函数功能:向ADS7846输入命令,获返回位置参数
*******************************************************************/

static unsigned short  SendCommand  (U8 ADCommand)
{
        U8 data;
        U16 value;
        CSL(); //使能ADS 7846
        *(RP)SSI_SSIENR =0x1; //使能SSI
        *(RP)SSI_SER =0x2;    //使能从设备,开始传输命令
        *(RP)SSI_DR=ADCommand;
        while (*(RP)SSI_SR & 0x1) {printf("waiting \n");}//等待传输完毕
        value=*(RP)SSI_DR;
        value=value<<4;
        data=*(RP)SSI_DR;
        data=data>>4;
        value+=data;
        *(RP)SSI_SER =0x0;     //禁止从设备         
        *(RP)SSI_SSIENR =0x0;   //禁止SSI
        CSH();
        return value;
}
       

static void Readxy(void)
{
        xpix = SendCommand(X_LOCATION_CMD);  
    ypix = SendCommand(Y_LOCATION_CMD);   
        printf("X is %x   Y is %x\n",xpix,ypix);
    return;
}                       
1。总是不能得到想要的数据,所以想问问时序上有没有问题?
2。8位命令ADCommand有没有被ADS7846正确的读出?
3.ADS返回的12位参数有没有被有效的放入SSI_DR寄存器?

回复评论 (1)

void CSL (void)
{
        *(RP)GPIO_PORTD_DATA &= ~(0x1<<3); //cs 片选信号拉低,使能ADS 7846
        return ;
        }
       

void CSH (void)
{
        *(RP)GPIO_PORTD_DATA |= 0x1<<3;                //cs 片选信号拉高  ,不使能ADS 7846
        return ;
}       
点赞  2009-8-14 11:26
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复