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