|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区
您需要 登录 才可以下载或查看,没有账号?立即注册
×
/*************************************************
File name: fdc2214.c // 文件名
Author: 松越电子 Version:V1.0 Date:2020-11-15 // 作者、版本及完成日期
Description: fdc2214 驱动模块(4/8通道28位CDC) // 用于详细说明此程序文件完成的主要功能,与其他模块
// 或函数的接口,输出值、取值范围、含义及参数间的控
// 制、顺序、独立或依赖等关系
Others: fdc2214模块和CPU之间采用IIC接口。// 其它内容的说明
Function List: // 主要函数列表,每条记录应包括函数名及功能简要说明
1. ....
History: // 修改历史记录列表,每条修改记录应包括修改日期、修改
// 者及修改内容简述
1. Date:
Author:
Modification:
2. ...
*************************************************/
#include "fdc2214.h"
#include "delay.h"
#include "led.h"
/*
FDC2214IC STM32F103ZET6
3.3V <------ 3.3V 3.3V供电
GND ------- GND 地
FDCA_SCL ------> PB6 IIC的CLK时钟线
FDCA_SDA <-----> PB7 IIC的SDA数据线
FDCA_ADDR <------ PD6 FDC的地址设置线:拉低是0x2A;拉高是0xq2B
FDCA_INTB ------> PD5 FDC的外部中断输出引脚
FDCA_SD <------ PD4 FDC的关机引脚
FDCB_SCL ------> PD2 IIC的CLK时钟线
FDCB_SDA <-----> PD3 IIC的SDA数据线
FDCB_ADDR <------ PC12 FDC的地址设置线:拉低是0x2A;拉高是0xq2B
FDCB_INTB ------> PC11 FDC的外部中断输出引脚
FDCB_SD <------ PC10 FDC的关机引脚
*/
u32 Data_FDCA,Data_FDCB,Data_FDCTESET0,Data_FDCTESET1,Data_FDCTESET2,Data_FDCTESET3,Data_FDCTESET4,Data_FDCTESET5;
u32 CDCDATA[4];
//FDC_I2C及读写操作**************************************************
//FDC IIC 延时函数
void FDC_IIC_Delay(void)
{
delay_us(2);
}
void FDC_GPIO_Init(void)
{
}
//初始化IIC I/O口
void FDC_IIC_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC |RCC_APB2Periph_GPIOD,ENABLE);//先使能外设IO PORTC时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;//端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure); //根据设定参数初始化GPIO
GPIO_SetBits(GPIOB,GPIO_Pin_6 | GPIO_Pin_7); //初始化后默认拉高
// GPIO_ResetBits(GPIOB,GPIO_Pin_6 | GPIO_Pin_7); //初始化后默认拉低
/* PD2、PD3分别为FDCB的SCL和SDA;PD4、PD6分别为FDCA的SD和ADDR */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_6; //端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOD, &GPIO_InitStructure); //根据设定参数初始化GPIO
GPIO_ResetBits(GPIOD,GPIO_Pin_6); //FDCA-ADDR拉低:地址值为0x2A
GPIO_ResetBits(GPIOD,GPIO_Pin_4); //FDCA-SD拉低退出关机模式
GPIO_SetBits(GPIOD,GPIO_Pin_2 | GPIO_Pin_3);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_12; //端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOC, &GPIO_InitStructure); //根据设定参数初始化GPIO
GPIO_SetBits(GPIOC,GPIO_Pin_12); //FDCB-ADDR拉高:地址值为0x2B
GPIO_ResetBits(GPIOC,GPIO_Pin_10); //FDCB-SD拉低退出关机模式
/* 配置FDCA-INTB为浮动输入模式(实际上CPU复位后就是输入状态);如果不用的话可以操作寄存器禁用INTB功能 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOD, &GPIO_InitStructure); //根据设定参数初始化GPIO
/* 配置FDCB-INTB为浮动输入模式(实际上CPU复位后就是输入状态);如果不用的话可以操作寄存器禁用INTB功能 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; //端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOC, &GPIO_InitStructure); //根据设定参数初始化GPIO
}
/*************************************************************************************/
//FDCA产生IIC起始信号
void FDCA_IIC_Start(void)
{
FDCA_SDA_OUT(); //sda线输出
FDCA_IIC_SDA=1;
FDCA_IIC_SCL=1;
FDC_IIC_Delay();
FDCA_IIC_SDA=0; //START:when CLK is high,DATA change form high to low
FDC_IIC_Delay();
FDCA_IIC_SCL=0; //钳住I2C总线,准备发送或接收数据
FDC_IIC_Delay();
}
//FDCB产生IIC起始信号
void FDCB_IIC_Start(void)
{
FDCB_SDA_OUT(); //sda线输出
FDCB_IIC_SDA=1;
FDCB_IIC_SCL=1;
FDC_IIC_Delay();
FDCB_IIC_SDA=0; //START:when CLK is high,DATA change form high to low
FDC_IIC_Delay();
FDCB_IIC_SCL=0; //钳住I2C总线,准备发送或接收数据
FDC_IIC_Delay();
}
/*************************************************************************************/
/*************************************************************************************/
//FDCA产生IIC停止信号
void FDCA_IIC_Stop(void)
{
FDCA_SDA_OUT();//sda线输出
FDCA_IIC_SCL=0;
FDCA_IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
FDC_IIC_Delay();
FDCA_IIC_SCL=1;
FDCA_IIC_SDA=1;//发送I2C总线结束信号
FDC_IIC_Delay();
}
//FDCB产生IIC停止信号
void FDCB_IIC_Stop(void)
{
FDCB_SDA_OUT();//sda线输出
FDCB_IIC_SCL=0;
FDCB_IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
FDC_IIC_Delay();
FDCB_IIC_SCL=1;
FDCB_IIC_SDA=1;//发送I2C总线结束信号
FDC_IIC_Delay();
}
/*************************************************************************************/
/*************************************************************************************/
//FDCA等待应答信号到来
//返回值:1,接收应答失败
// 0,接收应答成功
u8 FDCA_IIC_Wait_Ack(void)
{
u8 ucErrTime=0;
FDCA_SDA_IN(); //SDA设置为输入
FDCA_IIC_SDA=1;FDC_IIC_Delay();
FDCA_IIC_SCL=1;FDC_IIC_Delay();
while(FDCA_READ_SDA)
{
ucErrTime++;
if(ucErrTime>250)
{
FDCA_IIC_Stop();
return 1;
}
}
FDCA_IIC_SCL=0;//时钟输出0
return 0;
}
//FDCB等待应答信号到来
//返回值:1,接收应答失败
// 0,接收应答成功
u8 FDCB_IIC_Wait_Ack(void)
{
u8 ucErrTime=0;
FDCB_SDA_IN(); //SDA设置为输入
FDCB_IIC_SDA=1;FDC_IIC_Delay();
FDCB_IIC_SCL=1;FDC_IIC_Delay();
while(FDCB_READ_SDA)
{
ucErrTime++;
if(ucErrTime>250)
{
FDCB_IIC_Stop();
return 1;
}
}
FDCB_IIC_SCL=0;//时钟输出0
return 0;
}
/*************************************************************************************/
/*************************************************************************************/
//FDCA产生ACK应答
void FDCA_IIC_Ack(void)
{
FDCA_IIC_SCL=0;
FDCA_SDA_OUT();
FDCA_IIC_SDA=0;
FDC_IIC_Delay();
FDCA_IIC_SCL=1;
FDC_IIC_Delay();
FDCA_IIC_SCL=0;
}
//FDCB产生ACK应答
void FDCB_IIC_Ack(void)
{
FDCB_IIC_SCL=0;
FDCB_SDA_OUT();
FDCB_IIC_SDA=0;
FDC_IIC_Delay();
FDCB_IIC_SCL=1;
FDC_IIC_Delay();
FDCB_IIC_SCL=0;
}
/*************************************************************************************/
/*************************************************************************************/
//FDCA不产生ACK应答
void FDCA_IIC_NAck(void)
{
FDCA_IIC_SCL=0;
FDCA_SDA_OUT();
FDCA_IIC_SDA=1;
FDC_IIC_Delay();
FDCA_IIC_SCL=1;
FDC_IIC_Delay();
FDCA_IIC_SCL=0;
}
//FDCB不产生ACK应答
void FDCB_IIC_NAck(void)
{
FDCB_IIC_SCL=0;
FDCB_SDA_OUT();
FDCB_IIC_SDA=1;
FDC_IIC_Delay();
FDCB_IIC_SCL=1;
FDC_IIC_Delay();
FDCB_IIC_SCL=0;
}
/*************************************************************************************/
/*************************************************************************************/
//FDCA通过IIC发送一个字节
//返回从机有无应答
//1,有应答
//0,无应答
void FDCA_IIC_Send_Byte(u8 txd)
{
u8 t;
FDCA_SDA_OUT();
FDCA_IIC_SCL=0;//拉低时钟开始数据传输
for(t=0;t<8;t++)
{
/* 完成移位发送 */
FDCA_IIC_SDA=(txd&0x80)>>7;
txd<<=1;
FDCA_IIC_SCL=1;
FDC_IIC_Delay();
FDCA_IIC_SCL=0;
FDC_IIC_Delay();
}
}
//FDCB通过IIC发送一个字节
//返回从机有无应答
//1,有应答
//0,无应答
void FDCB_IIC_Send_Byte(u8 txd)
{
u8 t;
FDCB_SDA_OUT();
FDCB_IIC_SCL=0;//拉低时钟开始数据传输
for(t=0;t<8;t++)
{
/* 完成移位发送 */
FDCB_IIC_SDA=(txd&0x80)>>7;
txd<<=1;
FDCB_IIC_SCL=1;
FDC_IIC_Delay();
FDCB_IIC_SCL=0;
FDC_IIC_Delay();
}
}
/*************************************************************************************/
/*************************************************************************************/
//FDCA读1个字节,ack=1时,发送ACK,ack=0,发送nACK
u8 FDCA_IIC_Read_Byte(unsigned char ack)
{
unsigned char i,receive=0;
FDCA_SDA_IN();//SDA设置为输入
for(i=0;i<8;i++ )
{
FDCA_IIC_SCL=0;
FDC_IIC_Delay();
FDCA_IIC_SCL=1;
receive<<=1;
if(FDCA_READ_SDA)receive++;
FDC_IIC_Delay();
}
if (!ack)
FDCA_IIC_NAck();//发送nACK
else
FDCA_IIC_Ack(); //发送ACK
return receive;
}
//FDCB读1个字节,ack=1时,发送ACK,ack=0,发送nACK
u8 FDCB_IIC_Read_Byte(unsigned char ack)
{
unsigned char i,receive=0;
FDCB_SDA_IN();//SDA设置为输入
for(i=0;i<8;i++ )
{
FDCB_IIC_SCL=0;
FDC_IIC_Delay();
FDCB_IIC_SCL=1;
receive<<=1;
if(FDCB_READ_SDA)receive++;
FDC_IIC_Delay();
}
if (!ack)
FDCB_IIC_NAck();//发送nACK
else
FDCB_IIC_Ack(); //发送ACK
return receive;
}
/*************************************************************************************/
/*************************************************************************************/
//FDC寄存器操作***********************************************************************
/*FDC2214设置函数
*IIC写2个字节
*reg:寄存器地址
*data1:数据1
*data2:数据2
*返回值:0 正常
* 其他 错误代码
*/
u8 FDCASet_FDC2214(u8 reg,u8 MSB,u8 LSB)
{
FDCA_IIC_Start();
FDCA_IIC_Send_Byte((FDC2214_A_ADDR<<1)|0);//发送器件地址+写命令
if(FDCA_IIC_Wait_Ack()) //等待应答
{
FDCA_IIC_Stop();
return 1;
}
FDCA_IIC_Send_Byte(reg);//写寄存器地址
FDCA_IIC_Wait_Ack(); //等待应答
FDCA_IIC_Send_Byte(MSB); //发送数据1
if(FDCA_IIC_Wait_Ack()) //等待ACK
{
FDCA_IIC_Stop();
return 1;
}
FDCA_IIC_Send_Byte(LSB); //发送数据2
if(FDCA_IIC_Wait_Ack()) //等待ACK
{
FDCA_IIC_Stop();
return 1;
}
FDCA_IIC_Stop();
return 0;
}
/*FDC2214设置函数
*IIC写2个字节
*reg:寄存器地址
*data1:数据1
*data2:数据2
*返回值:0 正常
* 其他 错误代码
*/
u8 FDCBSet_FDC2214(u8 reg,u8 MSB,u8 LSB)
{
FDCB_IIC_Start();
FDCB_IIC_Send_Byte((FDC2214_B_ADDR<<1)|0);//发送器件地址+写命令
if(FDCB_IIC_Wait_Ack()) //等待应答
{
FDCB_IIC_Stop();
return 1;
}
FDCB_IIC_Send_Byte(reg);//写寄存器地址
FDCB_IIC_Wait_Ack(); //等待应答
FDCB_IIC_Send_Byte(MSB); //发送数据1
if(FDCB_IIC_Wait_Ack()) //等待ACK
{
FDCB_IIC_Stop();
return 1;
}
FDCB_IIC_Send_Byte(LSB); //发送数据2
if(FDCB_IIC_Wait_Ack()) //等待ACK
{
FDCB_IIC_Stop();
return 1;
}
FDCB_IIC_Stop();
return 0;
}
/*************************************************************************************/
/*************************************************************************************/
/*读取FDC2214寄存器数据
*IIC读2个字节
*reg:寄存器地址
*返回值:读到的数据
*/
u16 FDCA_Read(u8 reg)
{
u16 res1;
FDCA_IIC_Start();
/*标准I2C的7位从地址(即7位寻址协议):从机地址在启动信号后的
第一个字节开始传输,该字节的前7位为从机地址,第8位为读写位,
其中0表示写,1表示读。*/
FDCA_IIC_Send_Byte((FDC2214_A_ADDR<<1)|0);//发送器件地址+写命令
FDCA_IIC_Wait_Ack(); //等待应答
FDCA_IIC_Send_Byte(reg); //写寄存器地址
FDCA_IIC_Wait_Ack(); //等待应答
FDCA_IIC_Start();
FDCA_IIC_Send_Byte((FDC2214_A_ADDR<<1)|1);//发送器件地址+读命令
FDCA_IIC_Wait_Ack(); //等待应答
res1=FDCA_IIC_Read_Byte(1)<<8;//读取数据,发送ACK
res1|=FDCA_IIC_Read_Byte(0);//读取数据,发送nACK
FDCA_IIC_Stop(); //产生一个停止条件
return res1;
}
/*读取FDC2214寄存器数据
*IIC读2个字节
*reg:寄存器地址
*返回值:读到的数据
*/
u16 FDCB_Read(u8 reg)
{
u16 res2;
FDCB_IIC_Start();
/*标准I2C的7位从地址(即7位寻址协议):从机地址在启动信号后的
第一个字节开始传输,该字节的前7位为从机地址,第8位为读写位,
其中0表示写,1表示读。*/
FDCB_IIC_Send_Byte((FDC2214_B_ADDR<<1)|0);//发送器件地址+写命令
FDCB_IIC_Wait_Ack(); //等待应答
FDCB_IIC_Send_Byte(reg); //写寄存器地址
FDCB_IIC_Wait_Ack(); //等待应答
FDCB_IIC_Start();
FDCB_IIC_Send_Byte((FDC2214_B_ADDR<<1)|1);//发送器件地址+读命令
FDCB_IIC_Wait_Ack(); //等待应答
res2=FDCB_IIC_Read_Byte(1)<<8;//读取数据,发送ACK
res2|=FDCB_IIC_Read_Byte(0);//读取数据,发送nACK
FDCB_IIC_Stop(); //产生一个停止条件
return res2;
}
/*************************************************************************************/
/*得到通道x转换后的数据
*index:0 -> CH0
* 1 -> CH1
* 2 -> CH2
* 3 -> CH3
*返回值:读到的数据
*/
//u16 FCD2214_ReadCH(u8 index)
//{
// u16 result;
// switch(index)
// {
// case 0:
// result = FDC_Read(DATA_CH0)&0x0FFF;
// result = (result<<4)|(FDC_Read(DATA_LSB_CH0)>>12);
// break;
// case 1:
// result = FDC_Read(DATA_CH1)&0x0FFF;
// result = (result<<4)|(FDC_Read(DATA_LSB_CH1)>>12);
// break;
// case 2:
// result = FDC_Read(DATA_CH2)&0x0FFF;
// result = (result<<4)|(FDC_Read(DATA_LSB_CH2)>>12);
// break;
// case 3:
// result = FDC_Read(DATA_CH3)&0x0FFF;
// result = (result<<4)|(FDC_Read(DATA_LSB_CH3)>>12);
// break;
// default:break;
// }
// return result;
//}
/*************************************************************************************/
u32 FCD2214A_ReadCH(u8 index)
{
u32 result;
switch(index)
{
case 0:
result = FDCA_Read(DATA_CH0)&0x0FFF; //读取16MSB,并将其中4MSB清零。
result = (result<<16)|(FDCA_Read(DATA_LSB_CH0)); //读取16LSB,左移操作与16MSB合并。
break;
case 1:
result = FDCA_Read(DATA_CH1)&0x0FFF;
result = (result<<16)|(FDCA_Read(DATA_LSB_CH1));
break;
case 2:
result = FDCA_Read(DATA_CH2)&0x0FFF;
result = (result<<16)|(FDCA_Read(DATA_LSB_CH2));
break;
case 3:
result = FDCA_Read(DATA_CH3)&0x0FFF;
result = (result<<16)|(FDCA_Read(DATA_LSB_CH3));
break;
default:break;
}
result =result&0x0FFFFFFF; //再次将4MSB清零,因为传感器是28位有效数据位
return result;
}
u32 FCD2214B_ReadCH(u8 index)
{
u32 result;
switch(index)
{
case 0:
result = FDCB_Read(DATA_CH0)&0x0FFF; //读取16MSB,并将其中4MSB清零。
result = (result<<16)|(FDCB_Read(DATA_LSB_CH0)); //读取16LSB,左移操作与16MSB合并。
break;
case 1:
result = FDCB_Read(DATA_CH1)&0x0FFF;
result = (result<<16)|(FDCB_Read(DATA_LSB_CH1));
break;
case 2:
result = FDCB_Read(DATA_CH2)&0x0FFF;
result = (result<<16)|(FDCB_Read(DATA_LSB_CH2));
break;
case 3:
result = FDCB_Read(DATA_CH3)&0x0FFF;
result = (result<<16)|(FDCB_Read(DATA_LSB_CH3));
break;
default:break;
}
result =result&0x0FFFFFFF; //再次将4MSB清零,因为传感器是28位有效数据位
return result;
}
/*************************************************************************************/
/*************************************************************************************/
/*FDC2214初始化函数
*返回值:0:初始化正常
* 1:不正常
*/
u8 FDC2214_Init(void)
{
u16 resA,resB;
//FDC2214芯片IO口初始化
// FDC_GPIO_Init();
//软件IIC总线初始化
FDC_IIC_Init();
//检测FDCA和FDCB的ID是否正确,再初始化寄存器
resA=FDCA_Read(MANUFACTURER_ID);
resB=FDCB_Read(MANUFACTURER_ID);
if(resA==0x5449)
{
//设置Set_FDC2214寄存器
FDCASet_FDC2214(RCOUNT_CH0,0x34,0xFB);//参考计数转换间隔时间(T=(RCOUNT_CH0*16)/Frefx)
FDCASet_FDC2214(RCOUNT_CH1,0x34,0xFB);
FDCASet_FDC2214(RCOUNT_CH2,0x34,0xFB);
FDCASet_FDC2214(RCOUNT_CH3,0x34,0xFB);
FDCASet_FDC2214(SETTLECOUNT_CH0,0x00,0x1B);//转换之前的稳定时间(T=(SETTLECOUNT_CHx*16)/Frefx)
FDCASet_FDC2214(SETTLECOUNT_CH1,0x00,0x1B);
FDCASet_FDC2214(SETTLECOUNT_CH2,0x00,0x1B);
FDCASet_FDC2214(SETTLECOUNT_CH3,0x00,0x1B);
FDCASet_FDC2214(CLOCK_DIVIDERS_C_CH0,0x20,0x04);//选择在0.01MHz ~ 10MHz的传感器频率
FDCASet_FDC2214(CLOCK_DIVIDERS_C_CH1,0x20,0x04);//Frefx = Fclk = 43.4MHz/2(2分频)
FDCASet_FDC2214(CLOCK_DIVIDERS_C_CH2,0x20,0x04);//CHx_REF_DIVIDER=2;CHx_FIN_SEL=2
FDCASet_FDC2214(CLOCK_DIVIDERS_C_CH3,0x20,0x04);
FDCASet_FDC2214(DRIVE_CURRENT_CH0,0x78,0x00);//0.146ma(传感器时钟建立+转换时间的驱动电流)
FDCASet_FDC2214(DRIVE_CURRENT_CH1,0x78,0x00);
FDCASet_FDC2214(DRIVE_CURRENT_CH2,0x78,0x00);
FDCASet_FDC2214(DRIVE_CURRENT_CH3,0x78,0x00);
FDCASet_FDC2214(ERROR_CONFIG,0x00,0x00);//全部禁止错误汇报
FDCASet_FDC2214(MUX_CONFIG,0xC2,0x0D);//通道0,1,2 ,3;选择10Mhz为超过振荡槽振荡频率的最低设置,多通道,四通道
FDCASet_FDC2214(CONFIG,0x16,0x01); //之前值为0x14,0x01
}
if(resB==0x5449)
{
//设置Set_FDC2214寄存器
FDCBSet_FDC2214(RCOUNT_CH0,0x34,0xFB);//参考计数转换间隔时间(T=(RCOUNT_CH0*16)/Frefx)
FDCBSet_FDC2214(RCOUNT_CH1,0x34,0xFB);
FDCBSet_FDC2214(RCOUNT_CH2,0x34,0xFB);
FDCBSet_FDC2214(RCOUNT_CH3,0x34,0xFB);
FDCBSet_FDC2214(SETTLECOUNT_CH0,0x00,0x1B);//转换之前的稳定时间(T=(SETTLECOUNT_CHx*16)/Frefx)
FDCBSet_FDC2214(SETTLECOUNT_CH1,0x00,0x1B);
FDCBSet_FDC2214(SETTLECOUNT_CH2,0x00,0x1B);
FDCBSet_FDC2214(SETTLECOUNT_CH3,0x00,0x1B);
FDCBSet_FDC2214(CLOCK_DIVIDERS_C_CH0,0x20,0x04);//选择在0.01MHz ~ 10MHz的传感器频率 之前是:0x20,0x02 先选择:0x20,0x04
FDCBSet_FDC2214(CLOCK_DIVIDERS_C_CH1,0x20,0x04);//Frefx = Fclk = 43.4MHz/2(2分频)
FDCBSet_FDC2214(CLOCK_DIVIDERS_C_CH2,0x20,0x04);//CHx_REF_DIVIDER=2;CHx_FIN_SEL=2;
FDCBSet_FDC2214(CLOCK_DIVIDERS_C_CH3,0x20,0x04);
FDCBSet_FDC2214(DRIVE_CURRENT_CH0,0x78,0x00);//0.146ma(传感器时钟建立+转换时间的驱动电流)
FDCBSet_FDC2214(DRIVE_CURRENT_CH1,0x78,0x00);
FDCBSet_FDC2214(DRIVE_CURRENT_CH2,0x78,0x00);
FDCBSet_FDC2214(DRIVE_CURRENT_CH3,0x78,0x00);
FDCBSet_FDC2214(ERROR_CONFIG,0x00,0x00);//全部禁止错误汇报
FDCBSet_FDC2214(MUX_CONFIG,0xC2,0x0D);//通道0,1,2 ,3;选择10Mhz为超过振荡槽振荡频率的最低设置,多通道,四通道:之前是0xC2,0x0D 先改为:0xC2,0x0F(30MHz) 0xC2,0x0(3.3MHz)
FDCBSet_FDC2214(CONFIG,0x16,0x01); //之前值为0x14,0x01
}
else return 1;
return 0;
}
/*************************************************************************************/
/*************************************************************************************/
/*FDCA测量线路电容
*index:0:线路0
* 1:线路1
* 2:线路2
* 3:线路3
*返回值:线路总电容C
*/
//详细数据的解析计算过程,请参考DATASHEET的P18
//float CapA_Calculate(u8 index)
//{
// float Cap;
// Data_FDCA = FCD2214A_ReadCH(index); //返回一个u32数据
//// CDCDATA[index] = Data_FDCA;//0x01A1FF00
//// Cap = 56645.763f/((float)Data_FDC);
//// return ((Cap*Cap)-33);
//// 2E28 == 268435456;
// Cap = 232021045.248/(Data_FDCA);
// return (Cap*Cap);
//}
/*FDCB测量线路电容
*index:0:线路0
* 1:线路1
* 2:线路2
* 3:线路3
*返回值:线路总电容C
*/
//详细数据的解析计算过程,请参考DATASHEET的P18
//float CapB_Calculate(u8 index)
//{
// float Cap;
// Data_FDCB = FCD2214B_ReadCH(index); //返回一个u32数据
//// Cap = 56645.763f/((float)Data_FDC);
//// return ((Cap*Cap)-33);
//// 2E28 == 268435456;
// Cap = 232021045.248/(Data_FDCB);
// return (Cap*Cap);
//}
/*************************************************************************************/
/*
【1】首先要对Datasheet-->12-->Figure 12频率和时钟图进行解读(这个图很重要):
-->CHx_FIN_SEL(寄存器地址0x14~0x17)决定:fINx = fSENSORx/CHx_FIN_SEL
|
传感器端(也就是被测电容端)fSENSORx是被测电容与L的谐振频率--->fINx--->fIN
|
-->CONFIG(0x1A)、MUX_CONFIG(0x1B)可做一些相应操作
-->REF_CLK_SRC(寄存器地址0x1A)决定:REF_CLK_SRC=1使用外部时钟40MHz、REF_CLK_SRC=0使用内部时钟
|
芯片端时钟(这里以选择外部时钟为例)fCLKIN--->fCLK--->fREFx-->CONFIG(0x1A)、MUX_CONFIG(0x1B)可做一些相应操作-->fREF
|
-->CH0_FREF_DIVIDER(寄存器地址0x14~0x17)决定:fREFx = fCLK/CHx_FREF_DIVIDER
**-->我们这里:CHx_FIN_SEL = 2;因为选择的是单端测量(b10)也就是fINx = fSENSORx/CHx_FIN_SEL = fSENSORx/2
REF_CLK_SRC = 1;使用外部时钟40MHz
CH0_FREF_DIVIDER = 2;也就是fREFx = fCLK/CHx_FREF_DIVIDER = 40MHz/2 = 20MHz
****注意:fIN < fREF/4
【2】其次要对Datasheet-->18-->计算公式7、9(这个更重要):
被测电容值 CSENSOR = (1/L*(2π*fSENSORx)2) - C 其中L、C为P39中Figure 55的L、C
传感器端频率 fSENSORx = CHx_FIN_SEL*fREFx*DATAx/pow(2,28) 其中DATAx就是读取到的通道值为28bit
*/
/*******************************************************************************************************************/
double CapA_Calculate(u8 index)
{
double Cap;
Data_FDCA = FCD2214A_ReadCH(index); //返回一个u32数据
if(index == 0) Data_FDCTESET0 = Data_FDCA;
else if(index == 1) Data_FDCTESET1 = Data_FDCA;
else if(index == 2) Data_FDCTESET2 = Data_FDCA;
else if(index == 3) Data_FDCTESET3 = Data_FDCA;
Cap = (Data_FDCA * 10000000.0F * 2.0F)/268435456.0F;//得到F(sensorx)
Cap = Cap * 2.0F *3.1415926F;
Cap = 1.0F/((Cap * Cap) * 0.000018F);
Cap = Cap - 0.000000000033F;
Cap = Cap * 1000000000000.0F;//F转换pF;转化斜率单值0.7130,分段滤波采样;
return Cap;
}
double CapB_Calculate(u8 index)
{
double Cap;
Data_FDCB = FCD2214B_ReadCH(index); //返回一个u32数据
Cap = (Data_FDCB * 10000000.0F * 2.0F)/268435456.0F;//得到F(sensorx)
Cap = Cap * 2.0F *3.1415926F;
Cap = 1.0F/((Cap * Cap) * 0.000018F);
Cap = Cap - 0.000000000033F;
Cap = Cap * 1000000000000.0F * 0.7130F;//F转换pF;
return Cap;
}
/*******************************************************************************************************************/ |
|