Chinaunix首页 | 论坛 | 博客
  • 博客访问: 278456
  • 博文数量: 91
  • 博客积分: 2105
  • 博客等级: 大尉
  • 技术积分: 1050
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-14 19:30
文章分类
文章存档

2011年(11)

2010年(64)

2009年(16)

我的朋友

分类: LINUX

2010-07-01 21:16:32

网上关于AR1020触摸屏控制器的使用方法比较的少,几乎找不到什么源码,打电话问代理商,也没有源码,项目里用到的这颗芯片,就为他做了一个简单的ICE的代码调试,下午调试好了,就为它写了一个platform 架构的linux驱动,感觉这课芯片用起来比7846好点,但ads7846在linux内核里有源码,让人蛋疼的是,microchip没有提供linux源码,这里就附上ICE下调试的部分代码吧,仅供学习交流,linux源码下次在附上吧,
main.c函数
void SPI_INT(void){
Readxy();
*(RP)GPIO_PORTI_INTCLR |=(1<<11);             
*(RP)GPIO_PORTI_INTCLR &= 0x000;                 //清除中断
return;

}
extern  data[10];
extern  xpix ,ypix ,zpix,z1,z2 ;
int main(void)
{
  int i;
printf("Please touch!\n ");
    TouchpanelInit();
    int_disable_all();
    int_enable(INTSRC_EXT11); 
    unmask_all_int(0);
  
       //SendCommand(0x55);
//SendCommand(0x01);
//SendCommand(0x12);
//for(i=0;i<10;i++)

    while(1);

    return 0 ;  //避免编译器warning ,永远不会到达这里


touch.c函数

U16 xpix ,ypix ,zpix,z1,z2 ;
int data[10]={0};
int receive_data[10]={0};
  
/******************************************************************
*函数名:Delay10MicroSeconds
*入口参数:
*返回参数:无
*函数功能:延时
*******************************************************************/

void Delay(int n)
{
    int i;
    
    for(i=0;i
    
    return ;
}  
/******************************************************************
*函数名:TouchpanelInit
*入口参数:无
*返回参数:无
*函数功能:初始化touchpanel
*******************************************************************/
void TouchpanelInit(void)
{
    *(RP)SSI2_SSI2ENR = 0x0; //设置前紧禁止能SSI
   // *(RP)SSI2_CONTROL0 = 0x07;  //SPI协议,数据帧长度为8,停止位为低电平
    *(RP)SSI2_CONTROL0 = 0x47;
    *(RP)SSI2_CONTROL1 = 0x00; //数据帧数量为1

    *(RP)SSI2_BAUDR  = 0x1000; //设置波特率
    *(RP)SSI2_TXFTLR = 0x1;  //发送阈值为1
    *(RP)SSI2_RXFTLR = 0x0;  //接受阈值为1
    *(RP)SSI2_TXFLR =0x1;
    *(RP)SSI2_RXFLR =0x1;
  // *(RP)SSI_IMR = 0x1f; //  不屏蔽中断
    *(RP)SSI2_IMR = 0x0;  //屏蔽中断 
    *(RP)SSI2_DMACR  =0x0;//未使能DMA
    *(RP)SSI2_DR =0x0;
    *(RP)SSI2_SER =0x1;
    *(RP)SSI2_SSI2ENR = 0x1; //设置完使能ssi
    
    *(RP)GPIO_PORTI_DIR &=~(1<<11);
    *(RP)GPIO_PORTI_SEL |=(1<<11);
    *(RP)GPIO_PORTI_INTSEL |=(1<<11);
    *(RP)GPIO_PORTI_INTLEL |= (1<<11);
    *(RP)GPIO_PORTI_INTPOL &= ~(1<<11);
    *(RP)GPIO_PORTI_INTCLR |=(1<<11);             
*(RP)GPIO_PORTI_INTCLR &= 0x000;                 //清除中断
    
return ;

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

  unsigned short  SendCommand  (U8 ADCommand)
{
U16 location;
int date = 0;

*(RP)SSI2_DR=ADCommand;
while (!(*(RP)SSI2_SR & 0x4));
while (*(RP)SSI2_SR & 0x1);


date = *(RP)SSI2_DR;
while ((*(RP)SSI2_SR & 0x8));
while (*(RP)SSI2_SR & 0x1);

return date;  
}

 void Readxy(void)
{
    U16 xpix, ypix,z1,z2;
    int i;
   // int data[15] = {0};
    
    *(RP)SSI2_SSI2ENR = 0x0; //设置前紧禁止能SSI
Delay(10);
*(RP)SSI2_SSI2ENR = 0x1; //设置前紧禁止能SSI
    
  data[0]=SendCommand(0x00);
    data[1]=SendCommand(0x00);
    data[2]=SendCommand(0x00);
    data[3]=SendCommand(0x00);
    data[4]=SendCommand(0x00);
    

     z1=data[0];
     xpix=((data[2]<<7)+data[1]);
     ypix=((data[4]<<7)+data[3]);
    
   // printf("X :%d,Y :%d,updown is 0x:%x\n",xpix,ypix,z1);

   
   return;
}                      


大概的数据流程是,进入main函数后,等待触摸,当你触摸屏后,会转到SPI_INT函数处理,在SPI_INT函数里调用了Readxy(void)函数,通过SendCommand(0x00)向AR1020提供时钟,读取AR1020返回的坐标数据,在坐标数据里处理,得到坐标,linux下吧坐标给上层处理,关于配置寄存器的,直接在main函数里SendCommand数据就可以了,我屏蔽掉的就是。仅放这里作为自己的工作周记而已。
阅读(937) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2011-04-13 16:40:46

学习了,多谢楼主分享哦!也欢迎广大linux爱好者来我的论坛一起讨论arm哦!www.lt-net.cn