微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 硬件电路设计 > TI模拟硬件电路设计 > MSP430169硬件IIC调式ADS1115读数错误?

MSP430169硬件IIC调式ADS1115读数错误?

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

程序如下

#include <msp430f169.h>
#include"Init_clk.h"
#include"cryfuncs.h"
#include"ADS1115.h

void main( )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
Init_clk();
Ini_Lcd(); //LCD初始化
showADS1115();

P3SEL |= 0x0A;                            // Select I2C pins
U0CTL |= I2C + SYNC;              // Recommended init procedure
U0CTL &= ~I2CEN;                    // Recommended init procedure
I2CTCTL |= I2CSSEL1;             // SMCLK, transmit
I2CNDAT = 0x03;                      // Write Three bytes
I2CSA = 0x48;                           // Slave Address is 1001000
U0CTL |= I2CEN;                     // Enable I2C

Confige_1115(0); //通道选择
while(1)
{

Point_reg(); 
value=Read_1115(); 
}

}

/**************************************************************************************************/

void Confige_1115(uchar channel )
{
uchar chan;
switch(channel)
{
case 0: chan = 0xc4; break;//11000100
case 1: chan = 0x52; break;//01010010
case 2: chan = 0x62; break;//01100010
case 3: chan = 0x72; //01110010
}
U0CTL |= MST;                                           // Master mode
I2CTCTL |= I2CSTT+I2CSTP+I2CTRX; // Initiate transfer
//I2CNDAT = 0x03;
while ((I2CIFG & TXRDYIFG) == 0);      // Wait for transmitter to be ready
I2CDRB = 0x01;                                        // Points to config register
while ((I2CIFG & TXRDYIFG) == 0);     // Wait for transmitter to be ready
I2CDRB = chan;                                       // Load Control Byte
while ((I2CIFG & TXRDYIFG) == 0);     // Wait for transmitter to be ready    /***之前还会卡在这里,后来突然就好了,不得解****/
I2CDRB = 0x83;                                       // Load Control Byte
while ((I2CTCTL & I2CSTP) == 0x02); // To prevent Arbitration Lost
}

/**********************************************************************************************/

uint Read_1115(void)
{
float Voltage;
uint ctlbyte;

U0CTL |= MST;                                      // Master mode
I2CTCTL = I2CSTT+I2CSTP;              // Initiate transfer
I2CNDAT = 0x02;  
while ((I2CIFG & RXRDYIFG) == 0); // Wait for Receiver to be ready
ctlbyte = I2CDRB;                                 // Receive MSByte from DAC
ctlbyte = ctlbyte << 8;
while ((I2CIFG & RXRDYIFG) == 0); // Wait for Receiver to be ready
ctlbyte = ctlbyte + I2CDRB;                  // Receive LSByte from DAC
while ((I2CTCTL & I2CSTP) == 0x02); // Wait for Stop Condition

Voltage=ctlbyte*2.048/32768;
Disp_float_num(1,2,Voltage);

return ctlbyte;
}

/****************************************************************************************************/

void Point_reg(void)
{
U0CTL |= MST;                                           // Master mode
I2CTCTL |= I2CSTT+I2CSTP+I2CTRX; // Initiate transfer
I2CNDAT = 0x01;
while ((I2CIFG & TXRDYIFG) == 0);       // Wait for transmitter to be ready
I2CDRB = 0x00; // Points to conversin register
while ((I2CTCTL & I2CSTP) == 0x02);  // Wait for Stop Condition
}

/*************************************************************************************/

void showADS1115(void)
{
Send(0,0x01); /*清屏,将DDRAM的位址计数器调整为“00H”*/
Disp_HZ(0x80,"A=",1);
}

为什么会读不了数?求救QAQ

AIN0什么都不接,读数是4398 接了一个直流电源以后就会不停地跳数但是没有一个对的

而且不论直流电源有没有输出都会跳,为什么?

请先检查硬件电路连接是否正常

然后再检查读写时序是否正常,推荐用示波器查看时序然后与书册中的对照

可以读写个寄存器,比如说Config Register,以判断读写时序是否正常

showADS1115();在何时更新?

showADS1115();只初始化一次(A=      ),显示数据的代码在Read1115();里面

读到数了,接地有问题

但是想不明白

while ((I2CIFG & TXRDYIFG) == 0);     // Wait for transmitter to be ready    /***之前还会卡在这里,后来突然就好了,不得解****/
I2CDRB = 0x83;                                       // Load Control Byte

之前执行到while这里的时候I2CIFG会变成0,为什么?

I2C总线错误可能会导致状态寄存器更新失败吧,我觉得。你的上拉电阻和电源是否合适?

8168.ADS1115原理图.pdf

 直接买的模块0 0,电源是单片机的3.3V

这个模块的某些部分似乎有点问题(通道4读数直接衰减了一半...),估计做的不是太好。。送了一个149的软件IIC例程调不通才自己写的硬件IIC

不过读数问题已经解决啦,O(∩_∩)O谢谢

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

网站地图

Top