📄 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 + -