微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 硬件电路设计 > TI模拟硬件电路设计 > 新手求解关于MSP430F5529控制ADS1115的问题

新手求解关于MSP430F5529控制ADS1115的问题

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

刚学430F5529不久 现在要用5529IO口模拟I2C控制ADS1115。但是在窗口中查看读取值的时候要么是0 要么是65535 我在通道0加入了3.3V电压。是不是我的程序有什么问题。

main.c:

#include <msp430f5529.h>
#include"Init_clk.h"
#include"ADS1115.h"
#include"I2C.h"
unsigned int value;

void main( )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
Init_clk();
Confige_1115(0); //通道选择
Point_reg();
value=Read_1115();
while(1);
}

I2C.h:

#ifndef I2C_H_
#define I2C_H_


#define SCL_Out P2DIR |=BIT0 //SCL设置为输出模式
#define SCL_H P2OUT |= BIT0 //P2^0高电平
#define SCL_L P2OUT &= ~BIT0 //P2^0低电平

#define SDA_H P2OUT |= BIT6 //P2^1高电平
#define SDA_L P2OUT &= ~BIT6 //P2^1低电平

#define SDA_In P2DIR &=~BIT6 //SDA改成输入模式
#define SDA_Out P2DIR |=BIT6 //SDA变回输出模式

void start();
void stop();
void Send1byte(unsigned int byte);
unsigned int Read1byte();

#endif /* I2C_H_ */

i2c.c:

/*
* I2C.c
*
* Created on: 2015年7月27日
* Author: huangjiyi
*/
#include <msp430f5529.h>
#include"ADS1115.h"
#include "I2C.h"
typedef unsigned char uchar;
typedef unsigned int uint;
unsigned int Initdata[4]={0};
/**************起始信号***************/
void start()
{
SDA_Out;
SDA_L;
SCL_Out;
SCL_H;
SDA_H;
SDA_L;
SCL_L;
}
/*************终止信号*************/
void stop()
{ SDA_Out;
SDA_L;
SCL_H;
SDA_H;
}
/*************向I2C总线发送一个字节************/
void Send1byte(uint byte)
{
uint i;
SDA_Out;
for(i=0;i<8;i++)
{

if((byte<<i) & 0x80)
SDA_H;
else
SDA_L;
SCL_H;
SCL_L;
}
SDA_H;
SCL_H;
SCL_L;
}
/**************读取一个字节**************/
uint Read1byte()
{
uint temp=0,i;
SDA_In;
for(i=0;i<8;i++)
{
temp=temp<<1;
SCL_L;
SCL_H;
if(P2IN&0x40)
{
temp|=0x01;
}

}
SDA_Out;
SCL_L;
SDA_L;
SCL_H;
SCL_L;
SDA_H;
return temp;
}

ads1115.c:

/*
* ads1115.c
*
* Created on: 2015年7月27日
* Author: huangjiyi
*/
#include <msp430f5529.h>
#include "I2C.h"
typedef unsigned char uchar;
typedef unsigned int uint;
extern unsigned int Initdata[4];
uint result_gd=0;
uchar ResultL,ResultH;
uint Result;
/*******************Config寄存器*********************/
void Confige_1115(uchar channel )
{
uchar i=0;
switch(channel)
{
case 0: Initdata[2] = 0xc2; break;
case 1: Initdata[2] = 0x52; break;
case 2: Initdata[2] = 0x62; break;
case 3: Initdata[2] = 0x72;
}
Initdata[0] =0x90; // 启动配置命令
Initdata[1] =0x01; // 指向配置寄存器
Initdata[3] =0x83; // 配置字低字节
SCL_H;
start();
for(i=0;i<4;i++)
{
Send1byte(Initdata[i]);
_NOP();
}
stop();
}
/************指向转换结果寄存器***************/
void Point_reg(void)
{
uchar i=0;
Initdata[0] =0x90; // 地址 + 写命令
Initdata[1] =0x00; // 指向转换结果寄存器
SDA_Out;
SCL_H;
start();
for(i=0;i<2;i++)
{
Send1byte(Initdata[i]);
}
stop();
}
/**************读取转换结果***************/
uint Read_1115(void)
{

SCL_H;
start();
Send1byte(0x91);
ResultH=Read1byte();
ResultL=Read1byte();
stop();
Result=ResultH*256+ResultL;
return Result;
}

ads1115.h:

#ifndef ADS1115_H_
#define ADS1115_H_

void Confige_1115(unsigned char channel);
void Point_reg(void);
unsigned int Read_1115(void);

#endif /* ADS1115_H_ */

init_clk.c:

#include "msp430f5529.h"
#include"Init_clk.h"
#define CPU_F ((double)800000)
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))
void Init_clk()
{


volatile unsigned int i;

/*------选择系统主时钟为8MHz-------*/
UCSCTL3 = SELREF_2; // Set DCO FLL reference = REFO
UCSCTL4 |= SELA_2; // Set ACLK = REFO
UCSCTL0 = 0x0000; // Set lowest possible DCOx, MODx
//检测晶振是否发生故障失效,并清除故障失效标志位
do
{
UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG);
// Clear XT2,XT1,DCO fault flags
SFRIFG1 &= ~OFIFG; // Clear fault flags
}while (SFRIFG1&OFIFG); // Test oscillator fault flag

__bis_SR_register(SCG0); // Disable the FLL control loop
UCSCTL1 = DCORSEL_5; // Select DCO range 16MHz operation
UCSCTL2 |= 249; // Set DCO Multiplier for 8MHz
// (N + 1) * FLLRef = Fdco
// (249 + 1) * 32768 = 8MHz
__bic_SR_register(SCG0); // Enable the FLL control loop
__delay_cycles(600000);

}

init_clk.h

#ifndef INIT_CLK_H_
#define INIT_CLK_H_


void Init_clk();

#endif /* INIT_CLK_H_ */

新手求知道  T.T

读取值的时候, 要么是0 要么是65535

这么看, 估计硬件连接还存在问题吧, 先找示波器验证一下时序吧.

建议先尝试一下读写 ”Config Register’, 看看能否与ADC正常通信

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

网站地图

Top