新手求解关于MSP430F5529控制ADS1115的问题
刚学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正常通信