小弟在写一个触摸屏驱动,在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寄存器?
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 ;
}