和上一篇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驱动 引用地址:MSP430杂谈--AD7745硬件IIC驱动与模拟IIC驱动

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

推荐阅读

集微网消息,上周小米发布了年度旗舰机MIX3,除了3299元的价格有些心动之外,其他的配置则是没有惊喜了,跟自家产品与竞争对手比起来,让人有些失望,这不身为竞争对手之一的联想趁MIX3被人吐槽之际,果断发动了嘲讽技能,让其躺枪无数。碰瓷发布会地点小米确定要在故宫博物院发布MIX3,于是联想官微就特地拿着Z5 Pro的包装盒跑去故宫博物院拍照合影,宣...
Step1:驱动加载函数: ***_init;该函数内容为驱动硬件时仅执行一次的函数,其作用是硬件初始化。如配置IO端口输出方向,配置IO上拉等;该函数传入在module_init(***_init);函数中以使得在加载驱动时自动执行;Step2:写open,read,write,release函数;这三个函数的作用是为了传入file_operations结构体;在应用程序调用驱动时这三个函数作为借口被调用...
半导体供应商、MEMS(微机电系统)技术的世界领导者意法半导体(STMicroelectronics,简称ST;纽约证券交易所代码:STM)于日前宣布,与新加坡A * STAR IME研究所和日本领先的制造工具供应商ULVAC合作,在意法半导体新加坡晶圆厂内联合创办一条以压电式MEMS技术为重点研究方向的8英寸(200mm)晶圆研发生产线。这个全球首创的“Lab-in-Fab”研发生产线整合三个...
10月29日,立臻科技智能终端项目在昆山开工。昆山发布消息显示,项目总投资超110亿元,总占地面积约837亩,采取分期建设、分期投产的方式。一期项目租赁昆山巴城国有企业城发公司厂区进行改造升级,占地面积约409亩,建筑面积约18.3万平方米,规划14条生产线;二期项目占地面积约428亩,建筑面积约79万平方米,规划25条生产线。项目建成全面达产后,预计年...

史海拾趣

问答坊 | AI 解惑

怎样看电路原理图

电器维修、电路设计都是要通过分析电路原理图,了解电器的功能和工作原理,才能得心应手开展工作的。要维修或设计,首先要有过硬的基本功,要能对有技术参数的电路原理图进行总体了解,能进行划分功能模块,找出信号流向,确定元件作用。若不知电路 ...…

查看全部问答∨

中南国际实业有限公司招聘电子工程师

中南集团成立于1935年,是一家大型港资集团,总部在香港,至今已有近70年历史,员工一万多名.生产线遍布于深圳﹑广州﹑天津﹑上海﹑瑞士﹑德国及法国, 维达力实业(深圳)有限公司隶属与中南集团,主要从事真空镀膜(IP镀膜)行业,主要对钟表,手饰及眼镜﹑ ...…

查看全部问答∨

《单片机原理与应用》(金龙国)电子教案-

《单片机原理与应用》(金龙国)电子教案,希望能帮助需要的人~ 很好的资料 137页,是我多年的珍藏!…

查看全部问答∨

坡莫合金的问题

论坛的兄弟姐妹们,小弟想用坡莫合金做一个开合式的互感器,测量感应电缆的内部电流电压等参数,同时还要用来做能量获取。 请问有做过类似项目的么?可否交流一下,多谢啦 ps:我以前用矽钢片来做同样的功能的,已经实现。…

查看全部问答∨

有偿回答;cdma Modem收到的短信如何解码为正确的内容

我有个WAVECOM cdma Modem,用手机发送“测试。”给Modem,用AT+CMGR=0后返回的短信内容是“mK嬚0”,我改如何解码为正确的内容,最好能给个VB下调用函数。在我能力允许范围内,可以给大虾一下Q币补偿^-^;我的qq:228090184…

查看全部问答∨

PB编译一个OS时,出现如下错误.求解!

     各位高人,我在使用PB编译一个OS时,出现如下错误,请叫如何进行调试才能够正常编译? Error - cannot open input file D:\\WINCE500\\PBWorkspaces\\QT2440_1103\\RelDir\\smdk2440a_ARMV4I_Release\\postproc\\nlscfg.i ...…

查看全部问答∨

PC6的TIM3_CH1要重映射,请问为什么这么设计?(已解决)

datasheet的table4中说:================================================                         Defa ...…

查看全部问答∨

求助:F169调试串口通信的时候遇到的问题

我用的是MSP430F169的板子,以下代码的功能是把串口接收到数据直接发送出去,我用串口调试助手向串口发送数据,发现板子可以正常接收数据,也能正常给TXBUF1赋值,但是PC就是收不到数据,请教各位高手指点. #include <msp430x16x.h> void main(voi ...…

查看全部问答∨

DM6437程序烧写

对DM6437烧写程序,用的是NORFLASH ,使用的工具是FLASHBURN ,目标程序可以烧写进去,但断电重启后,没有反应,程序不运行,请教是需要自己编写一个BOOT程序吗(若是,请问哪里可以找到参考程序)? 还是其他地方设 ...…

查看全部问答∨

一点小的声明以及一个小的引脚电流的问题

刚刚接触msp430以及IAR的开发环境,感觉不是太好入门,现在手头有一块launchpad,很不错可以很好的练习。     我以前做别的mcu,但是感觉msp430的有点不好上手,这也是功能很强的缘故吧。    这个论坛很好的,但是有一个缺憾 ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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