⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ads7843.c

📁 本程序为ADS7843驱动程序
💻 C
字号:
/****************************************************************************
* 文 件 名:ADS7843.C
* 功    能:ADS7843驱动程序。
* 说    明:若系统时钟过快,需要调整DELYA_200NS的值。
****************************************************************************/
#include "typedef.h"
#include "ads7843.h"

BYTE Ads_ctrl = 0xff;

/****************************************************************************
* 名称:DelayNo()
* 功能:短软件延时。
* 入口参数:dly		延时参数,值越大,延时越久
* 出口参数:无
****************************************************************************/
void  DelayNo(BYTE i)
{  for(; i>0; i--);
 //  asm("NOP");
}


/****************************************************************************
* 名称:TestDelayNo()
* 功能:测试短软件延时,以便于产生正确的时序。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void  TestDelayNo(void)
{   while(1)
    {   ADS7843_DCLKS();
        DelayNo(DELAY_200NS);
        ADS7843_DCLKC();
        DelayNo(DELAY_200NS);
    }
    
}

/****************************************************************************
* 名称:ADS7843_IRQR()
* 功能:ADS7843的PENIRQ引脚测量,返回当前此引脚的电平值。
* 入口参数:无
* 出口参数:返回为0表示PENIRQ为低电平状态,否则为高电平。
****************************************************************************/
uint8  ADS7843_IRQR(void)
{   uint8  dat[3];

/*    DelayNo(1);
    if(PIND&ADS7843_IRQ) dat[0] = 1;
      else dat[0] = 0;
    if(PIND&ADS7843_IRQ) dat[1] = 1;
      else dat[1] = 0;
    if(PIND&ADS7843_IRQ) dat[2] = 1;
      else dat[2] = 0;
      
    if((dat[0] + dat[1] + dat[2]) > 1) return(1);
      else  return(0);*/
	  
    DelayNo(1);
    if(ADS7843_PENR()) dat[0] = 1;
      else dat[0] = 0;
    if(ADS7843_PENR()) dat[1] = 1;
      else dat[1] = 0;
    if(ADS7843_PENR()) dat[2] = 1;
      else dat[2] = 0;
      
    if((dat[0] + dat[1] + dat[2]) > 1) return(1);
      else  return(0);
}



/****************************************************************************
* 名称:ADS7843_IOInit()
* 功能:初始化ADS7843的控制I/O,CS=1,DCLK=0,DIN=0。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void  ADS7843_IOInit(void)
{   ADS7843_CSS(); 						// CS = 1
    ADS7843_DCLKC();				    // DCLK = 0
    ADS7843_DINC();						// DIN = 0
    DelayNo(DELAY_200NS);
}
 
 
/****************************************************************************
* 名称:ADS7843_WriteRead()
* 功能:对ADS7843进行读写操作。操作按照ADS7843的规定,24Clocks,先写8位控制数据,然
*      后读取12位的转换结果。
* 入口参数:data		控制数据
* 出口参数:返回值为读出的数据
****************************************************************************/ 
uint16  ADS7843_WriteRead(uint8 data)
{  uint8   i;
   WORD  ret_dat;
	
   data = data|0x80;					// 设置S位
   ADS7843_IOInit();
   
   ADS7843_CSC();						// CS = 0
   for(i=0; i<8; i++)
   {  if( (data&0x80) != 0 ) ADS7843_DINS();	// DIN = 1
	    else  ADS7843_DINC();			// DIN = 0
	  DelayNo(DELAY_200NS);
	  ADS7843_DCLKS();					// DCLK = 1
	  DelayNo(DELAY_200NS);
	  ADS7843_DCLKC();					// DCLK = 0
	  data = data<<1;
   }
   ADS7843_DINC();						// DIN = 0
   DelayNo(DELAY_200NS * 3);
   
   ADS7843_DCLKS();						// DCLK = 1
   DelayNo(DELAY_200NS);
   ADS7843_DCLKC();					    // DCLK = 0
    
   ret_dat = 0;
   for(i=0; i<12; i++)
   {  ret_dat = ret_dat<<1;      
      DelayNo(DELAY_200NS);
      ADS7843_DCLKS();					// DCLK = 1
	  if( ADS7843_DOUTR() != 0 ) ret_dat = ret_dat | 1;	  
	  DelayNo(DELAY_200NS);
	  ADS7843_DCLKC();				    // DCLK = 0
	  
	  if(i==6) DelayNo(DELAY_200NS * 2); 
   }
   
   for(i=0;i<3;i++)
   {  DelayNo(DELAY_200NS);
      ADS7843_DCLKS();					// DCLK = 1
	  DelayNo(DELAY_200NS);
   	  ADS7843_DCLKC();					// DCLK = 0	  
   }   
   DelayNo(DELAY_200NS);
   ADS7843_CSS();						// CS = 1
   
   return(ret_dat);
}

/*******************************ads7843读写IO控制函数*******************/
void ADS7843_CSS()
{
   Ads_ctrl |=BIT(1);
   ADS_WriteIO(0x06,Ads_ctrl);
}
  
void ADS7843_CSC()
{
   Ads_ctrl &=~BIT(1);
   ADS_WriteIO(0x06,Ads_ctrl);
}

BYTE ADS7843_DOUTR()
{
    return ((ADS_ReadIO(0x1)&BIT(2))>>2);
} 


void ADS7843_DINS()
{
   Ads_ctrl |=BIT(0);
   ADS_WriteIO(0x06,Ads_ctrl);
}   
  
void ADS7843_DINC()
{
   Ads_ctrl &=~BIT(0);
   ADS_WriteIO(0x06,Ads_ctrl);

}
void ADS7843_DCLKS()
{
   Ads_ctrl |=BIT(2);
   ADS_WriteIO(0x06,Ads_ctrl);

}

void ADS7843_DCLKC()
{
   Ads_ctrl &=~BIT(2);
   ADS_WriteIO(0x06,Ads_ctrl);

} 

BYTE ADS7843_PENR()
{
    return (ADS_ReadIO(0x1)&BIT(0));
}

void ADS_WriteIO(BYTE adrs,BYTE data)
{
   DDRA = 0xff;
   
   PORTC = 0X07;   //控制电平转换器件1控制地址为0x07
   PORTA = 0Xf3;   //控制电平转换器件1(ALV1)A-〉B,片选信号选中
   PORTG = 0xfe;
   asm("nop");
   PORTG = 0xff;
   
   PORTC = adrs;  //写信号
   PORTA = data;
 
   PORTG = 0xfe;
   asm("nop");
   asm("nop");
   asm("nop");
   asm("nop");
   PORTG = 0xff;
	 
   PORTA = 0XFF;
   PORTC = 0XFF;
}

BYTE ADS_ReadIO(BYTE adrs)
{
   BYTE re;
  
   PORTA = 0XFF;
   DDRA = 0x00;
   
   PORTC = adrs;  //读
   PORTG = 0xfd;
   asm("nop");
   asm("nop");
   re = PINA;
   PORTG = 0xff;
	 
   DDRA = 0xff;
   PORTA = 0XFF;
   PORTC = 0XFF;
   return re;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -