📄 ads1110.c~
字号:
/*
file name:ads1110.c
head file:ads1110.h delay.h
说明:
chip:mega16L
编译器:CodeVisionAVR C Compiler
在ADS1100测试通过
i2c程序包包括:
void io_dir(uchar dir);
void ads1100_start(void); i2c start
void ads1100_stop(void); i2c stop
uchar ackby_ads1100(void); ads1100应答
void ackby_master(void); 主机应答
void send_frame(uchar framedata); send 8bit to ads1100
uchar read_frame(void); read bbit from
其他函数为ADS1100用
其中引脚定义在ads1110.h定义,请更改引脚
编写日期:2006.04.27
作 者:吴青松
注:只供学习,不能商用
*/
#include <ads1110.h> //
#include <delay.h> //延时函数用,此为CodeVisionAVR C Compiler自带,其他编译器中的延时 //则需要自己编写
/*====================================================================================
函数功能:改变I/O数据线的方向
如果是其他类型单片机,此处需要更改
======================================================================================*/
void io_dir(uchar dir)
{
out_data=1;
if(dir==IN)
{
io_data=0;
}
if(dir==OUT)
{
io_data=1;
}
}
/*
////////////////////////////////////////////////////////////////////////////////////////////
函数功能:I2C起动,注意起动前,保证scl=1,data=1,data =>out(i/o输出)
A start condition is when the clock line is HIGH and the data line goes from HIGH to LOW.
当时钟线为高电平时,数据线从1->0,形成一个开始条件
编写日期:2006.04.27
作 者:吴青松
////////////////////////////////////////////////////////////////////////////////////////////
*/
void ads1100_start(void)
{
//inital:scl=1,data=1,data =>out
//data line putout get bus
out_data=0; //=0
delay_us(5);
scl=0; //insure scl=0
delay_us(5);
//finally :scl=0,data=0,data =>out
}
/*
////////////////////////////////////////////////////////////////////////////////////////////
函数功能:I2C停止
A stop condition is when the clock line is HIGH and the data line goes from LOW to HIGH.
当时钟线为高电平时,数据线从0->1,形成一个开始条件
编写日期:2006.04.27
作 者:吴青松
////////////////////////////////////////////////////////////////////////////////////////////
*/
void ads1100_stop(void)
{
//initial:scl=0 data no confire
//data line putout get bus :data=0 =>out
io_dir(OUT);
delay_us(10);
out_data=0;
delay_us(10);
// scl=1 data=0=>data=1
scl=1;
delay_us(10);
out_data=1;
delay_us(10);
//finallay:scl=1,data=1,data =>out
}
/*
////////////////////////////////////////////////////////////////////////////////////////////函数功能:i2c从器件(ads1100) 应答
参数说明:当i2c器件响应 返回1,否则返回0
编写日期:2006.04.27
作 者:吴青松
////////////////////////////////////////////////////////////////////////////////////////////
*/
uchar ackby_ads1100(void)
{
unsigned char times=0;
//start:scl=0 data=>out
//give up bus setup data in
io_dir(IN);
delay_us(5); //wait for ads1100 ready data
//wait ads1100 ack
scl=1;
while((in_data==1)&&(times<100)) //wait for ads ack data=0
{
times++;
}
scl=0; //ready for next
delay_us(5);
//fianlly:scl=0;data <in
if(times>90)
{
return 0;
}
else
{
return 1;
}
}
/*
////////////////////////////////////////////////////////////////////////////////////////////函数功能:主机应答
编写日期:2006.04.27
作 者:吴青松
////////////////////////////////////////////////////////////////////////////////////////////
*/
void ackby_master(void)
{
//start:scl=0
//get bus
io_dir(OUT);
//ready ack data
out_data=0;
delay_us(5); //ready data
scl=1; //wait for ads1100 receive
delay_us(10);
scl=0; //ready for next
delay_us(5);
//fianlly:scl=0,data >out
}
/*========================================================================================
函数功能:向I2C从器件发送一帧(8bit)
编写日期:2006.04.27
作 者:吴青松
=========================================================================================*/
void send_frame(uchar framedata)
{
unsigned char i;
//initial:scl=0
//get bus
io_dir(OUT);
delay_us(10);
for(i=0;i<8;i++)
{
scl=0; //read for next scl=0
if( ( (framedata << i) & 0x80) ==0 )
{
out_data=0;
}
else
{
out_data=1;
}
delay_us(5); //稳定数据
scl=1; //suo shuju
delay_us(5); //wait for ads1100 receive data
}
scl=0; //read for next scl=0
//finally:scl=0,data getbus
}
/*===============================================================
函数功能:向I2C从器件读取一帧(8bit)
编写日期:2006.04.27
作 者:吴青松
===============================================================*/
uchar read_frame(void)
{
uchar data=0,i;
//start:scl=0; data no confire
//give up bus setup data in
io_dir(IN);
delay_us(5); //wait for ads ready data
for(i=0;i<8;i++)
{
scl=1;
data=data<<1; //bit0=0
delay_us(5); //等待数据稳定
if(in_data==1)
{
data=data+1;
}
scl=0;
delay_us(5); //wait for ads ready data
}
//fially:scl=0 data <in
return data;
}
/*
////////////////////////////////////////////////////////////////////////////////////////////
函数功能:写一个命令码到ADS1100
参数说明:addr器件地址,command命令码
此为ads1100用函数
编写日期:2006.04.27
作 者:吴青松
////////////////////////////////////////////////////////////////////////////////////////////
*/
void ads1100_write(unsigned char addr,unsigned char command)
{
//addr=0x90; //1001(固定) 000(器件编号) 0(写)
//a start
ads1100_start();
//sent for a frame addr
send_frame(addr);
ackby_ads1100();
//sent for a frame command
send_frame(command);
ackby_ads1100();
//a stop
ads1100_stop();
}
/*
////////////////////////////////////////////////////////////////////////////////////////////
函数功能:读写一次转换数据从ADS1100
参数说明:addr器件地址
此为ads1100用函数
编写日期:2006.04.27
作 者:吴青松
////////////////////////////////////////////////////////////////////////////////////////////
*/
unsigned int ads1100_read(unsigned char addr)
{
uint data;
uchar datah,datal,datac;
//addr=0x91; //1001(固定) 000(器件编号) 1(读)
//a start
ads1100_start();
//sent for a frame addr
send_frame(addr);
ackby_ads1100();
//read a 8bit data for ads1100 datah
datah=read_frame();
ackby_master();
//read a 8bit data for ads1100 datal
datal=read_frame();
ackby_master();
//read a 8bit data for ads1100 datac
datac=read_frame();
ackby_master();
//a stop
ads1100_stop();
data=(((uint)datah)<<8) + datal;
return data;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -