📄 ads1100 c.c
字号:
/***************************************************************************/
/* 函数原型: void ads_start (void) */
/* 功 能: 提供I2C总线工作时序中的起始位。 */
/***************************************************************************/
void ads_start (void) //在SCL高的情况下,SDA由高到低的变化造成START。
{
SDA=1;
_nop_();
SCL=1;
_nop_();
_nop_();
_nop_();
SDA=0;
_nop_();
_nop_();
_nop_();
SCL=0;
_nop_();
_nop_();
}
/**************************************************************************/
/* 函数原型: void ads_stop(void) */
/* 功 能: 提供I2C总线工作时序中的停止位。 */
/**************************************************************************/
void ads_stop(void) //在SCL高的情况下,SDA由低到高的变化造成STOP。
{
SDA=0;
_nop_();
SCL=1;
_nop_();
_nop_();
_nop_();
SDA=1;
_nop_();
_nop_();
_nop_();
SCL=0;
_nop_();
_nop_();
}
/*****************************************************************************/
/* 函数原型: uchar ack_check(void) */
/* 功 能: 提供I2C总线的时钟信号, 并返回在时钟电平为高期间SDA 信号线上状*/
/* 态。本函数可用于数据发送, 也可用于数据接收。 */
/*****************************************************************************/
uchar ack_check(void) // 检查应答信号
{
SCL=0;
SCL=1;
_nop_();
if (SDA )
{
ACK = 1;
}
else
{
ACK = 0;
}
SCL=0;
return(ACK); // 如果收到ACK应答则返回0, 否则返回1。
}
/****************************************************************************/
/* 函数原型: void ads_sendBYTE(uch data) */
/* 功 能: 向I2C总线发送8位数据。 */
/****************************************************************************/
void ads_sendBYTE(uchar snd_data) // 发送一个字节
{
uchar bitcount=8; // 发送8位数据。
do
{
if((snd_data&0x80)==0x80) // 从左到右选送D7,屏蔽D0~D6。
{
SDA=1; //写 1
}
else
{
SDA=0; //写 0
}
SCL=0; //在时钟大于4u秒期间写数据
SCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SCL=0;
snd_=snd_<<1; // 待送数据左移一位.
bitcount--;
}
while(bitcount);
SDA=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
/***************************************************************************/
/* 函数原型: ads_reciveBYTE(void) */
/* 功 能: 从I2C总线上接收8位数据信号, 并将接收到8位数据作为一个字节 */
/* 返回, 不回送应答信号ACK。主函数在调用本函数之前应保证SDA信 */
/* 号线处于浮置状态, 即使8052的Px.x脚置1。 */
/***************************************************************************/
uchar ads_reciveBYTE(void) //接受一个字节
{
uchar in_data=0;
uchar bitcount1=8;
do
{ SCL=0; //在时钟大于4u秒期间读数据
SCL=1;
_nop_();
_nop_();
if(SDA) //读 1
{
in_data=in_data|0x01;
}
else //读 0
{
in_data=in_data&0xfe;
}
SCL=0;
if(bitcount1-1)
{
in_data=in_data<<1;
}
bitcount1--;
}
while(bitcount1);
return(in_data);
}
/****************************************************************************/
/* 函数原型: void function send_Ack(void); */
/* 功 能: 向I2C总线发送一个应答信号ACK, 一般用于连续数据读取时。 */
/****************************************************************************/
void send_ack(void) // 发送连续读信号
{
SDA=0;
SCL=0;
SCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SCL=0;
}
void send_nack(void) // 发送不连续读信号
{
SDA=1;
SCL=0;
SCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SCL=0;
}
/****************************************************************************/
/* 函数原型: write_ads(uchar data) */
/* 功 能: 写器件地址和配置字。 */
/****************************************************************************/
void write_ads(uchar snd_data) //写器件地址和配置字
{
ads_start(); //开始写
ads_sendBYTE(0x90); //写器件地址(写)
do
{
;
}while(ack_check()); //等待应答
ads_sendBYTE(snd_data); //写配置字
do
{
;
}while(ack_check()); //等待应答
ads_stop(); //结束写
}
/****************************************************************************/
/* 函数原型: read_ads(void) */
/* 功 能: 数据读取。 */
/****************************************************************************/
void read_ads(void) //从ADS1100中读出数据
{
// uchar adc_hi;
// uchar adc_lo;
// uchar adc_cfg;
ads_start(); //开始读
ads_sendBYTE(0x91); //写器件地址(读)
do
{
;
}while(ack_check()); //等待应答
adc_hi = ads_reciveBYTE(); // 读高8位
send_ack(); //连续读
adc_lo = ads_reciveBYTE(); //读低8位
send_ack(); //连续读
adc_cfg = ads_reciveBYTE(); //读配置字
send_nack();
ads_stop(); //结束读
}
/***************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -