我们从2011年坚守至今,只想做存粹的技术论坛。  由于网站在外面,点击附件后要很长世间才弹出下载,请耐心等待,勿重复点击不要用Edge和IE浏览器下载,否则提示不安全下载不了

 找回密码
 立即注册
搜索
查看: 841|回复: 3

FDC2214驱动源码.C

[复制链接]

该用户从未签到

14

主题

81

回帖

321

积分

1元学习Allegro(1期)

积分
321

终身成就奖

发表于 2021-5-13 16:56:20 | 显示全部楼层 |阅读模式
/*************************************************
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--&gt12-->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--&gt18-->计算公式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;
}
/*******************************************************************************************************************/
回复

使用道具 举报

  • TA的每日心情
    郁闷
    2024-9-5 08:50
  • 签到天数: 26 天

    [LV.4]偶尔看看III

    2

    主题

    4501

    回帖

    1593

    积分

    PADS20210412初级班

    积分
    1593

    社区居民终身成就奖特殊贡献奖原创先锋奖优秀斑竹奖

    发表于 2021-5-13 21:00:34 | 显示全部楼层
    回复

    使用道具 举报

    该用户从未签到

    1

    主题

    6740

    回帖

    3

    积分

    二级逆天

    积分
    3

    终身成就奖特殊贡献奖原创先锋奖优秀斑竹奖

    发表于 2021-5-14 07:57:47 | 显示全部楼层
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2024-7-8 15:22
  • 签到天数: 1 天

    [LV.1]初来乍到

    61

    主题

    5331

    回帖

    1万

    积分

    PADS-181217初级班

    积分
    15973

    终身成就奖特殊贡献奖原创先锋奖优秀斑竹奖

    发表于 2021-5-14 08:42:26 | 显示全部楼层
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    论坛开启做任务可以
    额外奖励金币快速赚
    积分升级了


    Copyright ©2011-2024 NTpcb.com All Right Reserved.  Powered by Discuz! (NTpcb)

    本站信息均由会员发表,不代表NTpcb立场,如侵犯了您的权利请发帖投诉

    平平安安
    TOP
    快速回复 返回顶部 返回列表