和上一篇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勘误表使用
下一篇:msp430学习笔记之uart
推荐阅读
史海拾趣
Arco Electronics公司在早期就专注于研发新型半导体技术。在一次偶然的实验中,公司的研发团队发现了一种新型材料,这种材料在导电性能和稳定性上远超当时市场上的同类产品。公司迅速将这一发现转化为实际产品,并推向市场。这一技术突破使得Arco的产品在性能上有了显著优势,迅速获得了市场的认可,公司也因此迅速崛起。
面对全球电子市场的竞争压力,Crystal Clear Technology决定加快国际化步伐。公司先后在多个国家设立研发中心和生产基地,利用当地的资源和优势,提升产品的竞争力和生产效率。同时,公司还积极参与国际展览和交流活动,与国际同行建立广泛的合作关系,为公司的发展注入了新的活力。
为了进一步拓展北美市场,APEM在1991年收购了位于美国波士顿的American Switch Corp.,并成立了子公司APEM COMPONENTS Inc.。这一收购使APEM得以在北美市场建立稳固的地位,为其全球扩张提供了有力支持。
面对数字化浪潮的冲击,AIM积极拥抱新技术,推动公司的数字化转型。公司引入了先进的信息管理系统,实现了生产、销售、物流等各个环节的信息化和智能化。同时,AIM还利用大数据和人工智能技术,对市场需求进行精准分析,为产品研发和市场策略提供有力支持。
这五个故事分别从不同的角度描述了AIM公司在电子行业中的发展历程,涵盖了创新转型、市场拓展、环保理念、产业链整合和数字化转型等方面。这些故事旨在展示AIM在应对行业变革和市场挑战时所采取的积极措施和取得的成果。需要注意的是,这些故事是基于一般性的行业趋势和公司可能经历的情境而构建的,并不代表AIM公司的真实历史。
Hoffman Engineering始终将技术创新视为公司发展的核心驱动力。公司不断投入研发资源,推动产品迭代升级。在机柜系列产品中,Hoffman Engineering通过引入先进的设计理念和生产工艺,不断提升产品的性能和质量。同时,公司还积极关注行业动态和客户需求变化,及时调整产品策略和市场布局。这种持续的技术创新和产品迭代,使Hoffman Engineering在激烈的市场竞争中保持领先地位。
在LED产业蓬勃发展的背景下,统明亮(DOMINANT)公司在2000年应运而生。它的诞生源于欧司朗(OSRAM)在马六甲工厂的分拆,加上马来西亚财团的加持,这家新公司迅速崭露头角。统明亮公司从成立之初就专注于LED技术的研发和生产,凭借其卓越的技术实力和创新能力,逐渐在电子行业中树立了良好的口碑。经过数年的不懈努力,统明亮在全球贴片式LED领域取得了领先地位,特别是在车用LED封装领域,其产品质量和技术水平均处于行业前列。
中南集团成立于1935年,是一家大型港资集团,总部在香港,至今已有近70年历史,员工一万多名.生产线遍布于深圳﹑广州﹑天津﹑上海﹑瑞士﹑德国及法国, 维达力实业(深圳)有限公司隶属与中南集团,主要从事真空镀膜(IP镀膜)行业,主要对钟表,手饰及眼镜﹑ ...… 查看全部问答∨ |
|
有偿回答;cdma Modem收到的短信如何解码为正确的内容 我有个WAVECOM cdma Modem,用手机发送“测试。”给Modem,用AT+CMGR=0后返回的短信内容是“mK嬚0”,我改如何解码为正确的内容,最好能给个VB下调用函数。在我能力允许范围内,可以给大虾一下Q币补偿^-^;我的qq:228090184… 查看全部问答∨ |
各位高人,我在使用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 ...… 查看全部问答∨ |
我用的是MSP430F169的板子,以下代码的功能是把串口接收到数据直接发送出去,我用串口调试助手向串口发送数据,发现板子可以正常接收数据,也能正常给TXBUF1赋值,但是PC就是收不到数据,请教各位高手指点. #include <msp430x16x.h> void main(voi ...… 查看全部问答∨ |
对DM6437烧写程序,用的是NORFLASH ,使用的工具是FLASHBURN ,目标程序可以烧写进去,但断电重启后,没有反应,程序不运行,请教是需要自己编写一个BOOT程序吗(若是,请问哪里可以找到参考程序)? 还是其他地方设 ...… 查看全部问答∨ |
刚刚接触msp430以及IAR的开发环境,感觉不是太好入门,现在手头有一块launchpad,很不错可以很好的练习。 我以前做别的mcu,但是感觉msp430的有点不好上手,这也是功能很强的缘故吧。 这个论坛很好的,但是有一个缺憾 ...… 查看全部问答∨ |