微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 硬件电路设计 > TI模拟硬件电路设计 > ADS1118 无法驱动

ADS1118 无法驱动

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

最大的问题是当CS被拉低的时候,DOUT直接被拉高。导致读出来的数全部都为1.一直不理解这个是什么原因,求解答

初始化配置有问题吗?读寄存器有问题吗,还是只有转换过程有问题呢

 我是参考网上的例子写的。读不到寄存器,都回来的值要不都为0,要不很奇怪。我把代码贴在下面

ADS1118的驱动

#include "ADS1118.h"

void ADS1118_Init(void)//端口初始化,GPIOCLK
{
GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(ADS1118_CLOCK, ENABLE);

GPIO_InitStructure.GPIO_Pin = Pin_ADS1118_CS;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIO_ADS1118_CS, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = Pin_ADS1118_SCLK;
GPIO_Init(GPIO_ADS1118_SCLK, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = Pin_ADS1118_DIN;
GPIO_Init(GPIO_ADS1118_DIN, &GPIO_InitStructure);


GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Pin = Pin_ADS1118_DOUT;
GPIO_Init(GPIO_ADS1118_DOUT, &GPIO_InitStructure);

ADS1118_CS_1();
ADS1118_SCLK_1();
ADS1118_DIN_1();

}

u8 SPI_SendByte(u8 byte)
{
u8 i = 8;
u8 temp;
ADS1118_SCLK_1();
ADS1118_DIN_1();
while(i--)
{
if(byte&0x80)
ADS1118_DIN_1();
else
ADS1118_DIN_0();
ADS1118_SCLK_0();
byte<<=1;
delay_us(1);
ADS1118_SCLK_1();
delay_us(1);
if(DOUT_Set)
temp |= 1;
temp<<=1;
}
return temp;
}
u32 SPI_RW_Reg(u16 CofigReg)
{

u8 readdata1;
u8 readdata2;
u8 readdata3;
u8 readdata4;
u32 data;
readdata1=SPI_SendByte((uint8_t)(CofigReg>>8));
readdata2=SPI_SendByte((uint8_t)CofigReg);
readdata3=SPI_SendByte((uint8_t)(CofigReg>>8));
readdata4=SPI_SendByte((uint8_t)CofigReg);
data= ((uint32_t)readdata1<<8)|((uint32_t)readdata2);

//ads_cs_1();
return data;
}

主函数

#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "ads1118.h"
#include "delay.h"

u32 AdValue=0;
uint16_t count=0xC583;

int main(void)
{

delay_init(); //延时函数初始化
NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
uart_init(9600); //串口初始化为9600
LED_Init();
ADS1118_Init();
while(1)
{
LED1 =!LED1 ;
AdValue=SPI_RW_Reg(count);
printf ("%d\r\n",AdValue);
delay_ms(100);

}
}

有一句代码忘了附了,那个SPI发送一个bit是有一句把CS拉低

你这代码,并没有初始化配置寄存器的部分啊

AdValue=SPI_RW_Reg(count);     count数值为0xc583,这样做不行吗,配置寄存器是哪里弄的啊

我再数据手册里面19页看到这样一句话

When the PWDN bit in the Config Register is set to '1', the ADS1118 enters a lower power standby state. This condition is also the default state the ADS1118 enters when power is first supplied. In this mode, the ADS1118 uses no more than 2μA of current. During this time, the device responds to commands, but does not perform any data conversion. To exit this mode, simply write a '0' to the PWDN bit in the Config Register.

他说电源上电的时候PWDN位为1,想应命令但是不执行任何数据转换,这个地方是怎么理解呢 ,我在Config Register的十六位寄存器并没有看到PWDN?

你AdValue=SPI_RW_Reg(count); 只是做了初始化,且初始化了两遍,那么,你的读寄存器程序呢?在哪里有判断DRDY信号呢?

readdata1=SPI_SendByte((uint8_t)(CofigReg>>8));

readdata2=SPI_SendByte((uint8_t)CofigReg);这两句是读寄存器?不太对头吧

建议自己对照着数据手册写吧,网上写的是在太乱

When the MODE bit in the Config register is set to '1', the ADS1118 enters power-down state and is configured to operate in single-shot mode,不是PWDN位

看代码的那个意思就是在SPI_SendByte(u8 byte)里面发一位命令,Dout读一位数据,因为SPI协议规定的必须发送接收数据同时进行。

对于ADS1118,在第一次发送命令的过程中,数据是通过缓存到了Conversion Register,,DOUT发回原命令,等待数据准备完毕的时候,DOUT会被拉低。这个时候发送第二次命令,Dout发回上次转换 存在Conversion Register的数据,以后一直如此。

1、cs拉低

2、写入16位命令

3、判断DOUT是否被拉低

5、拉低了则写入16位命令,读取寄存器的值

不好意思,我是新手,参加电设比赛,问题有点多

希望多多包涵

不知道我上面的理解是不是对的?希望得到指正

我给你找个程序你参考一下吧,你可以留下你的邮箱哦

我昨晚已经把代码调通了,但是对于整个过程的理解可能还有点问题,我的邮箱是 ea2015810@163.com.麻烦你给我发一份。谢谢!

已发送,请查收

谢谢!

能给我发个参考程序吗?ADS1118,用模拟写协议的驱动程序

能给我发送一份代码吗 我也遇到了类似的问题 我的邮箱cyp0901@zju.edu.cn,非常感谢

我也是参考的这个代码,遇到了同样的问题,能把代码分享我一份吗,大神

我参考的也是那个代码,遇到了同样的问题,能发一份代码给我吗,大神   781189738@qq.com

我也遇到了, 跟上面朋友一样的问题,能发一份代码给我吗 781189738@qq.com

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

网站地图

Top