久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1813|回復: 1
打印 上一主題 下一主題
收起左側

STM32控制FDC2214程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:442993 發(fā)表于 2020-3-28 09:31 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
#include "2214.h"

/**********************************************
* 硬件連接:------------------
*          | PB3  - SDIN      |
*          | PB4  - SCLK      |
*           ------------------
*
*********************************************************************************/


/**********************************用法********************************/
//#include "stm32f10x.h"
//#include "LED.h"
//#include "delay.h"
//#include "KEY.h"
//#include "OLED_IIC.h"
//#include "usart.h"
//#include "ADC.h"
//#include "DAC.h"
//#include "TIM.h"
//#include "2214.h"

//void FDC2214_GetData(void);
//u32 ch0,ch1,ch2,ch3;

//int main(void)
//{
//        u32 t = 0;
//        delay_init(); //延時函數初始化
//        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //設置 NVIC 中斷分組 2
//        uart_init(115200); //串口初始化波特率為 115200
//        OLED_Init();
//        OLED_Clear();
//        LED_Pin_Init(); //LED 端口初始化
//        OLED_ShowCHinese(90,0,7);//贊
//       
//        FDC2214_init();
//       
//        while(1)
//        {
//                        FDC2214_GetData();
//                        //printf("\r\nCH0~3(%d , %d , %d , %d)",ch0,ch1,ch2,ch3);
//                        OLED_ShowNum(0,0,ch0,16,16);
//                        OLED_ShowNum(0,2,ch1,16,16);
//                        OLED_ShowNum(0,4,ch2,16,16);
//                        OLED_ShowNum(0,6,ch3,16,16);
//                        delay_ms(500);         //延時300ms
//        }
//}

//void FDC2214_GetData(void)
//{
//    FDC2214_GetChannelData(FDC2214_Channel_0, &ch0);  
//    FDC2214_GetChannelData(FDC2214_Channel_1, &ch1);
//    FDC2214_GetChannelData(FDC2214_Channel_2, &ch2);
//    FDC2214_GetChannelData(FDC2214_Channel_3, &ch3);
//}




#define PI 3.14159265358979323846
#define ClockFrequency   36000000 //時鐘頻率

uint8_t CHx_FIN_SEL[4];
double fREFx[4];


void FDC_IIC_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(        RCC_APB2Periph_GPIOB, ENABLE );        //使能GPIOB時鐘
   
   
    RCC_APB2PeriphClockCmd(        RCC_APB2Periph_AFIO, ENABLE );
    GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);//關閉JTAG,釋放PB3,PB4,PA15
   
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽輸出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
    GPIO_SetBits(GPIOB,GPIO_Pin_3|GPIO_Pin_4);         //輸出高
}

void delay_2us(void)
{
    //一個NOP是1/72us  所以72個NOP是1us
    u32 i=0;  
    for(i=0;i<2;i++)
    {  
        __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
        __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
        __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
        __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
        __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();  
        __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
        __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
   
    }  
}
void FDC_IIC_Start(void)
{
        SDA_OUT();
        FDC_IIC_SDA_OUT=1;                    
        FDC_IIC_SCL=1;
        delay_2us();
        FDC_IIC_SDA_OUT=0;
        delay_2us();
        FDC_IIC_SCL=0;
        delay_2us();
}          


void FDC_IIC_Stop(void)
{
        SDA_OUT();
        FDC_IIC_SCL=0;
    delay_2us();
        FDC_IIC_SDA_OUT=0;
        delay_2us();
        FDC_IIC_SCL=1;
    delay_2us();
        FDC_IIC_SDA_OUT=1;
        delay_2us();                                                          
}

u8 FDC_IIC_Wait_Ack(void)
{
        u8 waitTime=0;
        SDA_IN();  
        FDC_IIC_SDA_OUT=1;
    delay_2us();          
        FDC_IIC_SCL=1;
    delay_2us();
        while(FDC_IIC_SDA_IN)
        {
                waitTime++;
                if(waitTime>250)
                {
                        FDC_IIC_Stop();
                        return 1;
                }
        }
        FDC_IIC_SCL=0;   
        return 0;  
}

void FDC_IIC_Ack(void)
{
        FDC_IIC_SCL=0;
    delay_2us();
        SDA_OUT();
        FDC_IIC_SDA_OUT=0;//發(fā)送0是ACK
        delay_2us();
        FDC_IIC_SCL=1;
        delay_2us();
        FDC_IIC_SCL=0;
    delay_2us();
}

void FDC_IIC_NAck(void)
{
        FDC_IIC_SCL=0;
    delay_2us();
        SDA_OUT();
        FDC_IIC_SDA_OUT=1;//發(fā)送1是nACK
        delay_2us();
        FDC_IIC_SCL=1;
        delay_2us();
        FDC_IIC_SCL=0;
    delay_2us();
}

void FDC_IIC_Send_Byte(u8 dat)
{                        
    u8 t;   
        SDA_OUT();
    FDC_IIC_SCL=0;       
    for(t=0;t<8;t++)
    {      
        
                delay_2us();
        FDC_IIC_SDA_OUT=(dat&0x80)>>7;
        dat<<=1;
        FDC_IIC_SCL=1;        
                delay_2us();
                FDC_IIC_SCL=0;
                delay_2us();       
    }
    //FDC_IIC_SCL=0;
}

u8 FDC_IIC_Read_Byte(u8 ack)
{
        u8 i,receive=0;
        FDC_IIC_SDA_OUT=1;
    SDA_IN();
    for(i=0;i<8;i++ )
        {
        receive<<=1;
        
        FDC_IIC_SCL=0;
        delay_2us();
                FDC_IIC_SCL=1;
        delay_2us();
        if(FDC_IIC_SDA_IN)receive++;//最低位置1   
    }
    FDC_IIC_SCL=0;
    if (!ack)
        FDC_IIC_NAck();
    else
        FDC_IIC_Ack();  
    return receive;
}




/*!
*  @brief      FDC_IIC寫FDC2214
*  @param      Slve_Addr     器件地址
*  @param      reg           寄存器
*  @param      data          數據
*  @since      v1.0
*  Sample usage:       FDC2214_Write16(FDC2214_Addr, FDC2214_CONFIG, 0xFFFF);
*/
void FDC2214_Write16(uint8_t Slve_Addr, uint8_t reg, uint16_t data)
{
    u8 dat;
    FDC_IIC_Start();
   
    FDC_IIC_Send_Byte(Slve_Addr << 1);
    FDC_IIC_Wait_Ack();
   
    FDC_IIC_Send_Byte(reg);
    FDC_IIC_Wait_Ack();
   
    dat=(data >> 8);
    FDC_IIC_Send_Byte(dat);
    FDC_IIC_Wait_Ack();
   
    dat=data & 0xFF;
    FDC_IIC_Send_Byte(dat);
    FDC_IIC_Wait_Ack();
   
    FDC_IIC_Stop();
}

/*!
*  @brief      FDC_IIC讀FDC2214
*  @param      Slve_Addr     器件地址
*  @param      reg           寄存器
*  @return     寄存器值
*  @since      v1.0
*  Sample usage:       FDC2214_Read16(FDC2214_Addr, FDC2214_CONFIG);
*/
uint16_t FDC2214_Read16(uint8_t Slve_Addr, uint8_t reg)
{
    uint16_t temp;

    FDC_IIC_Start();
    FDC_IIC_Send_Byte(Slve_Addr << 1);
    FDC_IIC_Wait_Ack();
    FDC_IIC_Send_Byte(reg);
    FDC_IIC_Wait_Ack();
    FDC_IIC_Start();
    FDC_IIC_Send_Byte((Slve_Addr << 1) | 0x01);
    FDC_IIC_Wait_Ack();
    temp = (uint16_t)(FDC_IIC_Read_Byte(1) << 8);
    temp |= FDC_IIC_Read_Byte(0);
    FDC_IIC_Stop();
   
    return temp;
}

/*!
*  @brief      讀取FDC2214一個通道的轉換值
*  @param      channel     通道
*  @param      *data       讀取的數據
*  @return     0:失敗;1:成功
*  @since      v1.0
*  Sample usage:       FDC2214_GetChannelData(FDC2214_Channel_0, &CH0_DATA);
*/
uint8_t FDC2214_GetChannelData(FDC2214_channel_t channel, uint32_t *data)
{
    int16_t timeout = 100;
    uint8_t dateReg_H;
    uint8_t dateReg_L;
    uint8_t bitUnreadConv;
    uint16_t status;
    uint32_t dataRead;

    switch(channel)
    {
        case FDC2214_Channel_0:
            dateReg_H = FDC2214_DATA_CH0;
            dateReg_L = FDC2214_DATA_LSB_CH0;
            bitUnreadConv = 0x0008;
        break;

        case FDC2214_Channel_1:
            dateReg_H = FDC2214_DATA_CH1;
            dateReg_L = FDC2214_DATA_LSB_CH1;
            bitUnreadConv = 0x0004;
        break;

        case FDC2214_Channel_2:
            dateReg_H = FDC2214_DATA_CH2;
            dateReg_L = FDC2214_DATA_LSB_CH2;
            bitUnreadConv = 0x0002;
        break;

        case FDC2214_Channel_3:
            dateReg_H = FDC2214_DATA_CH3;
            dateReg_L = FDC2214_DATA_LSB_CH3;
            bitUnreadConv = 0x0001;
        break;
    }

    status = FDC2214_Read16(FDC2214_Addr, FDC2214_STATUS);//讀取狀態(tài)寄存器的值
    while(timeout && !(status & bitUnreadConv))//檢查是否有未讀數據
    {
        status = FDC2214_Read16(FDC2214_Addr, FDC2214_STATUS);
        timeout--;
    }
    if(timeout)
    {
        dataRead = (uint32_t)(FDC2214_Read16(FDC2214_Addr, dateReg_H) << 16);
        dataRead |= FDC2214_Read16(FDC2214_Addr, dateReg_L);
        *data = dataRead;
        return 1;
    }
    else
    {
        //超時
      
        return 0;
    }
}

/*!
*  @brief      設置FDC2214一個通道的轉換時間,轉換時間(tCx)=(CHx_RCOUNT?16) / fREFx。
*  @param      channel     通道
*  @param      rcount      CHx_RCOUNT
*  @since      v1.0
*  Sample usage:       FDC2214_SetRcount(FDC2214_Channel_0, 0x0FFF);
*/
void FDC2214_SetRcount(FDC2214_channel_t channel, uint16_t rcount)
{
    if(rcount <= 0x00FF) return;

    switch(channel)
    {
        case FDC2214_Channel_0:
            FDC2214_Write16(FDC2214_Addr, FDC2214_RCOUNT_CH0, rcount);
        break;

        case FDC2214_Channel_1:
            FDC2214_Write16(FDC2214_Addr, FDC2214_RCOUNT_CH1, rcount);
        break;

        case FDC2214_Channel_2:
            FDC2214_Write16(FDC2214_Addr, FDC2214_RCOUNT_CH2, rcount);
        break;

        case FDC2214_Channel_3:
            FDC2214_Write16(FDC2214_Addr, FDC2214_RCOUNT_CH3, rcount);
        break;
    }
}

/*!
*  @brief      設置FDC2214一個通道的建立時間,使LC傳感器可以在通道x開始轉換之前穩(wěn)定下來,建立時間(tSx) = (CHx_SETTLECOUNT?16) ÷ fREFx。
                CHx_SETTLECOUNT = 0x00, 0x01時(tSx) = 32 ÷ fREFx。
*  @param      channel     通道
*  @param      count       CHx_SETTLECOUNT
*  @since      v1.0
*  @note       CHx_SETTLECOUNT > Vpk × fREFx × C × π^2 / (32 × IDRIVEX)
*  Sample usage:       FDC2214_SetSettleCount(FDC2214_Channel_0, 0x00FF);
*/
void FDC2214_SetSettleCount(FDC2214_channel_t channel, uint16_t count)
{
    switch(channel)
    {
        case FDC2214_Channel_0:
            FDC2214_Write16(FDC2214_Addr, FDC2214_SETTLECOUNT_CH0, count);
        break;

        case FDC2214_Channel_1:
            FDC2214_Write16(FDC2214_Addr, FDC2214_SETTLECOUNT_CH1, count);
        break;

        case FDC2214_Channel_2:
            FDC2214_Write16(FDC2214_Addr, FDC2214_SETTLECOUNT_CH2, count);
        break;

        case FDC2214_Channel_3:
            FDC2214_Write16(FDC2214_Addr, FDC2214_SETTLECOUNT_CH3, count);
        break;
    }
}

/*!
*  @brief      設置FDC2214一個通道的的時鐘頻率,
                差分傳感器配置:
                0x01 -- 傳感器頻率0.01MHz和8.75MHz
                0x02 -- 傳感器頻率5MHz和10MHz
                單端傳感器配置:
                0x01 -- 傳感器頻率0.01MHz和10MHz
*  @param      channel               通道
*  @param      frequency_select      時鐘選擇
*  @param      divider               分頻器,fREFx = fCLK / CHx_FREF_DIVIDER,
*  @note       fREFx is > 4 × fSENSOR(外部LC振蕩器頻率)
*  @since      v1.0
*  Sample usage:       FDC2214_SetChannelClock(FDC2214_Channel_0, 0x01, 0xFF);
*/
void FDC2214_SetChannelClock(FDC2214_channel_t channel, uint8_t frequency_select, uint16_t divider)
{
    uint16_t temp = 0;

    temp = (uint16_t)(frequency_select << 12) | (divider & 0x03FF);

    CHx_FIN_SEL[channel] = frequency_select;//記錄時鐘選擇
    fREFx[channel] = (double)ClockFrequency / divider;//記錄時鐘頻率

    switch(channel)
    {
        case FDC2214_Channel_0:
            FDC2214_Write16(FDC2214_Addr, FDC2214_CLOCK_DIVIDERS_CH0, temp);
        break;

        case FDC2214_Channel_1:
            FDC2214_Write16(FDC2214_Addr, FDC2214_CLOCK_DIVIDERS_CH1, temp);
        break;

        case FDC2214_Channel_2:
            FDC2214_Write16(FDC2214_Addr, FDC2214_CLOCK_DIVIDERS_CH2, temp);
        break;

        case FDC2214_Channel_3:
            FDC2214_Write16(FDC2214_Addr, FDC2214_CLOCK_DIVIDERS_CH3, temp);
        break;
    }
}

/*!
*  @brief      配置INTB引腳中斷功能
*  @param      mode      1:開中斷;0:關中斷
*  @since      v1.0
*  Sample usage:       FDC2214_SetDriveCurrent(FDC2214_Channel_0, FDC2214_Drive_Current_0_025);
*/
void FDC2214_SetINTB(uint8_t mode)
{
    uint16_t temp = 0;

    temp = FDC2214_Read16(FDC2214_Addr, FDC2214_CONFIG);
    temp &= 0xFF7F;
    if(mode)
        temp |= 0x0080;
    FDC2214_Write16(FDC2214_Addr, FDC2214_CONFIG, temp);

    temp = FDC2214_Read16(FDC2214_Addr, FDC2214_ERROR_CONFIG);
    temp &= 0xFFFE;
    if(mode)
        temp |= 0x0001;
    FDC2214_Write16(FDC2214_Addr, FDC2214_ERROR_CONFIG, temp);
}

/*!
*  @brief      激活FDC2214的一個通道,單通道模式
*  @param      channel     通道
*  @since      v1.0
*  Sample usage:       FDC2214_SetActiveChannel(FDC2214_Channel_0);
*/
void FDC2214_SetActiveChannel(FDC2214_channel_t channel)
{
    uint16_t temp = 0;
    temp = FDC2214_Read16(FDC2214_Addr, FDC2214_CONFIG);
    temp &= 0x3FFF;
    temp |= (uint16_t)(channel << 14);

    FDC2214_Write16(FDC2214_Addr, FDC2214_CONFIG, temp);
}

/*!
*  @brief      設置FDC2214的工作模式:正常、睡眠。
*  @param      mode     0:正常工作;1:睡激活模式選擇。眠
*  @since      v1.0
*  Sample usage:       FDC2214_SetSleepMode(0);
*/
void FDC2214_SetSleepMode(uint8_t mode)
{
    uint16_t temp = 0;
    temp = FDC2214_Read16(FDC2214_Addr, FDC2214_CONFIG);
    temp &= 0xDFFF;
    if(mode)temp |= 0x2000;

    FDC2214_Write16(FDC2214_Addr, FDC2214_CONFIG, temp);
}

/*!
*  @brief      FDC2214激活模式選擇。
*  @param      mode     0:全電流激活模式;1:低功率激活模式
*  @since      v1.0
*  Sample usage:       FDC2214_SetCurrentMode(1);
*/
void FDC2214_SetCurrentMode(uint8_t mode)
{
    uint16_t temp = 0;
    temp = FDC2214_Read16(FDC2214_Addr, FDC2214_CONFIG);
    temp &= 0xF7FF;
    if(mode)
        temp |= 0x800;

    FDC2214_Write16(FDC2214_Addr, FDC2214_CONFIG, temp);
}

/*!
*  @brief      設置FDC2214時鐘源
*  @param      src     0:內部時鐘源;1:外部時鐘源
*  @since      v1.0
*  Sample usage:       FDC2214_SetClockSource(1);
*/
void FDC2214_SetClockSource(uint8_t src)
{
    uint16_t temp = 0;
    temp = FDC2214_Read16(FDC2214_Addr, FDC2214_CONFIG);
    temp &= 0xFDFF;
    if(src)
        temp |= 0x200;

    FDC2214_Write16(FDC2214_Addr, FDC2214_CONFIG, temp);
}

/*!
*  @brief      高電流傳感器驅動,只適用于單通道模式。
*  @param      mode     0:正常(最大1.5mA);1:高電流傳感器驅動(>1.5mA)
*  @since      v1.0
*  Sample usage:       FDC2214_SetHighCurrentMode(0);
*/
void FDC2214_SetHighCurrentMode(uint8_t mode)
{
    uint16_t temp = 0;
    temp = FDC2214_Read16(FDC2214_Addr, FDC2214_CONFIG);
    temp &= 0xFFBF;
    if(mode)
        temp |= 0x40;

    FDC2214_Write16(FDC2214_Addr, FDC2214_CONFIG, temp);
}

/*!
*  @brief      設置FDC2214的MUX CONFIG寄存器
*  @param      autoscan      自動掃描模式 0:關閉,1:打開
*  @param      channels      自動掃描通道
*  @param      bandwidth     數字濾波器帶寬,大于外部LC振蕩器頻率
*  @since      v1.0
*  Sample usage:       FDC2214_SetMUX_CONFIG(1, FDC2214_Channel_Sequence_0_1_2, FDC2214_Bandwidth_10M);
*/
void FDC2214_SetMUX_CONFIG(uint8_t autoscan, FDC2214_channel_sequence_t channels, FDC2214_filter_bandwidth_t bandwidth)
{
    uint16_t temp = 0;

    if(autoscan)
    {
        temp = (uint16_t)(autoscan << 15) | (channels << 13) | 0x0208 | bandwidth;
    }
    else
    {
        temp = 0x0208 | bandwidth;
    }

    FDC2214_Write16(FDC2214_Addr, FDC2214_MUX_CONFIG, temp);
}

/*!
*  @brief      傳感器復位
*  @since      v1.0
*  Sample usage:       FDC2214_Reset();
*/
void FDC2214_Reset(void)
{
    FDC2214_Write16(FDC2214_Addr, FDC2214_RESET_DEV, 0x8000);
}

/*!
*  @brief      設置FDC2214的一個通道傳感器驅動電流,確保振蕩幅度在1.2V和1.8V之間。
*  @param      channel      通道
*  @param      current      電流大小
*  @since      v1.0
*  Sample usage:       FDC2214_SetDriveCurrent(FDC2214_Channel_0, FDC2214_Drive_Current_0_025);
*/
void FDC2214_SetDriveCurrent(FDC2214_channel_t channel, FDC2214_drive_current_t current)
{
    uint16_t temp = 0;
    temp = (uint16_t)(current << 11);

    switch(channel)
    {
        case FDC2214_Channel_0:
            FDC2214_Write16(FDC2214_Addr, FDC2214_DRIVE_CURRENT_CH0, temp);
        break;

        case FDC2214_Channel_1:
            FDC2214_Write16(FDC2214_Addr, FDC2214_DRIVE_CURRENT_CH1, temp);
        break;

        case FDC2214_Channel_2:
            FDC2214_Write16(FDC2214_Addr, FDC2214_DRIVE_CURRENT_CH2, temp);
        break;

        case FDC2214_Channel_3:
            FDC2214_Write16(FDC2214_Addr, FDC2214_DRIVE_CURRENT_CH3, temp);
        break;
    }
}

/*!
*  @brief      計算頻率
*  @param      channel      通道
*  @param      datax        讀取的轉換值
*  @return     頻率,單位Hz
*  @since      v1.0
*  Sample usage:       FDC2214_CalculateFrequency(FDC2214_Channel_0, 0xFF);
*/
double FDC2214_CalculateFrequency(FDC2214_channel_t channel, uint32_t datax)
{
    double frequency = 0.0;

    frequency = (double)(CHx_FIN_SEL[channel] * fREFx[channel] * datax) / 268435456.0;//2^28

    return frequency;
}

/*!
*  @brief      計算外部電容大小
*  @param      frequency      頻率大小,單位Hz
*  @param      inductance     板載電感大小,單位uH
*  @param      capacitance    板載電容大小,單位pF
*  @return     外部電容大小,單位pF
*  @since      v1.0
*  Sample usage:       FDC2214_CalculateCapacitance(FDC2214_Channel_0, 6000000, 18, 33);
*/
double FDC2214_CalculateCapacitance(double frequency, float inductance, float capacitance)
{
    double cap = 0.0;

    cap = (double)(1.0 / (inductance * (2 * PI * frequency) * (2 * PI * frequency)));

    return cap;
}

/*!
*  @brief      FDC2214初始化函數
*  @return     1:成功;0:失敗
*  @since      v1.0
*  Sample usage:       FDC2214_Init();
*/
uint8_t FDC2214_Init(void)
{
    uint16_t deviceID = 0;
    deviceID = FDC2214_Read16(FDC2214_Addr, FDC2214_DEVICE_ID);//讀器件ID
    if(deviceID == FDC2214_ID)
    {
        printf("\r\nFDC2214 ID:%d",deviceID);
        FDC2214_Reset();
        
   
        FDC2214_SetRcount(FDC2214_Channel_0, 5000);//2000us 轉換周期
        FDC2214_SetRcount(FDC2214_Channel_1, 5000);//2000us 轉換周期
        FDC2214_SetRcount(FDC2214_Channel_2, 5000);//2000us 轉換周期
        FDC2214_SetRcount(FDC2214_Channel_3, 5000);//2000us 轉換周期
        FDC2214_SetSettleCount(FDC2214_Channel_0, 200);//200 cycles 等待時間
        FDC2214_SetSettleCount(FDC2214_Channel_1, 200);//200 cycles 等待時間
        FDC2214_SetSettleCount(FDC2214_Channel_2, 200);//200 cycles 等待時間
        FDC2214_SetSettleCount(FDC2214_Channel_3, 200);//200 cycles 等待時間
        FDC2214_SetChannelClock(FDC2214_Channel_0, 2, 1);//設置時鐘分頻,1分頻,40MHz
        FDC2214_SetChannelClock(FDC2214_Channel_1, 2, 1);//設置時鐘分頻,1分頻,40MHz
        FDC2214_SetChannelClock(FDC2214_Channel_2, 2, 1);//設置時鐘分頻,1分頻,40MHz
        FDC2214_SetChannelClock(FDC2214_Channel_3, 2, 1);//設置時鐘分頻,1分頻,40MHz
        
        FDC2214_SetINTB(0);//關閉INTB中斷
        //FDC2214_SetActiveChannel(FDC2214_Channel_0);//開啟通道0
        FDC2214_SetCurrentMode(0);//全電流激活模式
        FDC2214_SetClockSource(1);//外部時鐘源
        FDC2214_SetHighCurrentMode(0);//正常電流傳感器驅動
        
        FDC2214_SetMUX_CONFIG(1, FDC2214_Channel_Sequence_0_1_2_3, FDC2214_Bandwidth_10M);//打開自動掃描,10MHz帶寬
        
        FDC2214_SetDriveCurrent(FDC2214_Channel_0, FDC2214_Drive_Current_0_081);//通道0驅動電流0.081mA
        FDC2214_SetDriveCurrent(FDC2214_Channel_1, FDC2214_Drive_Current_0_081);//通道1驅動電流0.081mA
        FDC2214_SetDriveCurrent(FDC2214_Channel_2, FDC2214_Drive_Current_0_081);//通道2驅動電流0.081mA
        FDC2214_SetDriveCurrent(FDC2214_Channel_3, FDC2214_Drive_Current_0_081);//通道3驅動電流0.081mA
        
        
        FDC2214_SetSleepMode(0);//退出睡眠狀態(tài),開始工作
        delay_ms(100);
        
        return 1;
    }
    else
    {
                        printf("\r\nFDC2214 ID:%d",deviceID);
        printf("\r\nFDC2214 Init Failed!!\r\n");
    }

    return 0;
}



void FDC2214_init(void)
{
        FDC_IIC_Init();
  FDC2214_Init();
}



/**************************************************************************************/

#ifndef __2214_H
#define __2214_H
#include "sys.h"
#include "stdio.h"
#include "delay.h"

#define FDC_IIC_SCL         PBout(4)
#define FDC_IIC_SDA_OUT     PBout(3)
#define FDC_IIC_SDA_IN      PBin(3)

#define SDA_OUT()       {GPIOB->CRL&=0XFFFF0FFF;GPIOB->CRL|=(u32)3<<12;}//推挽輸出
#define SDA_IN()        {GPIOB->CRL&=0XFFFF0FFF;GPIOB->CRL|=(u32)8<<12;}//上拉輸入


#define SWAP16(data)    (uint32_t)((((uint16_t)(data) & (0xFF<<0 ))<<8)|(((uint32_t)(data) & (0xFF<<8))>>8))
#define FDC2214_Addr                 (0x2A)
#define FDC2214_DATA_CH0             (0x00)
#define FDC2214_DATA_LSB_CH0         (0x01)
#define FDC2214_DATA_CH1             (0x02)
#define FDC2214_DATA_LSB_CH1         (0x03)
#define FDC2214_DATA_CH2             (0x04)
#define FDC2214_DATA_LSB_CH2         (0x05)
#define FDC2214_DATA_CH3             (0x06)
#define FDC2214_DATA_LSB_CH3         (0x07)
#define FDC2214_RCOUNT_CH0           (0x08)
#define FDC2214_RCOUNT_CH1           (0x09)
#define FDC2214_RCOUNT_CH2           (0x0A)
#define FDC2214_RCOUNT_CH3           (0x0B)
#define FDC2214_SETTLECOUNT_CH0      (0x10)
#define FDC2214_SETTLECOUNT_CH1      (0x11)
#define FDC2214_SETTLECOUNT_CH2      (0x12)
#define FDC2214_SETTLECOUNT_CH3      (0x13)
#define FDC2214_CLOCK_DIVIDERS_CH0   (0x14)
#define FDC2214_CLOCK_DIVIDERS_CH1   (0x15)
#define FDC2214_CLOCK_DIVIDERS_CH2   (0x16)
#define FDC2214_CLOCK_DIVIDERS_CH3   (0x17)
#define FDC2214_STATUS               (0x18)
#define FDC2214_ERROR_CONFIG         (0x19)
#define FDC2214_CONFIG               (0x1A)
#define FDC2214_MUX_CONFIG           (0x1B)
#define FDC2214_RESET_DEV            (0x1C)
#define FDC2214_DRIVE_CURRENT_CH0    (0x1E)
#define FDC2214_DRIVE_CURRENT_CH1    (0x1F)
#define FDC2214_DRIVE_CURRENT_CH2    (0x20)
#define FDC2214_DRIVE_CURRENT_CH3    (0x21)
#define FDC2214_MANUFACTURER_ID      (0x7E)
#define FDC2214_DEVICE_ID            (0x7F)

#define FDC2214_ID                   (0x3055)


typedef enum
{
    FDC2214_Channel_0 = 0x00,
    FDC2214_Channel_1 = 0x01,
    FDC2214_Channel_2 = 0x02,
    FDC2214_Channel_3 = 0x03  
}FDC2214_channel_t;


typedef enum
{
    FDC2214_Channel_Sequence_0_1      = 0x00,
    FDC2214_Channel_Sequence_0_1_2    = 0x01,
    FDC2214_Channel_Sequence_0_1_2_3  = 0x02,
}FDC2214_channel_sequence_t;


typedef enum
{
    FDC2214_Bandwidth_1M   = 0x01, //1MHz
    FDC2214_Bandwidth_3_3M = 0x04, //3.3MHz
    FDC2214_Bandwidth_10M  = 0x05, //10MHz
    FDC2214_Bandwidth_33M  = 0x07  //33MHz
}FDC2214_filter_bandwidth_t;


typedef enum
{
    FDC2214_Drive_Current_0_016 = 0x00, //0.016mA
    FDC2214_Drive_Current_0_018 = 0x01, //0.018mA
    FDC2214_Drive_Current_0_021 = 0x02, //0.021mA
    FDC2214_Drive_Current_0_025 = 0x03, //0.025mA
    FDC2214_Drive_Current_0_028 = 0x04, //0.028mA
    FDC2214_Drive_Current_0_033 = 0x05, //0.033mA
    FDC2214_Drive_Current_0_038 = 0x06, //0.038mA
    FDC2214_Drive_Current_0_044 = 0x07, //0.044mA
    FDC2214_Drive_Current_0_052 = 0x08, //0.052mA
    FDC2214_Drive_Current_0_060 = 0x09, //0.060mA
    FDC2214_Drive_Current_0_069 = 0x0A, //0.069mA
    FDC2214_Drive_Current_0_081 = 0x0B, //0.081mA
    FDC2214_Drive_Current_0_093 = 0x0C, //0.093mA
    FDC2214_Drive_Current_0_108 = 0x0D, //0.108mA
    FDC2214_Drive_Current_0_126 = 0x0E, //0.126mA
    FDC2214_Drive_Current_0_146 = 0x0F, //0.146mA
    FDC2214_Drive_Current_0_169 = 0x10, //0.169mA
    FDC2214_Drive_Current_0_196 = 0x11, //0.196mA
    FDC2214_Drive_Current_0_228 = 0x12, //0.228mA
    FDC2214_Drive_Current_0_264 = 0x13, //0.264mA
    FDC2214_Drive_Current_0_307 = 0x14, //0.307mA
    FDC2214_Drive_Current_0_356 = 0x15, //0.356mA
    FDC2214_Drive_Current_0_413 = 0x16, //0.413mA
    FDC2214_Drive_Current_0_479 = 0x17, //0.479mA
    FDC2214_Drive_Current_0_555 = 0x18, //0.555mA
    FDC2214_Drive_Current_0_644 = 0x19, //0.644mA
    FDC2214_Drive_Current_0_747 = 0x1A, //0.747mA
    FDC2214_Drive_Current_0_867 = 0x1B, //0.867mA
    FDC2214_Drive_Current_1_006 = 0x1C, //1.006mA
    FDC2214_Drive_Current_1_167 = 0x1D, //1.167mA
    FDC2214_Drive_Current_1_354 = 0x1E, //1.354mA
    FDC2214_Drive_Current_1_571 = 0x1F  //1.571mA
}FDC2214_drive_current_t;

void FDC2214_Write16(uint8_t Slve_Addr, uint8_t reg, uint16_t data);
uint16_t FDC2214_Read16(uint8_t Slve_Addr, uint8_t reg);
uint8_t FDC2214_GetChannelData(FDC2214_channel_t channel, uint32_t *data);
void FDC2214_SetRcount(FDC2214_channel_t channel, uint16_t rcount);
void FDC2214_SetSettleCount(FDC2214_channel_t channel, uint16_t count);
void FDC2214_SetChannelClock(FDC2214_channel_t channel, uint8_t frequency_select, uint16_t divider);
void FDC2214_SetINTB(uint8_t mode);
void FDC2214_SetActiveChannel(FDC2214_channel_t channel);
void FDC2214_SetSleepMode(uint8_t mode);
void FDC2214_SetCurrentMode(uint8_t mode);
void FDC2214_SetClockSource(uint8_t src);
void FDC2214_SetHighCurrentMode(uint8_t mode);
void FDC2214_SetMUX_CONFIG(uint8_t autoscan, FDC2214_channel_sequence_t channels, FDC2214_filter_bandwidth_t bandwidth);
void FDC2214_Reset(void);
void FDC2214_SetDriveCurrent(FDC2214_channel_t channel, FDC2214_drive_current_t current);
double FDC2214_CalculateFrequency(FDC2214_channel_t channel, uint32_t datax);
double FDC2214_CalculateCapacitance(double frequency, float inductance, float capacitance);
uint8_t FDC2214_Init(void);



void FDC2214_init(void);
       
void FDC_IIC_Init(void);
void FDC_IIC_Start(void);
void FDC_IIC_Stop(void);
u8 FDC_IIC_Wait_Ack(void);
void FDC_IIC_Ack(void);
void FDC_IIC_NAck(void);
void FDC_IIC_Send_Byte(u8 dat);
u8 FDC_IIC_Read_Byte(u8 ack);

void delay_2us(void);
#endif


2214.zip

5.99 KB, 下載次數: 9, 下載積分: 黑幣 -5

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:1 發(fā)表于 2020-3-30 01:00 | 只看該作者
本帖需要重新編輯補全電路原理圖,源碼,詳細說明與圖片即可獲得100+黑幣(帖子下方有編輯按鈕)
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日日日操| 免费精品 | 久久久久久久综合 | 久久久亚洲精品视频 | 欧美另类视频 | 日韩在线一区二区三区 | 成人综合伊人 | 精品二区 | 日韩中文字幕视频 | 综合久久99 | а_天堂中文最新版地址 | 国产视频中文字幕 | 久久精品视频播放 | 日韩国产高清在线观看 | 日本一区二区高清视频 | 欧洲国产精品视频 | 黄色成人在线观看 | 超碰97免费在线 | 精品免费国产一区二区三区 | 日韩成人免费视频 | jizz视频| 美女视频网站久久 | 亚洲国产成人av好男人在线观看 | 久久久久久久久毛片 | 亚洲国产精品一区二区三区 | 夜夜骑av| 日韩成人在线播放 | 中文字幕乱码亚洲精品一区 | 亚洲精品一区二区 | www4虎| 成人一区二区三区在线 | 在线免费观看黄a | 久久这里有精品 | 日屁视频 | 久久久久久久91 | 亚洲免费视频网址 | 欧美黄视频 | 欧美乱淫视频 | 91av视频在线观看 | 国产福利视频导航 | 日韩精品视频在线观看一区二区三区 |