haohai 发表于 2012-4-24 13:54:32

如何读取ADS8332的值,求指导!

最近用到TI的8通道16位高速ADC,调试两天没成功,求高人贴上程序!!

haohai 发表于 2012-4-24 21:36:14

我是用MSP430F149模拟SPI写的!没调出来,烦呀!

lingjun1015 发表于 2013-8-15 20:10:57

楼主,成功了吗?数据手册看了看,还是不知道怎么往里面写配置信息和读数据!!!!!!!!!!!!!!!!

yongke 发表于 2013-11-12 13:02:23

你的程序贴出来?

sunshulin 发表于 2013-11-19 14:29:03

yongke 发表于 2013-11-12 13:02 static/image/common/back.gif
你的程序贴出来?

这是很久以前写的 可以参考参考#include "msp430.h"
/***************************************************************************
//IO口操作宏定
****************************************************************************/
#define SET 1
#define RESET 0
#define _ADD_STR(a, b)            a##b
#define ADD_STR(a, b)               _ADD_STR(a, b)
#define _IO_PORT_IN(PORT)         (PORT##IN)
#define GPIO_READ_BITS(PORT, BIT)   ( (_IO_PORT_IN(PORT) & BIT) ? (SET):(RESET))
#define GOIO_READ_PORTS(PORT)       ( _IO_PORT_IN(PORT) )
#define _IO_PORT_OUT(PORT)          (PORT##OUT)
#define GPIO_SET_BITS(PORT, BIT)    ( ( _IO_PORT_OUT(PORT) ) |= (BIT) )
#define GPIO_RESET_BITS(PORT, BIT)( ( _IO_PORT_OUT(PORT) ) &= ~(BIT) )
#define _IO_PORT_DIR(PORT)          (PORT##DIR)
#define GPIO_OUTPUT_DIR(PORT, BIT)( ( _IO_PORT_DIR(PORT) ) |= (BIT) )
#define GPIO_INPUT_DIR(PORT, BIT)   ( ( _IO_PORT_DIR(PORT) ) &= ~(BIT) )
#define _IO_PORT_IE(PORT)         (PORT##IE)
#define GPIO_ENABLE_IRQ(PORT, BIT)( ( _IO_PORT_IE(PORT) ) |= (BIT) )
#define GPIO_DISABLE_IRQ(PORT, BIT) ( ( _IO_PORT_IE(PORT) ) &= ~(BIT) )
#define _IO_PORT_SEL(PORT)          (PORT##SEL)
#define GPIO_PORT_FUNC(PORT, BIT)   ( ( _IO_PORT_SEL(PORT) ) |= (BIT) )
#define GPIO_MULTI_FUNC(PORT, BIT)( ( _IO_PORT_SEL(PORT) ) &= ~(BIT) )
#define TEST_BIT(x)( GPIO_READ_BITS( ADD_STR(x, _PORT), ADD_STR(x, _BIT) ) )
#define SET_BIT(x)   ( GPIO_SET_BITS( ADD_STR(x, _PORT), ADD_STR(x, _BIT) ) )
#define CLR_BIT(x)   ( GPIO_RESET_BITS( ADD_STR(x, _PORT), ADD_STR(x, _BIT) ) )
#define BIT_OUT(x)   ( GPIO_OUTPUT_DIR( ADD_STR(x, _PORT), ADD_STR(x, _BIT) ) )
#define BIT_IN(x)    ( GPIO_INPUT_DIR( ADD_STR(x, _PORT), ADD_STR(x, _BIT) ) )
#define EINT_BIT(x)( GPIO_ENABLE_IRQ( ADD_STR(x, _PORT), ADD_STR(x, _BIT) ) )
#define DINT_BIT(x)( GPIO_DISABLE_IRQ( ADD_STR(x, _PORT), ADD_STR(x, _BIT) ) )
/***************************************************************************
//命令寄存器 (CMR)
****************************************************************************/
#define Channel_0    0x0000//Select analog input channel 0
#define Channel_1    0x1000//Select analog input channel 1
#define Channel_2    0x2000//Select analog input channel 2
#define Channel_3    0x3000//Select analog input channel 3
#define Channel_4    0x4000//Select analog input channel 4
#define Channel_5    0x5000//Select analog input channel 5
#define Channel_6    0x6000//Select analog input channel 6
#define Channel_7    0x7000//Select analog input channel 7
#define WAKE_UP      0xB000//Wake up
#define READ_CFR   0xC000//Read CFR
#define READ_DATA    0xD000//Read data
#define WRITE_CFR    0xE000//Write CFR
#define DEFAULT_CFR0xF000//Default mode
/***************************************************************************
//配置寄存器 (CFR)
****************************************************************************/
#define AUTO_CHAN      0x0800//Channel select mode
#define CCLK_INT         0x0400//Conversion clock (CCLK) source select
#define MAN_TRG          0x0200//Trigger (conversion start) select
#define SAT            0x0100//Sample rate for Auto-Trigger moden
#define POL_INT_EOC_LOW0x0080//Pin 10 polarity select when used as an
#define PIN10_EOC      0x0040//Pin 10 polarity select when used as an
#define PIN10_OUTPUT   0x0020//Pin 10 I/O select for daisy-chain mode operation
#define ANAP_DISABLE   0x0010//Auto-Nap Power-Down enable/disable
#define RESUME_NAP       0x0008//Nap Power-Down.
#define RESUME_DEEP      0x0004//Deep Power-Down
#define TAG            0x0002//TAG bit output enable
#define NO_RESET         0x0001//Software reset
//LCD 常用指令
#define SYSDIS             0x00// 关振系统荡器和LCD偏压发生器
#define SYSEN            0x01// 打开系统振荡器
#define LCDOFF             0x02// 关LCD偏压
#define LCDON            0x03// 打开LCD偏压
#define BIASCOM            0x29// 1/3 偏置 4 位公共端
/***************************************************************************
//IO扣定义
****************************************************************************/
#define NSS_PORT       P2
#define NSS_BIT      BIT0
#define SCLK_PORT      P2
#define SCLK_BIT       BIT5
#define MISO_PORT      P2
#define MISO_BIT       BIT3
#define MOSI_PORT      P1
#define MOSI_BIT       BIT6
#define RST_PORT       P2
#define RST_BIT      BIT1
#define CONV_PORT      P2
#define CONV_BIT       BIT2
#define INT_PORT       P1
#define INT_BIT      BIT3

/*****************************************************************
管脚分配 CS P1.0 WR P1.1 DAT P1.2
*****************************************************************/
#define LCD_CS_PORT    P2    //LCD使能引脚
#define LCD_CS_BIT   BIT4//LCD使能引脚
#define LCD_WR_PORT    P2    //LCD时钟引脚
#define LCD_WR_BIT   BIT5//LCD时钟引脚
#define LCD_Data_PORTP2    //LCD数据引脚
#define LCD_Data_BIT   BIT3//LCD数据引脚

float Voltage=0.0;
unsigned charDIS_BUF;//显示缓冲区
//段码解码表                            0    1    2    3    4    5    6    7    8    9    -    E    R   空
const    unsigned char      DIS[] = {0xD7,0x06,0xE3,0xA7,0x36,0xB5,0xF5,0x07,0xF7,0xB7,0x20,0xF1,0x51,0x00};
/****************************************************************************
* 名    称:void ADS8332_IO_INT(void)
* 功    能:ADS8332驱动IO口初始化
* 入口参数:无
* 出口参数:无
* 说    明:
* 调用方法:ADS8332_IO_INT();
****************************************************************************/
void ADS8332_IO_INT(void)
{
BIT_OUT(NSS);
SET_BIT(NSS);
BIT_OUT(SCLK);
CLR_BIT(SCLK);//常态为低电平
BIT_OUT(MOSI);
SET_BIT(MOSI);
BIT_OUT(RST);
SET_BIT(RST);
BIT_OUT(CONV);
SET_BIT(CONV);
BIT_IN(INT);
BIT_IN(MISO);
}
/****************************************************************************
* 名    称:void Delay(unsigned int n)
* 功    能:通用延时
* 入口参数:无
* 出口参数:无
* 说    明:
* 调用方法:Delay(1000);
****************************************************************************/
void Delay(unsigned int n)
{
for(;n>0;n--);
}
/*
*********************************************************************************************************
*                                                Write_LCD_Byte()
* Description : 向 LCD 写一字节
*
* Arguments   : Data 数据 Length 数据长度
*
* Returns   :
*********************************************************************************************************
*/
void Write_LCD_Byte(unsigned char Data,unsigned char Length)
{
unsigned char i,Temp=0x80;
for (i=0;i<Length;i++)
{
    CLR_BIT(LCD_WR);    //“写”时钟置0
    if (Data&Temp)
    SET_BIT(LCD_Data);//数据线置1
    else
    CLR_BIT(LCD_Data);//数据线置0
    Temp>>=1;       //准备下一位
    SET_BIT(LCD_WR);   //“写”时钟置1
    Delay(100);    //等待完成
}
SET_BIT(LCD_Data);   //数据线置高 可减少IO口漏电流损耗
}
/*
*********************************************************************************************************
*                                                Write_LCD_Data()
* Description : 向 LCD 写数据
*
* Arguments   : Address 写数据地址Data 数据
*
* Returns   :
*********************************************************************************************************
*/
void Write_LCD_Data(unsigned char Address,unsigned char Data)
{
CLR_BIT(LCD_CS);               //片选置0
Write_LCD_Byte(0xA0,3);   //写入写数据的ID 101 高3位有效
Write_LCD_Byte(Address,6);//写入6个位初始地址 高6位有效
Write_LCD_Byte(Data,4);   //写入4个位数据 高4位有效
SET_BIT(LCD_CS);               //片选置1
}
/*
*********************************************************************************************************
*                                                Write_LCD_Command()
* Description : 向 LCD 写命令
*
* Arguments   : Command 命令
*
* Returns   :
*********************************************************************************************************
*/
void Write_LCD_Command(unsigned char Command)
{
    CLR_BIT(LCD_CS);                //片选置0
    Write_LCD_Byte(0x80,3);    //写入命令的ID:100
    Write_LCD_Byte(Command,8); //写入实际命令的高8位(CMD.):C8-C1
    SET_BIT(LCD_Data);            //|写入一个“1”即手册上所指“无关位”的那一个数据位
    CLR_BIT(LCD_WR);                //|
    Delay(100);                  //|
    SET_BIT(LCD_WR);                //|
    SET_BIT(LCD_CS);                //片选置1
}
/*
*********************************************************************************************************
*                                                DisCharacter()
* Description : 显示字符函数
*
* Arguments   : *Data显示内容指针 Address 显示首位置   Length内容长度
*
* Returns   :
*********************************************************************************************************
*/
void DisCharacter(unsigned char *Data,unsigned char Address,unsigned char Length,unsigned char Point)
{
unsigned char i,Temp;
for(i=0;i<Length;i++)
{
    Temp=DIS[*Data];                     //数据解析
    Write_LCD_Data((Address*8-4),Temp);    //写高4位数据
    if(i==(Point-1)) Temp=Temp|0x08;       //小数点位判别
    Write_LCD_Data((Address*8),Temp<<=4);//写低4位数据
    Data ++;                               //显示数据指针增一
    Address ++;                            //显示地址增一
}
}
/*
*********************************************************************************************************
*                                                LCD_INIT()
* Description : LCD IO口、设置初始化及清屏
*
* Arguments   :
*
* Returns   :
*********************************************************************************************************
*/
void LCD_INIT( void )
{
unsigned char i;
BIT_OUT ( LCD_Data );      //|IO口初始化
BIT_OUT ( LCD_CS );       //|
BIT_OUT ( LCD_WR );       //|
SET_BIT ( LCD_CS );       //|
SET_BIT ( LCD_WR );       //|
SET_BIT ( LCD_Data );   //|
Write_LCD_Command(SYSEN);// 打开系统振荡器
Write_LCD_Command(LCDON);// 打开LCD显示
Write_LCD_Command(BIASCOM);// 设置驱动方式
for(i=0;i<80;i++) Write_LCD_Data(i,0x00);//清屏
}
/*
*********************************************************************************************************
*                                                Displays_Decoded()
* Description : 显示解码函数
*
* Arguments   : float DIS_Temp 待显示的数值
*
* Returns   :
*********************************************************************************************************
*/
void Displays_Decoded(float DIS_Temp)
{
unsigned long Temp;
unsigned char i;
if(DIS_Temp<0)//负号判断
{
    DIS_Temp=-DIS_Temp;
    DIS_BUF=10;//设置负号
}
else
    DIS_BUF=13;//清除负号
if(DIS_Temp>=10000)
    i=0;
else if(DIS_Temp>=1000)
{
    DIS_Temp=DIS_Temp*10;
    i=5;
}
else if(DIS_Temp>=100)
{
    DIS_Temp=DIS_Temp*100;
    i=4;
}
else if(DIS_Temp>=10)
{
    DIS_Temp=DIS_Temp*1000;
    i=3;
}
else
{
    DIS_Temp=DIS_Temp*10000;
    i=2;
}
Temp = (unsigned long) DIS_Temp;
DIS_BUF=Temp/10000;
Temp=Temp%10000;
DIS_BUF=Temp/1000;
Temp=Temp%1000;
DIS_BUF=Temp/100;
Temp=Temp%100;
DIS_BUF=Temp/10;
Temp=Temp%10;
DIS_BUF=Temp/1;
DisCharacter(DIS_BUF,0x00,0x06,i);//显示计数值
}
/****************************************************************************
* 名    称:void ADS8332_SPI_ReadWrite(unsigned int Data)
* 功    能:模拟SPI读写
* 入口参数:unsigned int Data 被写入数据
* 出口参数:unsigned int Temp 读出数据
* 说    明:Data = ADS8332_SPI_ReadWrite(0x1234)
****************************************************************************/
unsigned int ADS8332_SPI_ReadWrite(unsigned int Data)
{
unsigned char i;
unsigned int Temp=0x0000;
CLR_BIT(NSS);//片选使能
for(i=0;i<16;i++)//寄存器为16Bit
{
    if(Data&0x8000)
      SET_BIT(MOSI);
    else
      CLR_BIT(MOSI);
    Delay(0x08);
    Temp <<= 0x01;//先读取高位
    Data <<= 0x01;//先从高位传输
    if(TEST_BIT(MISO))Temp|=0x01;//片选之后 第一 Bit 就已经输出了
    SET_BIT(SCLK);//下降沿有效
    CLR_BIT(SCLK);//常态为低电平
}
SET_BIT(NSS);
return Temp;
}
/****************************************************************************
* 名    称:void ADS8332_Initi(void)
* 功    能:ADS8332 初始化
* 入口参数:
* 出口参数:
* 说    明:ADS8332_Initi(void)
****************************************************************************/

void ADS8332_Init(void)
{
unsigned int Config=0x0000,Temp;
ADS8332_IO_INT();//IO口初始化
CLR_BIT(RST);//复位ADS8332
Delay(0xFFFF);
SET_BIT(RST);
Delay(0xFFFF);
Config |= WRITE_CFR;//配置工作模式具体见手册
Config |= CCLK_INT;
Config |= MAN_TRG;
Config |= SAT;
Config |= POL_INT_EOC_LOW;
Config |= PIN10_OUTPUT;
Config |= ANAP_DISABLE;
Config |= RESUME_NAP;
Config |= RESUME_DEEP;
Config |= NO_RESET;
ADS8332_SPI_ReadWrite(Config);//写配置寄存器
Delay(0xFFFF);Delay(0xFFFF);Delay(0xFFFF);
Temp = ADS8332_SPI_ReadWrite(READ_CFR);//读配置寄存器
while(!((Temp&0x0FFF)==(Config&0x0FFF)));//比较写入和读出结果 相同则通过 不同则停在此处 应加其他处理
}
void main( void )
{
unsigned long Temp;
WDTCTL = WDTPW + WDTHOLD;
BCSCTL1 = CALBC1_8MHZ;//Set DCO to 1, 8, 12 or 16MHz
DCOCTL= CALDCO_8MHZ;//如果用其他频率 相应延时要做调整
LCD_INIT();//初始化液晶屏
ADS8332_Init();//初始化 ADS8332
P1DIR |= BIT6;
for(;;)
{
    ADS8332_SPI_ReadWrite(Channel_0);//选择通道0 每读一次设置一次 不然通道无效
    Delay(0x0F);
    CLR_BIT(CONV);//启动转换
    Delay(0x0F);
    SET_BIT(CONV);
    Delay(0x0F);
    while(TEST_BIT(INT)==1);//等待转换完成标志 应加超时判断 或者中断方式处理
   
    ADS8332_SPI_ReadWrite(READ_DATA);//读上一组数据 必须有不然读出数据错误
    Temp=ADS8332_SPI_ReadWrite(READ_DATA);//读本次转换数据 并且累加

    Voltage=Temp/65535.0*2.5;//计算电压 参考电压 2.5V
   
    //Voltage = (Voltage*1000.0 - 509.0) / 2.64; //VTEMP PIN = 509mV + 2.64 × T(°C) 测量 REF5025 温度输出 具体见参考手册
   
    Displays_Decoded(Voltage);//显示电压值
    P1OUT ^= BIT6;
    Delay(0xFF);
}
}
页: [1]
查看完整版本: 如何读取ADS8332的值,求指导!