首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

AD7793读数据出错(附源码、时序图)

AD7793读数据出错(附源码、时序图)

我用AVR Mega128模拟SPI访问AD7793,使用PT100三线接法测量温度,但是数据读出总是有问题。部分源码如下:
#ifndef _SPI_H
#define _SPI_H
/*********************************************************/
#define SPI_WRITE_DELAY delay_nus(20)
#define SPI_READ_DELAY delay_nus(20)
#define SPI_SS_IN() CLR_BIT(DDRB,PB0)
#define SPI_SS_OUT() SET_BIT(DDRB,PB0)
#define SPI_SS_LOW() CLR_BIT(PORTB,PB0)
#define SPI_SS_HIGH() SET_BIT(PORTB,PB0)
#define SPI_SCK_OUT() SET_BIT(DDRB,PB1)
#define SPI_SCK_HIGH() SET_BIT(PORTB,PB1)
#define SPI_SCK_LOW() CLR_BIT(PORTB,PB1)
//DIN
#define SPI_MOSI_IN() CLR_BIT(DDRB,PB2)
#define SPI_MOSI_OUT() SET_BIT(DDRB,PB2)
#define SPI_MOSI_HIGH() SET_BIT(PORTB,PB2)
#define SPI_MOSI_LOW() CLR_BIT(PORTB,PB2)
//DOUT
#define SPI_MISO_IN() CLR_BIT(DDRB,PB3)
#define SPI_MISO_OUT() SET_BIT(DDRB,PB3)
#define SPI_MISO_HIGH() SET_BIT(PORTB,PB3)
#define SPI_MISO_LOW() CLR_BIT(PORTB,PB3)
#define GET_SPI_MISO() GET_BIT(PINB,PB3)

void SPI_Init(void)
{
SPI_SS_OUT();
SPI_SCK_OUT();
SPI_MOSI_OUT();
SPI_MISO_IN();

SPI_SS_HIGH();
SPI_SCK_HIGH();
SPI_MOSI_HIGH();
//SPI_MISO_HIGH();
}
void SPI_Send_CLK(uint num)
{
while(num--)
{
SPI_SCK_LOW();
delay_nus(1);
SPI_SCK_HIGH();
delay_nus(1);
}
}
void SPI_Write_Byte(uchar dat)
{
uchar i;
SPI_MOSI_OUT();
//SPI_SS_LOW();
//delay_nus(20);
for(i=0;i<8;i++)
{
SPI_SCK_LOW();
SPI_WRITE_DELAY;
if(dat&0x80)
{
SPI_MOSI_HIGH();
}
else
{
SPI_MOSI_LOW();
}
SPI_WRITE_DELAY;
SPI_SCK_HIGH();
SPI_WRITE_DELAY;
dat<<=1;
}
SPI_MOSI_IN();
//SPI_SS_HIGH();
//delay_nus(20);
}
void SPI_Write_2Bytes(uint dat)
{
uchar i;
SPI_MOSI_OUT();
//SPI_SS_LOW();
//delay_nus(20);

for(i=0;i<16;i++)
{
SPI_SCK_LOW();
SPI_WRITE_DELAY;
if(dat&0x8000)
{
SPI_MOSI_HIGH();
}
else
{
SPI_MOSI_LOW();
}
SPI_WRITE_DELAY;
SPI_SCK_HIGH();
SPI_WRITE_DELAY;
dat<<=1;
}
SPI_MOSI_IN();
//SPI_SS_HIGH();
//delay_nus(20);
}
uchar SPI_Read_Byte(void)
{
uchar i,dat=0x00;
//SPI_MOSI_HIGH();
//SPI_MISO_HIGH();
//SPI_SS_LOW();
//delay_nus(20);
for(i=0;i<8;i++)
{
dat<<=1;
SPI_SCK_LOW();
SPI_READ_DELAY;

dat|=GET_SPI_MISO();
SPI_READ_DELAY;

SPI_SCK_HIGH();
SPI_READ_DELAY;
}
//SPI_SS_HIGH();
//delay_nus(20);
return dat;
}
/*********************************************************/
#endif


void AD7793_Reset(void)
{
uchar i;
SPI_Write_Byte(0x00);
for(i=0;i<4;i++)
{
SPI_Write_Byte(0xff);
}
}
void AD7793_Init(void)
{
SPI_Init();
AD7793_Reset();
}
//读取配置寄存器
uint AD7793_Read_Confg(void)
{
uint dat=0x0000;
SPI_SS_LOW();
SPI_Write_Byte(0x50);//01 010 000
while(GET_SPI_MISO()==HIGH)
{
SPI_Send_CLK(1);
}
dat|=SPI_Read_Byte();
dat<<=8;
dat|=SPI_Read_Byte();
SPI_SS_HIGH();
return dat;
}

//初始化通道1
void AD7793_Init_AIN1(void)
{
SPI_SS_LOW();

//setup configuration register
/***********************************************************/
//select configuration register
SPI_Write_Byte(0x10);//0001 0000
//Bias Voltage Generator Enable: AIN1(-)
//Burnout Current Enable Bit: true
//Unipolar/Bipolar Bit: Bipolar
//BOOST: true
//Gain Select Bits: 64
SPI_Write_Byte(0x6e);//01 1 0 1 110
//Reference Select Bit: External Reference applied
//Buffered mode
//Channel Select bits: AIN1(+)-AIN1(-)
SPI_Write_Byte(0x10);//0 00 1 0 000
/***********************************************************/

//setup IO register
/***********************************************************/
//select IO register
SPI_Write_Byte(0x28);//0010 1000
//Direction of Current Sources Select Bits: IEXC1 to IOUT1, IEXC2 to IOUT2
//Current Source Value: 1mA
SPI_Write_Byte(0x03);//0000 00 11
/***********************************************************/
SPI_SS_HIGH();
}

//读取温度值
float AD7793_Read_Temp(void)
{
uchar data[3],i;
ulong tempCode=0x00000000;
float Ain;
//AD7793_Init_Temp_Param();
//select IC
AD7793_Reset();
SPI_SS_LOW();

//setup mode register
/***********************************************************/
//Enable write to CR, next operation is to write and select mode register
SPI_Write_Byte(0x08);//0000 1000
//Mode select: Single Conversion Mode
//Clock select: Internal 64KHz Clock, not available at the CLK pin.
//Filter update rate select: fadc=16.7Hz,Rejection 65dB
SPI_Write_2Bytes(0x200a);//H8:0010 0000 L8:0000 1010
/***********************************************************/
//delay_nms(1);

Uart0_SendStr("Wait until MISO goes low. ");
//delay_nus(2);

//wait while RDY is HIGH
while(GET_SPI_MISO()==HIGH)
{
SPI_Send_CLK(1);
}
Uart0_SendStr(" MISO goes low now. ");

//SPI_MOSI_HIGH();
//delay_nus(5);
//select data register
SPI_Write_Byte(0x58);//0101 1000

//read 3 times to get data
for(i=0;i<3;i++)
{
data=SPI_Read_Byte();
}

//SPI_SS_HIGH();
//caculate temperature value
tempCode|=((ulong)data[0])<<16;
tempCode|=((ulong)data[1])<<8;
tempCode|=(ulong)data[2];

//////////////////////////////////////////////
///下面为测试代码,输出总是出错
/////////////////////////////////////////////
Uart0_SendStr("tempCode=");
Uart0_SendStr(num2Str4(tempCode));
Uart0_SendStr("data[2]=");
Uart0_SendStr(num2Str3(data[2]));
Uart0_SendStr(",data[1]=");
Uart0_SendStr(num2Str3(data[1]));
Uart0_SendStr(",data[0]=");
Uart0_SendStr(num2Str3(data[0]));
Uart0_SendStr(" ");

//code=(2^23)*[(AIN*Gain/Vref)+1]
//2^23=8388608
//Ain=((tempCode/8388608)-1)*Vref/Gain;//get the voltage of AIN1
//convert the number to temperature
//do something here
//
SPI_SS_HIGH();
delay_nus(5);

return 1.0;
}
返回列表