📄 ads7843.c
字号:
/****************************************************************************
* 文 件 名:ADS7843.C
* 功 能:ADS7843驱动程序。
* 说 明:若系统时钟过快,需要调整DELYA_200NS的值。
****************************************************************************/
#include "config.h"
#define ADS7843_CS (1<<9) //用于PORT E口 9脚为输出
#define ADS7843_DOUT (1<<11) //用于PORT G口 11脚为输入
#define ADS7843_DIN (1<<10) //用于PORT G口 10脚为输出
#define ADS7843_DCLK (1<<10) //用于PORT E口 10脚为输出
#define ADS7843_IRQ (1<<3) //用于PORT F口 3脚为EINT3
#define ADS7843_CSS() rGPEDAT = rGPEDAT | ADS7843_CS
#define ADS7843_CSC() rGPEDAT = rGPEDAT & (~ADS7843_CS)
#define ADS7843_DOUTR() (rGPGDAT & ADS7843_DOUT)
#define ADS7843_DINS() rGPGDAT = rGPGDAT | ADS7843_DIN
#define ADS7843_DINC() rGPGDAT = rGPGDAT & (~ADS7843_DIN)
#define ADS7843_DCLKS() rGPEDAT = rGPEDAT | ADS7843_DCLK
#define ADS7843_DCLKC() rGPEDAT = rGPEDAT & (~ADS7843_DCLK)
/* 操作时序控制宏(即延时控制值) */
#define DELAY_200NS 10
/****************************************************************************
* 名称:DelayNo()
* 功能:短软件延时。
* 入口参数:dly 延时参数,值越大,延时越久
* 出口参数:无
****************************************************************************/
void DelayNo(uint32 i)
{ for(; i>0; i--);
}
/****************************************************************************
* 名称: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(rGPFDAT&ADS7843_IRQ) dat[0] = 1;
else dat[0] = 0;
if(rGPFDAT&ADS7843_IRQ) dat[1] = 1;
else dat[1] = 0;
if(rGPFDAT&ADS7843_IRQ) 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;
uint16 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);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -