ads7843.c
上传用户:sdaoma
上传日期:2013-08-07
资源大小:3838k
文件大小:4k
源码类别:

GPS编程

开发平台:

C/C++

  1. /****************************************************************************
  2. * 文件名:ADS7843.C
  3. * 功能:ADS7843驱动程序。
  4. *  
  5. * 说明:若系统时钟过快,需要调整DELYA_200NS的值。
  6. ****************************************************************************/
  7. #include  "config.h"
  8. #define  ADS7843_CSS() IO2SET = ADS7843_CS
  9. #define  ADS7843_CSC() IO2CLR = ADS7843_CS
  10. #define  ADS7843_DOUTR() (IO2PIN & ADS7843_DOUT)
  11. #define  ADS7843_DINS() IO2SET = ADS7843_DIN
  12. #define  ADS7843_DINC() IO2CLR = ADS7843_DIN
  13. #define  ADS7843_DCLKS() IO2SET = ADS7843_DCLK
  14. #define  ADS7843_DCLKC() IO2CLR = ADS7843_DCLK
  15. /* 操作时序控制宏(即延时控制值) */
  16. #define  DELAY_200NS 5
  17. /****************************************************************************
  18. * 名称:DelayNo()
  19. * 功能:短软件延时。
  20. * 入口参数:dly 延时参数,值越大,延时越久
  21. * 出口参数:无
  22. ****************************************************************************/
  23. void  DelayNo(uint32 i)
  24. {  for(; i>0; i--);
  25. }
  26. /****************************************************************************
  27. * 名称:TestDelayNo()
  28. * 功能:测试短软件延时,以便于产生正确的时序。
  29. * 入口参数:无
  30. * 出口参数:无
  31. ****************************************************************************/
  32. void  TestDelayNo(void)
  33. {   while(1)
  34.     {   ADS7843_DCLKS();
  35.         DelayNo(DELAY_200NS);
  36.         ADS7843_DCLKC();
  37.         DelayNo(DELAY_200NS);
  38.     }
  39.     
  40. }
  41. /****************************************************************************
  42. * 名称:ADS7843_IRQR()
  43. * 功能:ADS7843的PENIRQ引脚测量,返回当前此引脚的电平值。
  44. * 入口参数:无
  45. * 出口参数:返回为0表示PENIRQ为低电平状态,否则为高电平。
  46. ****************************************************************************/
  47. uint8  ADS7843_IRQR(void)
  48. {   uint8  dat[3];
  49.     DelayNo(1);
  50.     if(IO0PIN&ADS7843_IRQ) dat[0] = 1;
  51.       else dat[0] = 0;
  52.     if(IO0PIN&ADS7843_IRQ) dat[1] = 1;
  53.       else dat[1] = 0;
  54.     if(IO0PIN&ADS7843_IRQ) dat[2] = 1;
  55.       else dat[2] = 0;
  56.       
  57.     if((dat[0] + dat[1] + dat[2]) > 1) return(1);
  58.       else  return(0);
  59. }
  60. /****************************************************************************
  61. * 名称:ADS7843_IOInit()
  62. * 功能:初始化ADS7843的控制I/O,CS=1,DCLK=0,DIN=0。
  63. * 入口参数:无
  64. * 出口参数:无
  65. ****************************************************************************/
  66. void  ADS7843_IOInit(void)
  67. {   ADS7843_CSS();  // CS = 1
  68.     ADS7843_DCLKC();     // DCLK = 0
  69.     ADS7843_DINC(); // DIN = 0
  70.     DelayNo(DELAY_200NS);
  71. }
  72.  
  73.  
  74. /****************************************************************************
  75. * 名称:ADS7843_WriteRead()
  76. * 功能:对ADS7843进行读写操作。操作按照ADS7843的规定,24Clocks,先写8位控制数据,然
  77. *      后读取12位的转换结果。
  78. * 入口参数:data 控制数据
  79. * 出口参数:返回值为读出的数据
  80. ****************************************************************************/ 
  81. uint16  ADS7843_WriteRead(uint8 data)
  82. {  uint8   i;
  83.    uint16  ret_dat;
  84.    data = data|0x80; // 设置S位
  85.    ADS7843_IOInit();
  86.    
  87.    ADS7843_CSC(); // CS = 0
  88.    for(i=0; i<8; i++)
  89.    {  if( (data&0x80) != 0 ) ADS7843_DINS(); // DIN = 1
  90.     else  ADS7843_DINC(); // DIN = 0
  91.   DelayNo(DELAY_200NS);
  92.   ADS7843_DCLKS(); // DCLK = 1
  93.   DelayNo(DELAY_200NS);
  94.   ADS7843_DCLKC(); // DCLK = 0
  95.   data = data<<1;
  96.    }
  97.    ADS7843_DINC(); // DIN = 0
  98.    DelayNo(DELAY_200NS * 3);
  99.    
  100.    ADS7843_DCLKS(); // DCLK = 1
  101.    DelayNo(DELAY_200NS);
  102.    ADS7843_DCLKC();     // DCLK = 0
  103.     
  104.    ret_dat = 0;
  105.    for(i=0; i<12; i++)
  106.    {  ret_dat = ret_dat<<1;      
  107.       DelayNo(DELAY_200NS);
  108.       ADS7843_DCLKS(); // DCLK = 1
  109.   if( ADS7843_DOUTR() != 0 ) ret_dat = ret_dat | 1;   
  110.   DelayNo(DELAY_200NS);
  111.   ADS7843_DCLKC();     // DCLK = 0
  112.   
  113.   if(i==6) DelayNo(DELAY_200NS * 2); 
  114.    }
  115.    
  116.    for(i=0;i<3;i++)
  117.    {  DelayNo(DELAY_200NS);
  118.       ADS7843_DCLKS(); // DCLK = 1
  119.   DelayNo(DELAY_200NS);
  120.       ADS7843_DCLKC(); // DCLK = 0   
  121.    }   
  122.    DelayNo(DELAY_200NS);
  123.    ADS7843_CSS(); // CS = 1
  124.    
  125.    return(ret_dat);
  126. }