微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 硬件电路设计 > TI模拟硬件电路设计 > ads1118数据读取问题求急解!

ads1118数据读取问题求急解!

时间:10-02 整理:3721RD 点击:

我用1118芯片读数据时出了问题,就是我不管改config寄存器值还是AIN输入,他的输出都为定值,经排查读DOUT端口出了偏差(红色字体处未执行),我用的单端输入(0x758A)AIN输入为一个电平(可由电位器更改输入)急,望前辈们百忙中能抽空给我解答一下~拜托~万谢

/*配置寄存器,将指令写入配置寄存器,采样转换完成*/
void ADS1118_ADS_Config(unsigned int temp_config_value)
{
unsigned int Config_Value;
Config_Value = temp_config_value;
CS_L; // Set CS low
__delay_cycles(1600); // Wait for slave to initialize

ADS1118_WriteSPI(Config_Value,1);// 0模式为连续转换,转换的数据放入转换寄存器

__delay_cycles(1600); // Wait for slave to initialize
CS_H; // Set CS high
}

/*转换(写入config寄存器)*/
void ADS1118_WriteSPI(uint config,unsigned char mode)
{
CS_L;
uint temp;
uchar bit_ctr;
// MOSI_L;//DIN拉低,到clk为高(低)时输入
if(mode==1)temp = config | 0x8000;//mode==1,读数据并开始下次转换(OS位置高)
// __delay_cycles(20);//等待OS置高后数据的转换(860sps)
// temp &=0x7FFF;//OS置0转换完成
for(bit_ctr=0;bit_ctr<16;bit_ctr++) // 16位配置入config,DIN后开始转换
{
SCLK_L; // ..then set SCK low again
__delay_cycles(50);
if(temp&0x8000)
MOSI_H;
else
MOSI_L;
SCLK_H; // Set SCK high..
__delay_cycles(50);
temp = (temp << 1);
// if(MISO) temp++;
}
// SCLK_L;
// __delay_cycles(200);
// CS_H;
// __delay_cycles(200);
}

/*将数据读出(DOUT)*/
uint ADS1118_ADS_Read(void)
{
unsigned int Data=0;
int i;
int a[16];
// uint Config_Value;
// ADS1118_WriteSPI(0x75EA,1);
// CS_H;//停止转换
// __delay_cycles(200);//延时等待
// CS_L;
// __delay_cycles(1600);
SCLK_H;

if(!MISO){//如果DRDY为低,转换完成,则开始读取
for(i=0;i<16;i++)
{
SCLK_L;
__delay_cycles(50);//clk高延时
if(MISO) a[i]=1;
else a[i]=0;

SCLK_H;
__delay_cycles(50);//clk低延时
Data=Data*2+a[i];
}
}
//__delay_cycles(1600);

//CS_H;
return Data;
}

时钟跑快了,即使是最快的860模式,整个读的过程耗时也得1+ms

你可以先用示波器看一下MISO端能不能扑捉到有效信息,以确认你初始化没有问题,可以正常转换;然后在红字体这一段使用while循环,等待接收,直到接收完成再退出循环,如果正常,时间不会占用太久导致死机

上一篇:DAC7811
下一篇:1阶∑-Δ调制器

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top