MSP430杂谈--AD7745硬件IIC驱动与模拟IIC驱动

2019-10-30来源: eefocus关键字:MSP430  AD7745  硬件IIC驱动  模拟IIC驱动

和上一篇AD7793类似,项目中也涉及到利用AD7745读取电容值,来测环境湿度。编写了基于MSP430的AD7745的硬件IIC驱动和模拟IIC驱动,分享给大家。


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


AD7745模拟IIC驱动完整版下载链接:https://download。csdn。net/download/qq_42580947/11041947


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


1. AD7745的硬件IIC驱动


MCU:MSP430F57XX


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


1。1 AD7745的写函数


void AD7745_W(unsigned char addr, unsigned char data)

{

  while(UCB0STAT& UCBBUSY)

    InitUCB0();

  UCB0CTL1 |= UCTR;

  UCB0CTL1 |= UCTXSTT;   

 

  UCB0TXBUF = addr;

  delayus(200);

  while(!(UCB0IFG & UCTXIFG0));

  

  UCB0TXBUF = data;

  delayus(200);

  while(!(UCB0IFG & UCTXIFG0));

 

  UCB0CTL1 |= UCTXSTP;

  while (UCB0CTL1 & UCTXSTP);

}

1.2 AD7745的读函数


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

{

  unsigned char index;

  UCB0CTL1 |= UCTR;

  UCB0CTL1 |= UCTXSTT; 

  delayus(200);

  UCB0TXBUF = addr;

  delayus(200);

  while(!(UCB0IFG & UCTXIFG0));

  while (UCB0CTL1 & UCTXSTP);

 

  UCB0CTL1 &=~ UCTR;

  RXByteCtr = n;

  UCB0CTL1 |= UCTXSTT;  

  delayus(200);

  while (UCB0CTL1 & UCTXSTP);

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

  {

    while(!(UCB0IFG & UCRXIFG0));            

    *buffer++ = UCB0RXBUF;

    delayus(200);

  }

 

  UCB0CTL1 |= UCTXSTP+UCTXNACK;

  delayus(200);

  while((UCB0IFG&UCRXIFG)==0);

  *buffer = UCB0RXBUF;

  delayus(200);

  while (UCB0CTL1 & UCTXSTP); 

}

1。3 AD7745的复位


void Reset_AD7745()

{

  while(UCB0STAT& UCBBUSY)

    InitUCB0();

  UCB0CTL1 |= UCTR;

  UCB0CTL1 |= UCTXSTT; 

  delayus(200);

  UCB0TXBUF = 0xBF;

  while(!(UCB0IFG & UCTXIFG0));

  

  UCB0CTL1 |= UCTXSTP;

  while (UCB0CTL1 & UCTXSTP); 

}

1.4 AD7745的初始化


void Init_AD7745(void)

{

  AD7745_W(0x0D, offset_buf[0]);

  AD7745_W(0x0E, offset_buf[1]);

  capdac_offset = Capdac_Parameter;                           

  out_buff[4] = 0x80+capdac_offset;               //CAPDACA is set to capdac_offset

  out_buff[5] = 0x80;                             //CAPDACB is set to 0

  CAPDAC = (float)(capdac_offset*CAPDAC_UNIT);   //CAPDAC只会取4值,即4.25,8.5,12.75,17

  AD7745_W(0x07, out_buff[0]);                    // data collect

  AD7745_W(0x08, out_buff[1]);

  AD7745_W(0x09, out_buff[2]);

  AD7745_W(0x0A, out_buff[3]);

  AD7745_W(0x0B, out_buff[4]); 

  AD7745_W(0x0C, out_buff[5]);

 

  memset(DataArr,0,sizeof(float)*DataNumber);

}

1。5 读取测量数据


void ReadData(void)

{

  AD7745_R(0x01, in_buff, sizeof(in_buff));  // read the data register

  CDC_Register_data = in_buff[1];

  CDC_Register_data = 0;

  CDC_Register_data = in_buff[1];

  CDC_Register_data <<= 8;

  CDC_Register_data += in_buff[2];

  CDC_Register_data <<= 8;

  CDC_Register_data += in_buff[0];

  CDC_Register_data &= 0x00ffffff;

 

  CDC_Capacitance2 = (float)(FULL_SCALE-SEMI_SCALE);

 

  if(CDC_Register_data>= SEMI_SCALE)

  {

      CDC_Capacitance1 = (float)(CDC_Register_data-SEMI_SCALE);

      CDC_Capacitance = 4。096 * (CDC_Capacitance1/CDC_Capacitance2);

  }

  else

  {

      CDC_Capacitance1 = (float)(SEMI_SCALE-CDC_Register_data);

      CDC_Capacitance = -4.096 * (CDC_Capacitance1/CDC_Capacitance2);

  }

 

  CDC_Capacitance = CAPDAC+CDC_Capacitance;

  Capacitance  = CDC_Capacitance;

}

2。 AD7745模拟IIC驱动


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


2.1 AD7745基础子函数的处理


void start()

{

    SCL_OUT;

    SDA_OUT;

    SDA_H;

    delayms(1);

    SCL_H;

    delayms(1);

    SDA_L;

    delayms(1);

    SCL_L;

    delayms(1);

}

 

void stop()

{

  SDA_OUT;

  SCL_OUT;

  SDA_L;

  delayms(1);

  SCL_H;

  delayms(1);

  SDA_H;

  delayms(1);

}

 

void Ack()

{

  SDA_OUT;

  SCL_OUT;

  SCL_L;

  SDA_L;

  delayms(1);

  SCL_H;

  delayms(1);

  SCL_L;

}

void NAck()

{

  SDA_OUT;

  SCL_OUT;

  SCL_L;

  SDA_H;

  delayus(2);

  SCL_H;

  delayus(2);

  SCL_L;

}

 

unsigned int WAck()

{

    SDA_H;

    SDA_IN;

    SCL_H;

    

    while(P1IN & BIT6)

    {

    }

  SCL_L;

  delayms(1);

  return 0;

}

1.2 读取字节数据


uchar read_byte()

{

  uchar i,read_data;

  SDA_OUT;

  SCL_L;

  SDA_H;

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

  {

    SDA_H;

    delayus(2);

    SCL_H;

    SDA_IN;

    delayus(2);

    read_data <<= 1;

    if(P1IN & BIT6)

      read_data |= 0x01;

    SDA_OUT;

    SCL_L;   

  }

  delayms(5);

  return(read_data);

}

1。3 写字节数据


void write_byte(uint data)

{

  uchar i;

  SCL_OUT;

  SDA_OUT;

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

  {

    if(data & 0x80)

      SDA_H;

    else

      SDA_L; 

 

    delayms(1);

    SCL_H;

    delayms(1);

    SCL_L;

    delayms(1);

    data = data << 1;

  }

  delayms(5);

}

1.4 向指定地址写数据


void write_dat(uchar addr,uchar write_data)

{

  start();

  write_byte(OP_WRITE);

  WAck();

  write_byte(addr);

  WAck();

  write_byte(write_data);

  WAck();

  stop();

  delayus(1000);

}

1.5 从指定地址读数据


uchar read_random(uint random_addr)

{

  uchar i;

  start();

  write_byte(OP_WRITE);

  WAck();

  write_byte(random_addr);

  WAck();

  start();

  write_byte(OP_READ);

  WAck();

  i = read_byte();

  stop();

  return i;

}

1.6 AD7745的初始化


void Init_AD7745()

{

  start();

  write_byte(0X09);

  WAck();

  write_byte(0xBF);

  delayus(500);

  WAck();

  stop();

}

1.7 写数组与读数组


void EEPROM_WriteArray (unsigned char dest_addr, unsigned char* src_addr,

                        unsigned char len)

{

   unsigned char i;

   start();

   write_byte(OP_WRITE);

   WAck();

   write_byte(dest_addr);

   WAck();

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

   {

   write_byte(src_addr[i]);

   WAck();

   }

   stop();

   delayus(1000);

}

void EEPROM_ReadArray (unsigned char* dest_addr, unsigned char src_addr,

                       unsigned char len)

{

  uchar i;

  start();

  write_byte(OP_WRITE);

  WAck();

  write_byte(src_addr);

  WAck();

  start();

  write_byte(OP_READ);

  WAck();

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

  {

    dest_addr[i] = read_byte();

    if(i!=len-1)

    Ack();

    else

    NAck();

  }

    stop();

}

1.8 AD7745的配置


void Capdacsetup(void)

{

   EEPROM_WriteArray(0x0D, offset_buf, sizeof(offset_buf));      // OFFSET寄存器初始化

   Capdac_Parameter = 127;

   capdac_offset = Capdac_Parameter;                           

   out_buff[4] = 0x80+capdac_offset;                            

   out_buff[5] = 0x80;                                         //CAPDACB is set to 0

   CAPDAC = (float)(capdac_offset*CAPDAC_UNIT);                                 

   EEPROM_WriteArray(0x07, out_buff, sizeof(out_buff));         // data collect

   memset(DataArr,0,sizeof(float)*DataNumber);

}

1.9 读取测量数据


void ReadData(void)

{

EEPROM_ReadArray(in_buff, 0x01, sizeof(in_buff));  // read the data register

CDC_Register_data = 0;

CDC_Register_data = in_buff[0];

CDC_Register_data <<= 8;

CDC_Register_data += in_buff[1];

CDC_Register_data <<= 8;

CDC_Register_data += in_buff[2];

CDC_Register_data &= 0x00ffffff;

CDC_Capacitance2 = (float)(FULL_SCALE-SEMI_SCALE);

 

if(CDC_Register_data>= SEMI_SCALE)

{

CDC_Capacitance1 = (float)(CDC_Register_data-SEMI_SCALE);

CDC_Capacitance = 4.096 * (CDC_Capacitance1/CDC_Capacitance2);

}

else

{

CDC_Capacitance1 = (float)(SEMI_SCALE-CDC_Register_data);

CDC_Capacitance = -4.096 * (CDC_Capacitance1/CDC_Capacitance2);

}

CDC_Capacitance = CAPDAC+CDC_Capacitance;

DataArr[Int_dec++]=CDC_Capacitance;

if(Int_dec==DataNumber)

Int_dec=0;

}

关键字:MSP430  AD7745  硬件IIC驱动  模拟IIC驱动 编辑:什么鱼 引用地址:http://news.2689mr.com/mcu/ic478717.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:MSP430勘误表使用
下一篇:msp430学习笔记之uart

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

MSP430F149内部Flash操作
一般,在单片机中的Flash存储器用于存放程序代码,属于只读型存储器。而在MSP430些列的单片机中,都可以通过内置的Flash控制器擦除或改写任何一段的内容。另外,msp430的单片机内部还专门留有一段Flash区域(information memory),用于存放掉电后需要永久保存的数据。利用430内部的Flash控制器,可以完成较大容量的数据记录、用户设置参数在掉电后的保存等功能。硬件介绍:要对Flash读写,首先要了解MSP430的存储器组织。430单片机的存储器组织结构采用冯诺依曼结构,RAM和ROM统一编址在同一寻址空间中,没有代码空间和数据空间之分。一般430的单片机都统一编址在0-64k地址范围中,只有少数高端
发表于 2020-05-07
MSP430F149内部Flash操作
MSP430 FLASH读写
MSP430 FLASH型单片机的FLASH存储器模块根据不同的容量分为若干段,其中信息存储器SegmengA及SegmentB各有128字节,其他段有512字节。SegmentB的地址是:0x01000h到0x107F,SegmentA的地址是:0x01080h到0x010FFh。其他段的地址根据容量不同,从0xFFFFh开始,每512字节为一段进行分配。FLASH存储器写入数据时,每一位只能由“1”变成“0”,不能由“0”变成“1“,因此,当我们有数据要保存到FLASH存储器时,要先对目标段进行整段擦除操作,擦除操作使的对应段FLASH存储器变成全“1”。下面是擦除FLASH段的子程序,配置好必要的寄存器后,向段中任意地址写入
发表于 2020-05-06
关于Msp430 Flash型单片机内部Flash的操作
1 Msp430Flash型单片机内部Flash存储器介绍MSP430的Flash存储器是可位、字节、字寻址和编程的存储器。该模块由一个集成控制器来控制编程和擦除的操作。控制器包括三个寄存器,一个时序发生器及一个提供编程、擦除电压的电压发生器。Msp430的Flash存储器的特点有:1)产生内部编程电压2)可位、字节、字编程,可以单个操作,也可以连续多个操作3)超低功耗操作4)支持段擦除和多段模块擦除2 Flash存储器的分割Msp430 Flash存储器分成多个段。可对其进行单个字节、字的写入,也可以进行连续多个字、字节的写入操作,但是最小的擦除单位是段。Flash 存储器被分割成两部分:主存储器和信息存储器,两
发表于 2020-05-06
MSP430的JTAG接口和BSW接口
1.JTAG口,JTAG引脚如下定义:单片机TCK——测试时钟输入,接仿真器7脚单片机TDI——测试数据输入,接仿真器2脚单片机TDO——测试数据输出,接仿真器1脚单片机TMS——测试模式选择,接仿真器5脚单片机TRST——测试复位,输入引脚,低电平有效(此引脚可选),接仿真器11脚 2. BSW接口单片机SBWTDIO/RST——测试数据输入输出,接仿真器1脚TDO,其中SBWTDIO和单片机复位RST引脚复用单片机SBWTCK/TEST——测试时钟,接仿真器7脚TCK
发表于 2020-05-06
MSP430的JTAG接口和BSW接口
MSP430F169(四)——浅谈F169看门狗
什么是看门狗在工业现场,往往会由于供电电源、空间电磁干扰或其他原因引起强烈的干扰噪声。这些干扰作用于数字器件,极易使其产生误动作,从而失去应有的控制功能,引起MSP430发生“程序跑飞”事故。若不进行有效的处理,程序就不能回到正常的状态,从而失去应有的控制功能。看门狗定时器正是为了解放这类问题而产生的,尤其是在具有循环结构的程序任务中更为有效。看门狗有一个RST管脚,用来复位。看门狗的两种工作模式(一)看门狗模式:看门狗模式是看门狗这个组件的主要功能,(这不是废话嘛,看门狗组件肯定是看门狗啊)提到看门狗,不得不说这个密码保护了(WDTPW watchdog timer password )任何读写操作必须通过他才能正确执行指令
发表于 2020-05-06
MSP430F169(四)——浅谈F169看门狗
MSP430学习的第一个模拟I2C程序
#include <msp430.h>unsigned char I2CBUF;unsigned char checkbit;#define SCL_H   (P10OUT |= BIT2)      // P10.2为SCL#define SCL_L   (P10OUT &= ~BIT2)#define SDA_H   (P10OUT |= BIT1)     //p10.1为SDA#define SDA_L   (P10OUT &= ~BIT1)#define
发表于 2020-05-06
小广播
何立民专栏 单片机及嵌入式宝典

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

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD。com。cn, Inc。 All rights reserved
博彩送彩金全讯网 下载就送彩金的平台 3d黑彩平台送彩金 赛车网站首存送彩金 手机彩票送彩金 电子娱乐送彩金论坛 博彩送彩金38元 博彩论坛送彩金 彩票大赢家 最新注册送彩金棋牌