专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
TI
ldc1314驱动程序,MSP430F149.169驱动LDC1314
2019-07-20 16:32
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
TI MCU
13701
3
1250
MSP430F149/169驱动LDC1314程序,可用于金属的检测,已给出各个文件名称,自建工程添加文件即可使用。显示程序LCD12864.c较为普遍,未给出。
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
dirtwillfly
1楼-- · 2019-07-20 21:52
MAIN.C文件
#include <msp430f169.h>
#include "config.h"
#include "12864.h"
externuint LDC1314_Result(ucharChannal);
extern void InitLDC1314(void);
/*****************************************************************************
系统初始化,MCLK=8MHz,SMCLK=1MHz
******************************************************************************/
voidInitSys()
{
unsignedint iq0;
_DINT(); // 关中断本可以不必这样小心
WDTCTL = WDTPW + WDTHOLD;
BCSCTL1 &=~XT2OFF;
do
{
IFG1 &= ~OFIFG; // 清除振荡器失效标志
for (iq0 = 0xFF; iq0 > 0; iq0--); // 延时等待XT2起振
}
while ((IFG1 & OFIFG) != 0); // 判断XT2是否起振
BCSCTL2 =SELM_2+SELS+DIVS_3; //MCLK,SMCLK时钟为XT2SMCLK8分频1MHz
}
void main( void )
{
uint value = 0;
InitSys();
InitLDC1314();
Ini_Lcd();
Component_Display(4,0,134);//显示
while(1)
{
value = LDC1314_Result(0);//通道0 Component_Display(1,0,value);//显示
delay_ms(200);
}
_NOP();
}
LDC1314.C文件
#include "LDC1314.h"
//**************************************
//I2C总线初始化
//**************************************
void I2C_Init()
{
LDC_SCL_L(); //拉低时钟线
delay_us(5); //延时
I2C_Stop();
}
//**************************************
//I2C起始信号
//**************************************
void I2C_Start()
{
LDC_SCL_OUT(); // SCL设置为输出
LDC_SDA_OUT(); // SDA设置为输出
LDC_SDA_H(); //拉高数据线
LDC_SCL_H(); //拉高时钟线
delay_us(5); //延时
LDC_SDA_L(); //产生下降沿
delay_us(5); //延时
LDC_SCL_L(); //拉低时钟线
}
//**************************************
//I2C停止信号
//**************************************
void I2C_Stop()
{
LDC_SCL_OUT(); // SCL设置为输出
LDC_SDA_OUT(); // SDA设置为输出
LDC_SDA_L(); //拉低数据线
LDC_SDA_H(); //产生上升沿
delay_us(5); //延时
}
//**************************************
//I2C发送应答信号
//入口参数:ack (0:ACK 1:NAK)
//**************************************
void I2C_SendACK(ucharack)
{
if(ack)
LDC_SDA_H();
else
LDC_SDA_L();
// SDA = ack; //写应答信号
LDC_SCL_H(); //拉高时钟线
delay_us(5); //延时
LDC_SCL_L(); //拉低时钟线
delay_us(5); //延时
}
//**************************************
//I2C接收应答信号,0有效,1无效
//**************************************
uchar I2C_RecvACK()
{
uchar cy;
LDC_SCL_OUT(); // SCL设置为输出
LDC_SCL_H(); //拉高时钟线
delay_us(5); //延时
if(LDC_SDA_DAT())
{
cy=1;
}
else
{
cy=0;
}
// cy = SDA; //读应答信号
LDC_SCL_L(); //拉低时钟线
delay_us(5); //延时
LDC_SDA_OUT(); // SDA设置为输出
return cy;
}
//**************************************
//向I2C总线发送一个字节数据
//**************************************
uchar I2C_SendByte(uchardat)
{
uchari,temp;
LDC_SCL_OUT(); // SCL设置为输出
LDC_SDA_OUT(); // SDA设置为输出
for (i=0; i<8; i++) //8位计数器
{
if((dat<<i))
{
LDC_SDA_H();
}
else
{
LDC_SDA_L();
}
LDC_SCL_H(); //拉高时钟线
delay_us(5); //延时
LDC_SCL_L(); //拉低时钟线
delay_us(5); //延时
}
temp=I2C_RecvACK();
return temp;
}
//**************************************
//从I2C总线接收一个字节数据
//**************************************
uchar I2C_RecvByte()
{
uchari;
uchardat = 0,cy;
LDC_SCL_OUT(); // SCL设置为输出
LDC_SDA_OUT(); // SDA设置为输出
LDC_SDA_H(); //使能内部上拉,准备读取数据,
LDC_SDA_IN(); // SDA设置为输入准备向主机输入数据
for (i=0; i<8; i++) //8位计数器
{
dat<<= 1;
LDC_SCL_H(); //拉高时钟线
delay_us(5); //延时
if(LDC_SDA_DAT())
{
cy=1;
}
else
{
cy=0;
}
dat |= cy; //读数据
LDC_SCL_L(); //拉低时钟线
delay_us(5); //延时
}
LDC_SDA_OUT();
returndat;
}
//**************************************
//向I2C设备写入一个字节数据
//**************************************
/*
void ByteWrite1314(ucharREG_Address,ucharREG_data)
{
I2C_Start(); //起始信号
I2C_SendByte(SlaveAddress); //发送设备地址+写信号
I2C_SendByte(REG_Address); //内部寄存器地址
I2C_SendByte(REG_data); //内部寄存器数据
I2C_Stop(); //发送停止信号
}
*/
//**************************************
//从I2C设备读取一个字节数据
//**************************************
/*
uchar ByteRead1314(ucharREG_Address)
{
ucharREG_data;
I2C_Start(); //起始信号
I2C_SendByte(SlaveAddress); //发送设备地址+写信号
I2C_SendByte(REG_Address); //发送存储单元地址从0开始
I2C_Start(); //起始信号 I2C_SendByte(SlaveAddress+1); //发送设备地址+读信号
REG_data=I2C_RecvByte(); //读出寄存器数据
I2C_SendACK(1); //接收应答信号
I2C_Stop(); //停止信号
returnREG_data;
}
*/
//**************************************
//向I2C设备写入一个字数据
//**************************************
void WordWrite1314(ucharREG_Address,uintREG_data)
{
ucharREG_data_H,REG_data_L;
REG_data_L=(uchar)(REG_data&0xFF);
REG_data_H=(uchar)((REG_data&0xFF00)>>8);
I2C_Start(); //起始信号
I2C_SendByte(SlaveAddress); //发送设备地址+写信号
I2C_SendByte(REG_Address); //内部寄存器地址
I2C_SendByte(REG_data_H); //发送内部寄存器数据高8位
I2C_SendByte(REG_data_L); //发送内部寄存器数据低8位
I2C_Stop(); //发送停止信号
}
//**************************************
//从I2C设备读取一个字数据
//**************************************
uint WordRead1314(ucharREG_Address)
{
uintREG_data;
ucharREG_data_H,REG_data_L;
I2C_Start(); //起始信号
I2C_SendByte(SlaveAddress); //发送设备地址+写信号
I2C_SendByte(REG_Address); //发送存储单元地址从0开始
I2C_Start(); //起始信号原因不明
I2C_SendByte(SlaveAddress+1); //发送设备地址+读信号
REG_data_H=I2C_RecvByte(); //读出寄存器数据
I2C_SendACK(0); //接收应答信号
REG_data_L=I2C_RecvByte(); //读出寄存器数据
I2C_SendACK(1); //接收应答非信号
I2C_Stop(); //发送停止信号
REG_data=REG_data_H; REG_data<<=8;
REG_data|=REG_data_L;
returnREG_data;
}
//**************************************
//初始化LDC1314
//**************************************
void InitLDC1314(void)
{
I2C_Init();
while(WordRead1314(DEVICE_ID)!=0x3025);//等待,I2C正常
//WordWrite1314(RESET_DEV,0x8800);
/*重启LDC1314*/
WordWrite1314(CONFIG,0x2451);
/*默认值,睡眠模式开,方便配置*/
WordWrite1314(CLOCK_DIVIDERS_CH0,0X500a);//fSENSOR不分频fCLK 2分频
/* 时钟源分频选择,分频系数1,1
Using L and C, 得fSENSOR = 1/2π×sqrt(L ×C)
注意fSENSOR须小于8.75 MHz,fSENSOR分频系数才能置1
注意fREF0须至少大于 4 ×fSENSOR,以决定fREF0分频系数
fin0 = fSENSOR0/CH0_FIN_DIVIDER
fREF0 = fCLK / CH0_FREF_DIVIDER
*/
WordWrite1314(SETTLECOUNT_CH0,0x0A60);
/* 建立(Settling)时间设置
计算得Q=Rp*sqrt(C/L)
寄存器值小于10取10大于10取其值,且应满足以下条件:
CHx_SETTLECOUNT≥QSENSORx×fREFx / (16 ×fSENSORx) (10进制)
(1)fSENSORx:x通道传感器频率
(2)fREFx:x通道参考频率
(3)QSENSORx:品质因数Q=Rp×sqrt(C/L)
注意,不等式右边算出有小数则向上取整
建立时间tSx = (CH0_SETTLECOUNT*16) / fREF0
通道切换时间tCsd = Channel Switch Delay = 692 ns + 5 / fref (us)
*/
WordWrite1314(RCOUNT_CH0,0xFFFF);
/*转换时间设置
得转换时间tCx = TSAMPLE(采样时间) –tSx–tCsd (us) 由下式算出寄存器的值(有小数则向下取整(舍去)):
转换时间tCx = (CHx_RCOUNT× 16) / fREFx (10进制)
注意寄存器的值化为16进制
*/
/*使用ERROR_CONFIG默认值,错误中断关闭*/
WordWrite1314(DRIVE_CURRENT_CH0,0x9800);
/*传感器驱动电流设置,使用请同时注意CONFIG寄存器相关配置
查数据手册的Figure 15,得IDRIVE值(10进制),INIT_DRIVE值不使用,保持默认
使用CH0_IDRIVE[15:11]时,Rp Override须打开
使用CH0_INIT_IDRIVE[10:6]时,保证AUTO_AMP_DIS位不置位
*/
//WordWrite1314(MUX_CONFIG,0x801);
/* 多通道转换选择,输入尖峰脉冲滤波器带宽选择,使用请同时注意CONFIG寄存器相关配
置
(a)置AUTOSCAN_EN位为b1使能连续模式(sequential mode)
(b)置RR_SEQUENCE位为b00使能两个通道的数据转换(channel 0,channel 1)
(c)置DEGLITCH位为b100设定输入尖峰脉冲滤波器带宽,此值必须高于谐振频率fTank!
*/
//WordWrite1314(OFFSET_CH0,0x00);
/*频率偏移(补偿)设置
可以设置从每个数据值中减去偏移值以补偿频率偏移或最大化动态范围的样本数据
fOFFSET0 = CH0_OFFSET * (fREF0/2^16)
且偏移值应小于fSENSORx_MIN / fREFx
*/
//WordWrite1314(RESET_DEV,0x00);
/*输出增益设置,[10:9],对所有通道有效
对于传感器信号变化量小于满量程25的系统,设置输出增益可以提供更高的分辨率(精度)
*/
/*
状态寄存器STATUS,ERROR_CONFIG
*/
WordWrite1314(CONFIG,0x1501);
/*默认连续转换(单)通道0,睡眠模式关,Rp Override开
低功耗模式关,传感器自动幅度校正(AUTO_AMP)关,Ref时钟源选外部时钟源
INTB中断开,高电流驱动关*/
}
//**************************************
//读取LDC1314转换结果,输入参数为选择通道数
//**************************************
uint LDC1314_Result(ucharChannal)
{
uint temp=0;
switch(Channal)
{
case 0x00:
temp=WordRead1314(DATA_CH0); //通道0
break;
case 0x01:
temp=WordRead1314(DATA_CH1); //通道1
break;
case 0x02:
temp=WordRead1314(DATA_CH2); //通道2
break;
case 0x03:
temp=WordRead1314(DATA_CH3); //通道3
break;
default :
break;
}
while((temp&0xF000)!=0);
/*有错误Flag!,有输出增益时注意此句,可能出错
0x000 = under range,0xfff = over range
*/
return temp;
}
LDC1314.H文件
#ifndef __LDC1314_H
#define __LDC1314_H
#include <msp430f169.h>
#include "config.h"
static void I2C_Init();
static void I2C_Start();
static void I2C_Stop();
static void I2C_SendACK(ucharack);
staticuchar I2C_RecvACK(); staticuchar I2C_SendByte(uchardat);
staticuchar I2C_RecvACK();
static void WordWrite1314(ucharREG_Address,uintREG_data);
staticuint WordRead1314(ucharREG_Address);
void InitLDC1314(void);
uint LDC1314_Result(ucharChannal);
//****定义LDC1314硬件接口不同硬件修改此处即可***********
#define LDC1314DIR P1DIR
#define LDC1314OUT P1OUT
#define LDC1314IN P1IN
#define LDC_SCL BIT2
#define LDC_SDA BIT3
#define LDC_INTB BIT4//中断
#define LDC_SD BIT5//置高,则进入掉电模式
//*********I2C硬件相关接口函数**************
#define LDC_SCL_OUT() LDC1314DIR |= LDC_SCL // SCL脚输出
#define LDC_SCL_H() LDC1314OUT |= LDC_SCL // SCL拉高
#define LDC_SCL_L() LDC1314OUT &= ~LDC_SCL // SCL拉低
#define LDC_SDA_OUT() LDC1314DIR |= LDC_SDA // SDA脚输出
#define LDC_SDA_H() LDC1314OUT |= LDC_SDA // SDA拉高
#define LDC_SDA_L() LDC1314OUT &= ~LDC_SDA // SDA拉低
#define LDC_SDA_IN() LDC1314DIR &= ~LDC_SDA // SDA脚输入
#define LDC_SDA_DAT() (LDC1314IN&LDC_SDA) // SDA输入数据
#define SlaveAddress 0x2A //IIC写入时的地址字节数据+1为读取ADDR接
高电平地址则为0x2B
#define DATA_CH0 0x00 //Channel 0 Conversion Result and Error Status
#define DATA_CH1 0x02
#define DATA_CH2 0x04
#define DATA_CH3 0x06
#define RCOUNT_CH0 0x08 //Reference Count setting for Channel 0
#define RCOUNT_CH1 0x09
#define RCOUNT_CH2 0x0A
#define RCOUNT_CH3 0x0B
#define OFFSET_CH0 0x0C //Offset value for Channel 0
#define OFFSET_CH1 0x0D
#define OFFSET_CH2 0x0E
#define OFFSET_CH3 0x0F
#define SETTLECOUNT_CH0 0x10 //Channel 0 Settling Reference Count
#define SETTLECOUNT_CH1 0x11
#define SETTLECOUNT_CH2 0x12
#define SETTLECOUNT_CH3 0x13
#define CLOCK_DIVIDERS_CH0 0x14
#define CLOCK_DIVIDERS_CH1 0x15
#define CLOCK_DIVIDERS_CH2 0x16
#define CLOCK_DIVIDERS_CH3 0x17
#define STATUS 0x18 //Device Status Report
#define ERROR_CONFIG 0x19 //Error Reporting Configuration
#define MUX_CONFIG 0x1A //Channel Multiplexing Configuration
#define CONFIG 0x1B //Conversion Configuration
#define RESET_DEV 0x1C //Reset Device
#define DRIVE_CURRENT_CH0 0x1E //Channel 0 sensor current drive configuration
#define DRIVE_CURRENT_CH1 0x1F
#define DRIVE_CURRENT_CH2 0x20
#define DRIVE_CURRENT_CH3 0x21
#define MANUFACTURER_ID 0x7E //厂商ID,默认值0x5449
#define DEVICE_ID 0x7F //设备ID,默认值0x3054
#endif
加载中...
pklong
2楼-- · 2019-07-21 03:17
版主这个程序有点长。
加载中...
pklong
3楼-- · 2019-07-21 05:41
精彩回答 2 元偷偷看……
加载中...
一周热门
更多
>
相关问题
CPLD的方波输出
4 个回答
11个版本Quartus II 软件下载,安装包网盘合集,附教程,47G!
20 个回答
请大家帮忙到21IC发展大家谈支持我申请新版面
20 个回答
【通知】21ic中国电子网服务条款 (所有人员必读)
1 个回答
满载而归乙亥年,大展鸿途庚子年---集签赢好礼
20 个回答
携手ADI,踏上电子工程师之巅—车辆电气化视频,答题领奖!
1 个回答
如何提升论坛质量,看你了!
20 个回答
【最终名单】二姨家喊你来拿100份新年大礼啦~
20 个回答
相关文章
×
关闭
采纳回答
向帮助了您的网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
TI
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
关闭
您已邀请
15
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
#include <msp430f169.h>
#include "config.h"
#include "12864.h"
externuint LDC1314_Result(ucharChannal);
extern void InitLDC1314(void);
/*****************************************************************************
系统初始化,MCLK=8MHz,SMCLK=1MHz
******************************************************************************/
voidInitSys()
{
unsignedint iq0;
_DINT(); // 关中断本可以不必这样小心
WDTCTL = WDTPW + WDTHOLD;
BCSCTL1 &=~XT2OFF;
do
{
IFG1 &= ~OFIFG; // 清除振荡器失效标志
for (iq0 = 0xFF; iq0 > 0; iq0--); // 延时等待XT2起振
}
while ((IFG1 & OFIFG) != 0); // 判断XT2是否起振
BCSCTL2 =SELM_2+SELS+DIVS_3; //MCLK,SMCLK时钟为XT2SMCLK8分频1MHz
}
void main( void )
{
uint value = 0;
InitSys();
InitLDC1314();
Ini_Lcd();
Component_Display(4,0,134);//显示
while(1)
{
value = LDC1314_Result(0);//通道0 Component_Display(1,0,value);//显示
delay_ms(200);
}
_NOP();
}
LDC1314.C文件
#include "LDC1314.h"
//**************************************
//I2C总线初始化
//**************************************
void I2C_Init()
{
LDC_SCL_L(); //拉低时钟线
delay_us(5); //延时
I2C_Stop();
}
//**************************************
//I2C起始信号
//**************************************
void I2C_Start()
{
LDC_SCL_OUT(); // SCL设置为输出
LDC_SDA_OUT(); // SDA设置为输出
LDC_SDA_H(); //拉高数据线
LDC_SCL_H(); //拉高时钟线
delay_us(5); //延时
LDC_SDA_L(); //产生下降沿
delay_us(5); //延时
LDC_SCL_L(); //拉低时钟线
}
//**************************************
//I2C停止信号
//**************************************
void I2C_Stop()
{
LDC_SCL_OUT(); // SCL设置为输出
LDC_SDA_OUT(); // SDA设置为输出
LDC_SDA_L(); //拉低数据线
LDC_SDA_H(); //产生上升沿
delay_us(5); //延时
}
//**************************************
//I2C发送应答信号
//入口参数:ack (0:ACK 1:NAK)
//**************************************
void I2C_SendACK(ucharack)
{
if(ack)
LDC_SDA_H();
else
LDC_SDA_L();
// SDA = ack; //写应答信号
LDC_SCL_H(); //拉高时钟线
delay_us(5); //延时
LDC_SCL_L(); //拉低时钟线
delay_us(5); //延时
}
//**************************************
//I2C接收应答信号,0有效,1无效
//**************************************
uchar I2C_RecvACK()
{
uchar cy;
LDC_SCL_OUT(); // SCL设置为输出
LDC_SCL_H(); //拉高时钟线
delay_us(5); //延时
if(LDC_SDA_DAT())
{
cy=1;
}
else
{
cy=0;
}
// cy = SDA; //读应答信号
LDC_SCL_L(); //拉低时钟线
delay_us(5); //延时
LDC_SDA_OUT(); // SDA设置为输出
return cy;
}
//**************************************
//向I2C总线发送一个字节数据
//**************************************
uchar I2C_SendByte(uchardat)
{
uchari,temp;
LDC_SCL_OUT(); // SCL设置为输出
LDC_SDA_OUT(); // SDA设置为输出
for (i=0; i<8; i++) //8位计数器
{
if((dat<<i))
{
LDC_SDA_H();
}
else
{
LDC_SDA_L();
}
LDC_SCL_H(); //拉高时钟线
delay_us(5); //延时
LDC_SCL_L(); //拉低时钟线
delay_us(5); //延时
}
temp=I2C_RecvACK();
return temp;
}
//**************************************
//从I2C总线接收一个字节数据
//**************************************
uchar I2C_RecvByte()
{
uchari;
uchardat = 0,cy;
LDC_SCL_OUT(); // SCL设置为输出
LDC_SDA_OUT(); // SDA设置为输出
LDC_SDA_H(); //使能内部上拉,准备读取数据,
LDC_SDA_IN(); // SDA设置为输入准备向主机输入数据
for (i=0; i<8; i++) //8位计数器
{
dat<<= 1;
LDC_SCL_H(); //拉高时钟线
delay_us(5); //延时
if(LDC_SDA_DAT())
{
cy=1;
}
else
{
cy=0;
}
dat |= cy; //读数据
LDC_SCL_L(); //拉低时钟线
delay_us(5); //延时
}
LDC_SDA_OUT();
returndat;
}
//**************************************
//向I2C设备写入一个字节数据
//**************************************
/*
void ByteWrite1314(ucharREG_Address,ucharREG_data)
{
I2C_Start(); //起始信号
I2C_SendByte(SlaveAddress); //发送设备地址+写信号
I2C_SendByte(REG_Address); //内部寄存器地址
I2C_SendByte(REG_data); //内部寄存器数据
I2C_Stop(); //发送停止信号
}
*/
//**************************************
//从I2C设备读取一个字节数据
//**************************************
/*
uchar ByteRead1314(ucharREG_Address)
{
ucharREG_data;
I2C_Start(); //起始信号
I2C_SendByte(SlaveAddress); //发送设备地址+写信号
I2C_SendByte(REG_Address); //发送存储单元地址从0开始
I2C_Start(); //起始信号 I2C_SendByte(SlaveAddress+1); //发送设备地址+读信号
REG_data=I2C_RecvByte(); //读出寄存器数据
I2C_SendACK(1); //接收应答信号
I2C_Stop(); //停止信号
returnREG_data;
}
*/
//**************************************
//向I2C设备写入一个字数据
//**************************************
void WordWrite1314(ucharREG_Address,uintREG_data)
{
ucharREG_data_H,REG_data_L;
REG_data_L=(uchar)(REG_data&0xFF);
REG_data_H=(uchar)((REG_data&0xFF00)>>8);
I2C_Start(); //起始信号
I2C_SendByte(SlaveAddress); //发送设备地址+写信号
I2C_SendByte(REG_Address); //内部寄存器地址
I2C_SendByte(REG_data_H); //发送内部寄存器数据高8位
I2C_SendByte(REG_data_L); //发送内部寄存器数据低8位
I2C_Stop(); //发送停止信号
}
//**************************************
//从I2C设备读取一个字数据
//**************************************
uint WordRead1314(ucharREG_Address)
{
uintREG_data;
ucharREG_data_H,REG_data_L;
I2C_Start(); //起始信号
I2C_SendByte(SlaveAddress); //发送设备地址+写信号
I2C_SendByte(REG_Address); //发送存储单元地址从0开始
I2C_Start(); //起始信号原因不明
I2C_SendByte(SlaveAddress+1); //发送设备地址+读信号
REG_data_H=I2C_RecvByte(); //读出寄存器数据
I2C_SendACK(0); //接收应答信号
REG_data_L=I2C_RecvByte(); //读出寄存器数据
I2C_SendACK(1); //接收应答非信号
I2C_Stop(); //发送停止信号
REG_data=REG_data_H; REG_data<<=8;
REG_data|=REG_data_L;
returnREG_data;
}
//**************************************
//初始化LDC1314
//**************************************
void InitLDC1314(void)
{
I2C_Init();
while(WordRead1314(DEVICE_ID)!=0x3025);//等待,I2C正常
//WordWrite1314(RESET_DEV,0x8800);
/*重启LDC1314*/
WordWrite1314(CONFIG,0x2451);
/*默认值,睡眠模式开,方便配置*/
WordWrite1314(CLOCK_DIVIDERS_CH0,0X500a);//fSENSOR不分频fCLK 2分频
/* 时钟源分频选择,分频系数1,1
Using L and C, 得fSENSOR = 1/2π×sqrt(L ×C)
注意fSENSOR须小于8.75 MHz,fSENSOR分频系数才能置1
注意fREF0须至少大于 4 ×fSENSOR,以决定fREF0分频系数
fin0 = fSENSOR0/CH0_FIN_DIVIDER
fREF0 = fCLK / CH0_FREF_DIVIDER
*/
WordWrite1314(SETTLECOUNT_CH0,0x0A60);
/* 建立(Settling)时间设置
计算得Q=Rp*sqrt(C/L)
寄存器值小于10取10大于10取其值,且应满足以下条件:
CHx_SETTLECOUNT≥QSENSORx×fREFx / (16 ×fSENSORx) (10进制)
(1)fSENSORx:x通道传感器频率
(2)fREFx:x通道参考频率
(3)QSENSORx:品质因数Q=Rp×sqrt(C/L)
注意,不等式右边算出有小数则向上取整
建立时间tSx = (CH0_SETTLECOUNT*16) / fREF0
通道切换时间tCsd = Channel Switch Delay = 692 ns + 5 / fref (us)
*/
WordWrite1314(RCOUNT_CH0,0xFFFF);
/*转换时间设置
得转换时间tCx = TSAMPLE(采样时间) –tSx–tCsd (us) 由下式算出寄存器的值(有小数则向下取整(舍去)):
转换时间tCx = (CHx_RCOUNT× 16) / fREFx (10进制)
注意寄存器的值化为16进制
*/
/*使用ERROR_CONFIG默认值,错误中断关闭*/
WordWrite1314(DRIVE_CURRENT_CH0,0x9800);
/*传感器驱动电流设置,使用请同时注意CONFIG寄存器相关配置
查数据手册的Figure 15,得IDRIVE值(10进制),INIT_DRIVE值不使用,保持默认
使用CH0_IDRIVE[15:11]时,Rp Override须打开
使用CH0_INIT_IDRIVE[10:6]时,保证AUTO_AMP_DIS位不置位
*/
//WordWrite1314(MUX_CONFIG,0x801);
/* 多通道转换选择,输入尖峰脉冲滤波器带宽选择,使用请同时注意CONFIG寄存器相关配
置
(a)置AUTOSCAN_EN位为b1使能连续模式(sequential mode)
(b)置RR_SEQUENCE位为b00使能两个通道的数据转换(channel 0,channel 1)
(c)置DEGLITCH位为b100设定输入尖峰脉冲滤波器带宽,此值必须高于谐振频率fTank!
*/
//WordWrite1314(OFFSET_CH0,0x00);
/*频率偏移(补偿)设置
可以设置从每个数据值中减去偏移值以补偿频率偏移或最大化动态范围的样本数据
fOFFSET0 = CH0_OFFSET * (fREF0/2^16)
且偏移值应小于fSENSORx_MIN / fREFx
*/
//WordWrite1314(RESET_DEV,0x00);
/*输出增益设置,[10:9],对所有通道有效
对于传感器信号变化量小于满量程25的系统,设置输出增益可以提供更高的分辨率(精度)
*/
/*
状态寄存器STATUS,ERROR_CONFIG
*/
WordWrite1314(CONFIG,0x1501);
/*默认连续转换(单)通道0,睡眠模式关,Rp Override开
低功耗模式关,传感器自动幅度校正(AUTO_AMP)关,Ref时钟源选外部时钟源
INTB中断开,高电流驱动关*/
}
//**************************************
//读取LDC1314转换结果,输入参数为选择通道数
//**************************************
uint LDC1314_Result(ucharChannal)
{
uint temp=0;
switch(Channal)
{
case 0x00:
temp=WordRead1314(DATA_CH0); //通道0
break;
case 0x01:
temp=WordRead1314(DATA_CH1); //通道1
break;
case 0x02:
temp=WordRead1314(DATA_CH2); //通道2
break;
case 0x03:
temp=WordRead1314(DATA_CH3); //通道3
break;
default :
break;
}
while((temp&0xF000)!=0);
/*有错误Flag!,有输出增益时注意此句,可能出错
0x000 = under range,0xfff = over range
*/
return temp;
}
LDC1314.H文件
#ifndef __LDC1314_H
#define __LDC1314_H
#include <msp430f169.h>
#include "config.h"
static void I2C_Init();
static void I2C_Start();
static void I2C_Stop();
static void I2C_SendACK(ucharack);
staticuchar I2C_RecvACK(); staticuchar I2C_SendByte(uchardat);
staticuchar I2C_RecvACK();
static void WordWrite1314(ucharREG_Address,uintREG_data);
staticuint WordRead1314(ucharREG_Address);
void InitLDC1314(void);
uint LDC1314_Result(ucharChannal);
//****定义LDC1314硬件接口不同硬件修改此处即可***********
#define LDC1314DIR P1DIR
#define LDC1314OUT P1OUT
#define LDC1314IN P1IN
#define LDC_SCL BIT2
#define LDC_SDA BIT3
#define LDC_INTB BIT4//中断
#define LDC_SD BIT5//置高,则进入掉电模式
//*********I2C硬件相关接口函数**************
#define LDC_SCL_OUT() LDC1314DIR |= LDC_SCL // SCL脚输出
#define LDC_SCL_H() LDC1314OUT |= LDC_SCL // SCL拉高
#define LDC_SCL_L() LDC1314OUT &= ~LDC_SCL // SCL拉低
#define LDC_SDA_OUT() LDC1314DIR |= LDC_SDA // SDA脚输出
#define LDC_SDA_H() LDC1314OUT |= LDC_SDA // SDA拉高
#define LDC_SDA_L() LDC1314OUT &= ~LDC_SDA // SDA拉低
#define LDC_SDA_IN() LDC1314DIR &= ~LDC_SDA // SDA脚输入
#define LDC_SDA_DAT() (LDC1314IN&LDC_SDA) // SDA输入数据
#define SlaveAddress 0x2A //IIC写入时的地址字节数据+1为读取ADDR接
高电平地址则为0x2B
#define DATA_CH0 0x00 //Channel 0 Conversion Result and Error Status
#define DATA_CH1 0x02
#define DATA_CH2 0x04
#define DATA_CH3 0x06
#define RCOUNT_CH0 0x08 //Reference Count setting for Channel 0
#define RCOUNT_CH1 0x09
#define RCOUNT_CH2 0x0A
#define RCOUNT_CH3 0x0B
#define OFFSET_CH0 0x0C //Offset value for Channel 0
#define OFFSET_CH1 0x0D
#define OFFSET_CH2 0x0E
#define OFFSET_CH3 0x0F
#define SETTLECOUNT_CH0 0x10 //Channel 0 Settling Reference Count
#define SETTLECOUNT_CH1 0x11
#define SETTLECOUNT_CH2 0x12
#define SETTLECOUNT_CH3 0x13
#define CLOCK_DIVIDERS_CH0 0x14
#define CLOCK_DIVIDERS_CH1 0x15
#define CLOCK_DIVIDERS_CH2 0x16
#define CLOCK_DIVIDERS_CH3 0x17
#define STATUS 0x18 //Device Status Report
#define ERROR_CONFIG 0x19 //Error Reporting Configuration
#define MUX_CONFIG 0x1A //Channel Multiplexing Configuration
#define CONFIG 0x1B //Conversion Configuration
#define RESET_DEV 0x1C //Reset Device
#define DRIVE_CURRENT_CH0 0x1E //Channel 0 sensor current drive configuration
#define DRIVE_CURRENT_CH1 0x1F
#define DRIVE_CURRENT_CH2 0x20
#define DRIVE_CURRENT_CH3 0x21
#define MANUFACTURER_ID 0x7E //厂商ID,默认值0x5449
#define DEVICE_ID 0x7F //设备ID,默认值0x3054
#endif
一周热门 更多>