TI中文支持网
TI专业的中文技术问题搜集分享网站

ADS1118 无法驱动

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

Carter Liu:

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

TongTong Sun SUN:

回复 Carter Liu:

 我是参考网上的例子写的。读不到寄存器,都回来的值要不都为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); }}

TongTong Sun SUN:

回复 TongTong Sun SUN:

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

Carter Liu:

回复 TongTong Sun SUN:

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

TongTong Sun SUN:

回复 Carter Liu:

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

TongTong Sun SUN:

回复 Carter Liu:

我再数据手册里面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?

Carter Liu:

回复 TongTong Sun SUN:

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

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

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

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

Carter Liu:

回复 TongTong Sun SUN:

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位

TongTong Sun SUN:

回复 Carter Liu:

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

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

1、cs拉低

2、写入16位命令

3、判断DOUT是否被拉低

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

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

TongTong Sun SUN:

回复 Carter Liu:

希望多多包涵

赞(0)
未经允许不得转载:TI中文支持网 » ADS1118 无法驱动
分享到: 更多 (0)