MSP430杂谈--AD7793硬件SPI驱动与模拟SPI驱动

发布者:清新心情最新更新时间:2019-12-17 来源: eefocus关键字:MSP430  AD7793  硬件SPI驱  模拟SPI驱动 手机看文章 扫描二维码
随时随地手机看文章

最近项目中用到了AD7793读取铂电阻值来得到相应的温度,编写了基于MSP430的硬件驱动程序和模拟驱动程序,并且能成功运行,现在记录一下分享给大家。


AD7793硬件IIC驱动完整版下载链接:https://download.csdn.net/download/qq_42580947/11041933


AD7793模拟IIC驱动完整版下载链接:https://download.csdn.net/download/qq_42580947/11041961


PS:目前资源积分无法自行调整,有谁知道可以修改积分的方法请告知,我想免费分享给大家。

 


1. AD7793硬件SPI驱动


单片机型号为:MSP430F57XX


硬件SPI驱动失败的几个原因有:单片机配置SPI资源错误(包括SPI的时钟,SPI的运行模型等配置错误),单片机的系统时钟配置错误(注意MCLK, SMCLK, ACLK的分配)


1.1 SPI read with AD7793


/******************** SPI read with AD7793 ***********************/

void AD7793_R(unsigned char addr, unsigned char *buffer, int n)

{

  unsigned int index;

  unsigned char temp;

  AD7793_CS_DIS;

  __delay_cycles(200); 

  AD7793_CS_EN;

  

  // t1>0ns

  __delay_cycles(200); 

 

  // send address

  while(!(UCB0IFG & UCTXIFG));              

    UCB0TXBUF = addr;

  while(!(UCB0IFG & UCRXIFG));            

    temp = UCB0RXBUF;

  // Delay > 10us, after writing to RAM

  Delay10us(2);  

  

  // Read data from register and load in buffer[]

  for(index=0; index < n; index++)

  {

    while(!(UCB0IFG & UCTXIFG));              

    UCB0TXBUF = 0x00;

    while(!(UCB0IFG & UCRXIFG));            

    buffer[index] = UCB0RXBUF;

    Delay10us(100);

  }

  

  AD7793_CS_DIS;

}

1.2 SPI write with AD7793


/******************** SPI write with AD7793 ***********************/

void AD7793_W(unsigned char addr, unsigned char *buffer, char n)

{

  unsigned char index;

  

  AD7793_CS_EN;

  

  // t1>0ns

  __delay_cycles(200); 

 

  // send address

  while(!(UCB0IFG & UCTXIFG));              

  UCB0TXBUF = addr;

  

  // Delay > 10us, after writing to RAM

  Delay10us(2);  

  

  // Read data from register and load in buffer[]

  for(index=0; index < n; index++)

  {

    while(!(UCB0IFG & UCTXIFG));            

    UCB0TXBUF = buffer[index];

  }

   AD7793_CS_DIS;  

}

1.3 AD7793 相关寄存器配置


/******************** AD7793 Configuration ***********************/

void AD7793_CON(void)

{

  AD7793_CS_EN;

  

  //single model

  SPI_Data[0] = 0x20;

  

  //64k intenal CLK,4.17Hz update rate(stable time 500ms)

  SPI_Data[1] = 0x0f;                   

 

  //Model regeister

  AD7793_W(0x08, SPI_Data, 2);

  

  AD7793_CS_DIS;  

}

1.4 电压测量


/******************** voltage measurement ***********************/

void V_measure (void)

{

 /*** Read the both sides voltage of RTD ***/

  

  //bioplar encoding, 8 times, input range 312.5mV

  //external reference voltage, buffer mode, AIN1 input

  AD7793_CON();

  SPI_Data[0] = 0x03;

  SPI_Data[1] = 0x10;                     

  AD7793_W(0x10, SPI_Data, 2);

  

  //IEXC1,IEXC2 connected with IOUT1,current is 210uA

  //IO register

  SPI_Data[0] = 0x0E;

  AD7793_W(0x28, SPI_Data, 1);

 

  //data register

  AD7793_R(0x58, SPI_Data, 3);

 

  //get the temperature values

  ad_result_T = SPI_Data[0];

  ad_result_T <<= 8;

  ad_result_T += SPI_Data[1];

  ad_result_T <<= 8;

  ad_result_T += SPI_Data[2];

  ad_result_T &= 0x00ffffff;

  ad_result_T -= 8388608;

  T =(float)ad_result_T*3.7104E-5;

  

 /*** Read the ambient temperature ***/

  

  //bioplar encoding, 8 times, input range 312.5mV

  //external reference voltage, buffer mode, AIN1 input

  SPI_Data[0] = 0x00;

  SPI_Data[1] = 0x86;                     

  AD7793_W(0x10, SPI_Data, 2);

 

  //data register

  AD7793_R(0x58, SPI_Data, 3);

 

  //get the ambient temperature

  ad_result_T1 = SPI_Data[0];

  ad_result_T1 <<= 8;

  ad_result_T1 += SPI_Data[1];

  ad_result_T1 <<= 8;

  ad_result_T1 += SPI_Data[2];

  ad_result_T1 &= 0x00ffffff;

  ad_result_T1 -= 8388608;

  Tenvir =(float)ad_result_T1*3.7104E-5;

}

2. AD7793模拟SPI驱动


模拟SPI驱动失败的最主要原因是:时钟!时钟!时钟!注意时钟的配置和延时的处理


2.1 AD7793基础子函数的处理


void AD7793_CS_SET()//CS置1

{

    P1OUT |= BIT1; 

}

void AD7793_CS_CLR()//CS置0

{

    P1OUT &=~ BIT1; 

}

void AD7793_SCLK_SET()

{

    P2OUT |= BIT2; 

}

void AD7793_SCLK_CLR()

{

    P2OUT &=~ BIT2; 

void AD7793_DIN_SET()

{

    P1OUT |= BIT6;

}

void AD7793_DIN_CLR()

{

    P1OUT &=~ BIT6;

}

unsigned int AD7793_DOUT_GET()

{

    unsigned int i;

    if(P1IN & BIT7)

      i = 1;

    else

      i = 0;

    return i;

}

2.2 向AD7793写入一个字节


void WriteToReg(unsigned char ByteData) //向AD7793写入一个字节

{

    unsigned char temp;

    unsigned char i;

    AD7793_CS_CLR();

    AD7793_SCLK_SET();

    temp=0x80;

    for(i=0;i<8;i++)

    {

        if((temp & ByteData)==0)

        {

            AD7793_DIN_CLR();

        }

        else

        {

            AD7793_DIN_SET();

        }

        AD7793_SCLK_CLR();

        Delay();

        AD7793_SCLK_SET();

        Delay();

        temp=temp>>1;

    }

    AD7793_CS_SET();

}

2.3 复位AD7793


void AD7793_Reset(void)//AD7793复位

{

    P1DIR |= BIT6;      

    P2DIR |= BIT2;

    P1DIR &=~ BIT7;

    

    unsigned int ResetTime;

    ResetTime = 32;

    AD7793_SCLK_SET();

    AD7793_CS_CLR();

    AD7793_DIN_SET();

    while(ResetTime--)

    {

        Delay();

        AD7793_SCLK_CLR();

        Delay();

        AD7793_SCLK_SET();

    }

    AD7793_CS_SET();

}

2.4 读取AD7793


unsigned char AD7793_ReadStatusRegister(void) //读取7793的状态寄存器

{

    unsigned char j;

    unsigned char temp;

    WriteToReg(0x40);

    AD7793_DIN_SET();

    AD7793_CS_CLR();

    temp=0;

    for(j=0; j<8; j++)

    {

        AD7793_SCLK_CLR();

        if(AD7793_DOUT_GET()==0)

        {

            temp=temp<<1;

        }

        else

        {

            temp=temp<<1;

            temp=temp+0x01;

        }

        Delay();

        AD7793_SCLK_SET();

        Delay();

    }

    AD7793_CS_SET();

    return temp;

}

2.5 配置相关寄存器


void Ad7793_WriteModeRegister(unsigned char ModeRegisterH,unsigned char ModeRegisterL)

//配置模式寄存器

{

    WriteToReg(0x08);

    WriteToReg(ModeRegisterH);

    WriteToReg(ModeRegisterL);

}

void Ad7793_WriteConfigRegister(unsigned char ConfigRegisterH,unsigned char ConfigRegisterL)

//配置配置寄存器

{

    WriteToReg(0x10);

    WriteToReg(ConfigRegisterH);

    WriteToReg(ConfigRegisterL);

}

void Ad7793_WriteIORegister(unsigned char IORegister)

//配置IO寄存器

{

    WriteToReg(0x28);

    WriteToReg(IORegister);

}

2.6 读取AD7793数据寄存器


long AD7793_ReadDataRegister(void)

{

union

{

    unsigned char chardata[3];

    unsigned long longdata;

}AD7793Result;

 

    unsigned char i,j;

    unsigned char temp;

    temp=AD7793_ReadStatusRegister();

    while((temp&0x80)==0x80)

    {

        temp=AD7793_ReadStatusRegister();

    }

    WriteToReg(0x58);

    AD7793_DIN_SET();

    AD7793_CS_CLR();

    for(i=0; i<3; i++)

    {

        for(j=0; j<8; j++)

        {

            AD7793_SCLK_CLR();

            if(AD7793_DOUT_GET()==0)

            {

                temp=temp<<1;

            }

            else

            {

                temp=temp<<1;

                temp=temp+0x01;

            }

 

        Delay();

        AD7793_SCLK_SET();

        Delay();

        }

        AD7793Result.chardata[3-i]=temp;

    }

    AD7793_CS_SET();

    AD7793Result.longdata=AD7793Result.longdata>>8;

    return AD7793Result.longdata;

}

2.7 初始化AD7793


void Init_AD7793(void)//AD7793的初始化

{

    AD7793_CS_SET();

    AD7793_Reset();

    Ad7793_WriteModeRegister(0x00,0x0F);//连续转换

    Ad7793_WriteConfigRegister(0x03,0x10);//292.5mv,1.65V偏压

    Ad7793_WriteIORegister(0x0E);

}



关键字:MSP430  AD7793  硬件SPI驱  模拟SPI驱动 引用地址:MSP430杂谈--AD7793硬件SPI驱动与模拟SPI驱动

上一篇:STM8L低功耗HALT模式一些总结
下一篇:MSP430杂谈--delay_cycles的精准延时

推荐阅读最新更新时间:2024-11-03 12:19

如何测量MSP430的功耗
众所周知,MSP430以其超低功耗而著称。但是很多用户反应,在实际应用中,测量MSP430的功耗时,测量结果和MSP430数据手册相差甚远。其实这里主要涉及到两方面的内容: 1. 如何使用MSP430合理的设计硬件和软件,使整个应用最大限度的达到低功耗? 2. 如何测量MSP430的功耗? 就如何测量MSP430功耗,我来分享一下我个人的经验。 一、未使用的GPIO的处理 为了使MSP430最大限度的达到低功耗,对于MSP430未使用的GPIO而言,应该将其设置为输出;或者是设置为输入,但是将管脚的电平固定,可以通过外部电路将管脚连接至Vcc或者GND,也可使能内部上下拉电阻,将管脚电平固定。 对于MSP430
[单片机]
如何测量<font color='red'>MSP430</font>的功耗
德州仪器推出46种铁电MSP430 MCU
充分利用具有集成智能模拟、扩展的扫描接口、LCD控制器以及最大内存可达128KB的超低功耗MSP430FR69x FRAM微控制器 日前,德州仪器(TI)宣布推出具有更大内存、更多功能和更高集成度的46种全新超低功耗MSP430™ FRAM微控制器(MCU),以帮助开发人员降低功耗、缩减材料清单和产品尺寸。TI的MSP430FR69x MCU具备可扩展性,最高非易失性FRAM内存可达128KB,并拥有智能模拟集成,如扩展的扫描接口(ESI)和转换速率在200KSPS时仅消耗140μA电流的差分输入模数转换器(ADC)。此外,开发人员还可利用集成的320段LCD控制器为自己的产品轻松添加显示器,也可利用256位高级加密标准
[物联网]
MSP430F449时钟
时钟源有LFXT1(低频或高频),XT2(高频),DCO(数控)。 时钟信号有ACLK(辅助时钟),SMCLK(子系统时钟),MCLK(系统时钟)。 ACLK由LFXT1驱动; SMCLK可由XT2,DCO之一驱动; MCLK可由LFXT1,XT2,DCO之一驱动; MSP430F449复位后,MCLK和SMCLK的驱动源为DCO,SMCLK=MCLK=32*ACLK=32*32768=1048576Hz。 fDCOCLK = D x (N + 1) x fACLK。 N的设置为SCFQCTL = N(N取值1~127); D的设置为SCFI0 = D(D取值FLLD_1,FLLD_2,FLLD_4,FLLD_8,即D=1,2
[单片机]
基于MSP430单片机的多路数据采集系统的设计
1 引 言 数据采集是从一个或多个信号获取对象信息的过程。随着微型计算机技术的飞速发展和普及,数据采集监测已成为日益重要的检测技术,广泛应用于工农业等需要同时监控温度、湿度和压力等场合。数据采集是工业控制等系统中的重要环节,通常采用一些功能相对独立的单片机系统来实现,作为测控系统不可缺少的部分,数据采集的性能特点直接影响到整个系统。本文设计的多路数据采集系统采用MSP430系列单片机作为MCU板的核心控制元件。MSP430系列单片机是由TI公司开发的16位单片机,其突出特点是强调超低功耗,非常适合于各种功率要求低的场合。该系统采样电路采用MSP430单片机内部12位的A/D,使系统具有硬件电路得以简单化,功耗低的特点。由于该系
[单片机]
基于<font color='red'>MSP430</font>单片机的多路数据采集系统的设计
MSP430的intrinsics.h详解
1.1.1 扩展关键字 1. asm 也可以写成 _asm。功能是在c程序中直接嵌入汇编语言。 asm(“string”); 其中string必须是有效的汇编语句。 2. __interrupt 放在函数前面,标志中断函数。下面这段程序是异步串行口UART0的接受中断函数。UART0RX_VECTOR为异步串行口UART0的接受中断向量。 举例: #pragma vector=UART0RX_VECTOR __interrupt void UARTO_R(void) { TXBUF0=RXBUF0; } 3. __monitor 放在函数前面,功能是当这一函数执行的时候自动关闭中断。应该尽量缩短这样的函数,否则,中断事件无法得到及
[单片机]
MSP430关键硬件电路设计要诀
众所周知,MSP430以其超低功耗而著称。但是很多用户反应,在实际应用中,测量MSP430的功耗时,测量结果和MSP430数据手册相差甚远。其实这里主要涉及到两方面的内容:   1. 如何使用MSP430合理的设计硬件和软件,使整个应用最大限度的达到低功耗?   2. 如何测量MSP430的功耗?   就如何测量MSP430功耗,我来分享一下我个人的经验。    一、未使用的GPIO的处理   为了使MSP430最大限度的达到低功耗,对于MSP430未使用的GPIO而言,应该将其设置为输出;或者是设置为输入,但是将管脚的电平固定,可以通过外部电路将管脚连接至Vcc或者GND,也可使能内部上下拉电阻,将管脚电平固定。
[模拟电子]
<font color='red'>MSP430</font>关键<font color='red'>硬件</font>电路设计要诀
初学MSP430——按键中断控制小灯翻转
** /* * Copyright (c)... * All rights reserved. * * 文件名称:main.c * 文件标识:NO * 硬件描述:开发板上P1.3接按键,P1.0接了LED(用跳线帽连接)。 * 功能描述:每次按下按键后,控制P1.0、P1.6 LED闪烁情况 * * 当前版本:V1.0 * 作者:输入作者(或修改者)名字 * 完成日期:2015年2月6日 * * 取代版本:NO * 原作者:TI * 完成日期:2013-4-8 */ #include MSP430G2553.h //-----在main()函数前提前申明子函数----- void P1_IODect();
[单片机]
基于MSP430的电子纸驱动接口设计
  1 引言   电子纸(ePaper)是新一代的显示装置,其对比度超高,超低功耗,超薄,且可任意弯曲折叠,柔韧性良好。电子纸的应用出现急速扩大,应用于超市价格标签、在手机、电子书阅读器。电子纸已成为继液晶与OLED之后便携式电子装置使用的新型显示技术。这里提出一种采用MSP43OF413单片机的电子纸驱动接口设计方案。MSP430F413自带LCD显示单元,在软件设计中可将其显示内存作为刷新电子纸显示的内存,从而节约MCU的内存资源。   2 电子纸硬件设计   主控制器MSP430F413单片机是一种超低功耗混合信号16位单片机系列,采用16位精简指令系统,125 ns指令周期,大部分指令在一个指令周期内完成,16
[嵌入式]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved