ADS1100原理图
以下是我编的程序
//ICC-AVR application builder : 2012-7-7 19:30:59
// Target : M169
// Crystal: 8.0000Mhz
#include <iom169v.h>
#include <macros.h>
#define uchar unsigned char
#define uint unsigned int
#define SCL_OUT DDRF |= (1<<  F6)
#define SCL_OUT_H    ORTF |= (1<<  F6)
#define SCL_OUT_L    ORTF &=~ (1<<  F6)
#define SDA_OUT DDRF |= (1<<  F7)
#define SDA_OUT_H    ORTF |= (1<<  F7)
#define SDA_OUT_L    ORTF &=~ (1<<  F7)
#define SDA_IN DDRF &=~ (1<<PF7)
#define SDA_IN_D (PINF&0x80)
#define DELAY_NOP asm("NOP\n")
void port_init(void)
{
PORTA = 0x00;
DDRA = 0x00;
PORTB = 0x00;
DDRB = 0x00;
PORTC = 0x00;
DDRC = 0x00;
PORTD = 0x00;
DDRD = 0x00;
PORTE = 0x00;
DDRE = 0x00;
PORTF = 0xc0;//
DDRF = 0x00;
PORTG = 0x00;
DDRG = 0x00;
}
void delay_10us(void)
{
uchar delay_num;
for(delay_num=0;delay_num<=10;delay_num++){DELAY_NOP;}
}
void delay250ms(void)
{
uchar delay_num1,delay_num2;
for(delay_num1=0;delay_num1<=250;delay_num1++)
for(delay_num2=0;delay_num2<=250;delay_num2++) {} //1ms
}
void delayms(uint d) //ms
{
uint c,e;
for(e=0;e<d;e++)
{
for(c=1;c<143*1-2;c++);
}
}
///////////////////////////////////////////////////////AD程序
void ads1100_start(void)
{
//inital:scl=1,data=1,data =>out
SDA_OUT;
SCL_OUT;
SDA_OUT_L; //=0
delay_10us();
SCL_OUT_L;//insure scl=0
delay_10us();
//finally :scl=0,data=0,data =>out
}
void ads1100_stop(void)
{
SDA_OUT;
SCL_OUT;
SDA_OUT_L;
delay_10us();
delay_10us();
// scl=1 data=0=>data=1
SCL_OUT_H;
delay_10us();
delay_10us();
SDA_OUT_H;
delay_10us();
delay_10us();
}
uchar ackby_ads1100(void)
{
unsigned char times=0;
//start:scl=0 data=>out
//give up bus setup data in
SDA_IN;
SCL_OUT;
delay_10us(); //wait for ads1100 ready data
//wait ads1100 ack
SCL_OUT_H;
while((SDA_IN_D==1)&&(times<100)) //wait for ads ack data=0
{
times++;
}
SCL_OUT_L; //ready for next
delay_10us();
//fianlly:scl=0;data <in
if(times>90)
{
return 0;
}
else
{
return 1;
}
}
void ackby_master(void)
{
//start:scl=0
//get bus
SDA_OUT;
SCL_OUT;
//ready ack data
SDA_OUT_L;
delay_10us(); //ready data
SCL_OUT_H; //wait for ads1100 receive
delay_10us();
delay_10us();
SCL_OUT_L; //ready for next
delay_10us();
//fianlly:scl=0,data >out
}
void send_frame(uchar framedata)
{
unsigned char i;
//initial:scl=0
SDA_OUT;
SCL_OUT;
delay_10us();
delay_10us();
for(i=0;i<8;i++)
{
SCL_OUT_L; //read for next scl=0
if( ( (framedata << i) & 0x80) ==0 )
{
SDA_OUT_L;
}
else
{
SDA_OUT_H;
}
delay_10us(); //稳定数据
SCL_OUT_H; //suo shuju
delay_10us(); //wait for ads1100 receive data
}
SCL_OUT_L; //read for next scl=0
//finally:scl=0,data getbus
}
uchar read_frame(void)
{
uchar data=0,i;
//start:scl=0; data no confire
//give up bus setup data in
SDA_IN;
SCL_OUT;
delay_10us(); //wait for ads ready data
for(i=0;i<8;i++)
{
SCL_OUT_H;
data=data<<1; //bit0=0
delay_10us(); //等待数据稳定
if(SDA_IN_D!=0)
{
data=data+1;
}
SCL_OUT_L;
delay_10us(); //wait for ads ready data
}
//fially:scl=0 data <in
return data;
}
/*
////////////////////////////////////////////////////////////////////////////////////////////
函数功能:写一个命令码到ADS1100
参数说明:addr器件地址,command命令码
此为ads1100用函数
////////////////////////////////////////////////////////////////////////////////////////////
*/
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用函数
////////////////////////////////////////////////////////////////////////////////////////////
*/
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();
datac=read_frame();
ackby_master();
//a stop
ads1100_stop();
// UART_TXD0(datac);
data=(((uint)datah)<<8) + datal;
return data;
}
//////////////////////////////////////////////
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
CLKPR=0x80;
//CLKPR=0x05;//软件分频1/32
//CLKPR=0x01;//软件分频1/2
// CLKPR=0x08;//软件分频1/256
//CLKPR=0x07;//软件分频1/128
//CLKPR=0x06;//软件分频1/64
//SMCR=0x05;
SEI(); //re-enable interrupts
//all peripherals are now initialized
}
void main()
{
uint data;
init_devices();
ads1100_write(0x90,0x8c);//写地址:1001 000 0 固定码1001,地址为000,写命令为0 写配置字:连续转换,转换速率为8SPS,增益为1
while(1)
{
data = 0;
data=ads1100_read(0x91); //写地址:1001 000 1 固定码1001,地址为000,读命令为1
delayms(500);
data=ads1100_read(0x91);
delayms(500);
//最后将结果data显示出来,程序此处未写
}
}
问题:上面程序下载烧写后,ads1100转换结果总是显示0x0000,即不转换,不知道程序问题出在哪?大家帮我看看是什么原因。谢谢了!
|