历史上的今天
返回首页

历史上的今天

今天是:2024年12月17日(星期二)

正在发生

2019年12月17日 | MSP430杂谈--AD7793硬件SPI驱动与模拟SPI驱动

2019-12-17 来源:eefocus

最近项目中用到了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);

}



推荐阅读

史海拾趣

客益(Guestgood)公司的发展小趣事

机顶盒,全称为数字视频变换盒(Set Top Box,简称STB),是现代家庭娱乐中不可或缺的重要设备。它作为连接电视机与外部信号源的桥梁,主要功能在于接收数字电视信号,并将其转换成适合在电视机上播放的格式。机顶盒不仅能接收来自有线电缆、卫星天线、宽带网络及地面广播的信号,还具备强大的媒体处理能力和交互功能,极大地丰富了用户的观看体验。

从技术层面看,机顶盒经历了从模拟到数字的飞跃式发展。早期的机顶盒主要用于有线电视网络的信号解扰,而现代机顶盒则支持高清、甚至4K超高清视频内容的播放,为用户带来更为细腻的画面和震撼的音效。此外,机顶盒还集成了网络交互功能,用户可以通过机顶盒连接到互联网,享受在线购物、观看网络视频、玩游戏等多元化服务,使电视机从单向接收信息的设备转变为智能互动终端。

随着科技的进步,机顶盒的功能和应用场景也在不断扩展。例如,一些先进的机顶盒支持智能语音控制,用户可以通过语音指令搜索节目、调整设置,极大地提升了使用的便捷性。同时,机顶盒还具备存储功能,用户可以将喜欢的媒体文件存储在机顶盒中,随时通过电视屏幕进行观看,享受个性化的娱乐体验。

综上所述,机顶盒作为家庭娱乐的重要组成部分,不仅承载着传输和显示数字视频信号的基本功能,还通过不断的技术创新和应用拓展,为用户提供了更加丰富、便捷、智能的观影体验。随着技术的不断进步和市场的不断扩大,机顶盒将继续在家庭娱乐领域发挥重要作用。

EVER-WAY公司的发展小趣事

随着公司规模的扩大和产品质量的提升,EVER-WAY公司开始积极拓展国内外市场。公司制定了详细的市场拓展计划,通过参加国际展会、开展国际贸易合作等方式,逐步打开了国际市场的大门。同时,公司还加强了与国内客户的合作,通过提供定制化服务、优化供应链管理等方式,赢得了客户的信任和支持。这些市场拓展的跨越不仅为公司带来了更多的商业机会,也进一步提升了公司的品牌价值和市场地位。

FWBELL公司的发展小趣事
如MOSFET、晶体管等,用于执行充电控制芯片的指令,调节充电电流。
广东奥科公司的发展小趣事

随着电子技术的快速发展,广东奥科公司意识到只有不断创新才能在市场中立足。公司加大了对研发的投入,引进了一批高素质的研发人才,并建立了完善的研发体系。经过多次尝试和实验,广东奥科公司成功开发出了多款具有创新性和竞争力的电子产品,这些产品不仅性能卓越,而且设计独特,深受消费者的喜爱。这些技术突破和产品创新为广东奥科公司赢得了市场的认可,也推动了公司的快速发展。

GE Industrial Solutions公司的发展小趣事
光耦的隔离作用虽然能减少电气噪声的干扰,但光耦本身也可能引入噪声。解决方法包括选择低噪声的光耦,或在电路中加入滤波电路。
动运科技(DONGWOON)公司的发展小趣事

在全球化的大背景下,企业之间的合作与共赢成为了一种趋势。动运科技积极寻求与全球知名企业的战略合作,共同推动电子行业的发展。例如,公司与香港希荻微的合作就是一个典型的例子。通过独占许可的方式,希荻微获得了动运科技在中国大陆及港澳台地区生产、销售与自动对焦及光学防抖技术相关的产品的权利,并有权使用授权技术进行技术改进及新产品研发。这一合作不仅为双方带来了互利共赢的机会,也为整个电子行业的发展注入了新的活力。

问答坊 | AI 解惑

uCOS-ii for S3c44b0x

我这有很多关于uCOS-II藏品陆续上传,谁有Nucleus,请传一下.…

查看全部问答>

ARM指令SMULBB是什么意思啊,,

ARM指令SMULBB和SMULWB是什么意思啊? 哪位打给给你详细点说明啊,,上网没找到,,,…

查看全部问答>

VC EVC 的区别

VC和EVC的区别是什么…

查看全部问答>

学习微型计算机系统原理机应用遇到困难

书中提到的8237A 8259A 8253-PIT 8255A 8250 8251A这些片子总觉得不是很熟,不会编程,大家有什么好的建议,能让我掌握他们。有什么好的资料吗?…

查看全部问答>

应用程序如何查询中断

驱动使用DDK写的,不是DS+DDK,以前用DS+DDK的时候是应用把一个Event的HANDLE传进去,然后驱动里面用传进来的HANDLE生成一个KEVENT,应用那里启动一个线程,线程里面等待那个Event就行了,这样当发生中断时驱动的DPC就把KEVENT设置,应用的那个线程就 ...…

查看全部问答>

STM32处理器如何实现关所有中断功能

                                 我一直没发现STM32有关所有中断的功能,想问一下大家是不是它不能实现。或者有什么办法来实现这个功能。一个个的关 ...…

查看全部问答>

跪求SDHC卡初始化时ACMD41的argument

在做430向SD卡写数据时候,SD卡可以,但是用SDHC卡初始化过程中CMD0的响应正确,ACMD41响应总是0x01,是不是argument有问题呢?…

查看全部问答>

山东省电子设计大赛来了

2012TI杯山东省大学生电子设计竞赛                基本仪器和主要元器件清单 1、基本仪器清单 数字电桥 直流稳压电源 量角器 米尺  四位半数字万用表  0~200℃温度 ...…

查看全部问答>

请问在main中进入LPM4,在外部中断唤醒后在中断进入LPM3,这时程序是回到main中了...

首先在main吧,我运行了“_BIS_SR(LPM4_bits + GIE);         // Enter LPM4” 先外部IO口中断函数中我又运行了“_BIS_SR(LPM3_bits + GIE);”,请问在此之后,程序是继续执行完中断函数后面的内容再进入LPM3,还是 ...…

查看全部问答>

51单片机1602液晶红外解码+波形

51单片机1602液晶红外解码+波形显示…

查看全部问答>