日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

GD32F30x_AD5245数字电位计驱动程序

發(fā)布時(shí)間:2023/12/13 综合教程 37 生活家
生活随笔 收集整理的這篇文章主要介紹了 GD32F30x_AD5245数字电位计驱动程序 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、工具

  1、硬件:GD32F30x系列單片機(jī)

  2、編譯環(huán)境:KEIL

  3、AD5245芯片:AD5245BRJ10

二、芯片簡(jiǎn)介

  AD5245是一款256位調(diào)整可實(shí)現(xiàn)與機(jī)械電位計(jì)或可變電阻相同功能的電子器件。采用2.7V至5.5V電源供電,功耗小于8μA,適合電池供電的便攜式應(yīng)用。游標(biāo)設(shè)置可通過I2C兼容型數(shù)字接口控制,也可以利用該接口讀回游標(biāo)寄存器的內(nèi)容。AD0可以將最多兩個(gè)器件置于同一總線上。命令位將游標(biāo)位置復(fù)位到中間值或關(guān)斷器件,使之進(jìn)入零功耗狀態(tài)。

  A端和B端間RDAC的標(biāo)稱電阻可以為5KΩ、10KΩ、50KΩ和100KΩ。可變電阻的標(biāo)稱電阻(RAB)有256個(gè)觸點(diǎn),通過游標(biāo)端和B端觸點(diǎn)訪問。RDAC鎖存器中的8位數(shù)據(jù)經(jīng)過解碼,用于選擇256種可能的設(shè)置之一。

  其它具體介紹請(qǐng)看相關(guān)手冊(cè),這里不再贅述。

三、芯片I2C通訊協(xié)議

  下圖包含了設(shè)備地址以及讀寫時(shí)序。

四、硬件電路

五、代碼實(shí)現(xiàn)

  1、設(shè)置電位計(jì)值函數(shù)

/**
  * @brief 數(shù)字電位計(jì)值設(shè)置
  * @param addr 數(shù)字電位計(jì)設(shè)備地址
  * @param value 數(shù)字電位計(jì)設(shè)置的值
  * @retval none
  * @author Mr.W
  * @date 2020-10-25
  */
void ad5245_value_set(uint8_t addr, uint8_t value)
{
    uint8_t data[2] = {0};
    
    data[0] = 0;
    data[1] = (value&0xFF);
    
    i2c_write(addr, &data[0], 2);
}

  2、I2C初始化

/**
  *****************************************************************************
  * @Name   : I2C1_GPIO_Configuration
  * @Brief  : I2C1引腳初始化
  *****************************************************************************
**/
void I2C1_GPIO_Configuration(void)
{
    rcu_periph_clock_enable(RCU_GPIOB);
    rcu_periph_clock_enable(RCU_AF);
    
    gpio_init(GPIOB, GPIO_MODE_AF_OD, GPIO_OSPEED_50MHZ, GPIO_PIN_10 | GPIO_PIN_11);   
}

/**
  *****************************************************************************
  * @Name   : I2C1_Configuration
  * @Brief  : I2C1配置
  * @Input  : 
  * @Output : 
  * @Return : 
  *****************************************************************************
**/
void I2C1_Configuration(void)
{
    I2C1_GPIO_Configuration();
    rcu_periph_clock_enable(RCU_I2C1);
    
    i2c_clock_config(I2C1, 250000, I2C_DTCY_2);/*設(shè)置I2C頻率*/
    i2c_mode_addr_config(I2C1, I2C_I2CMODE_ENABLE, I2C_ADDFORMAT_7BITS, 0);/*設(shè)置I2C 地址長(zhǎng)度*/

    i2c_enable(I2C1);
    i2c_ack_config(I2C1, I2C_ACK_ENABLE);/*開啟應(yīng)答*/
    
}

  3、I2C寫

/**
  * @brief I2C1寫函數(shù)
  * @param addr設(shè)備地址
  * @param pdata 數(shù)據(jù)指針
  * @param data_length 數(shù)據(jù)長(zhǎng)度
  * @retval none
  * @author Mr.W
  * @date 2020-11-11
  */
void i2c_write(uint8_t addr, uint8_t *pdata, uint32_t data_length)
{
    uint32_t i;
    
    /* wait until I2C bus is idle */
    while(i2c_flag_get(I2C1, I2C_FLAG_I2CBSY));
    /* send a start condition to I2C bus */
    i2c_start_on_bus(I2C1);
    /* wait until SBSEND bit is set */
    while(!i2c_flag_get(I2C1, I2C_FLAG_SBSEND));    
    /* send slave address to I2C bus */
    i2c_master_addressing(I2C1, addr, I2C_TRANSMITTER);
    /* wait until ADDSEND bit is set */
    while(!i2c_flag_get(I2C1, I2C_FLAG_ADDSEND));
    /* clear ADDSEND bit */
    i2c_flag_clear(I2C1, I2C_FLAG_ADDSEND);
    /* wait until the transmit data buffer is empty */
    while(!i2c_flag_get(I2C1, I2C_FLAG_TBE));
    for(i = 0; i < data_length; i++){
        /* data transmission */
        i2c_data_transmit(I2C1, pdata[i]);
        /* wait until the TBE bit is set */
        while(!i2c_flag_get(I2C1, I2C_FLAG_TBE));
    }
    /* send a stop condition to I2C bus */
    i2c_stop_on_bus(I2C1);
    /* wait until stop condition generate */ 
    while(I2C_CTL0(I2C1)&0x0200);    
}

  4、I2C讀

/**
  * @brief I2C1讀函數(shù)
  * @param addr設(shè)備地址
  * @param pdata 數(shù)據(jù)指針
  * @param data_length 數(shù)據(jù)長(zhǎng)度
  * @retval none
  * @author Mr.W
  * @date 2020-11-11
  */
void i2c_read(uint8_t addr, uint8_t *pdata, uint32_t data_length)
{
    uint32_t i;
    
    /* send a NACK for the next data byte which will be received into the shift register */
    i2c_ackpos_config(I2C1, I2C_ACKPOS_NEXT);
    /* wait until I2C bus is idle */
    while(i2c_flag_get(I2C1, I2C_FLAG_I2CBSY));
    /* send a start condition to I2C bus */
    i2c_start_on_bus(I2C1);
    /* wait until SBSEND bit is set */
    while(!i2c_flag_get(I2C1, I2C_FLAG_SBSEND));
    /* send slave address to I2C bus */
    i2c_master_addressing(I2C1, addr, I2C_RECEIVER);
    /* disable ACK before clearing ADDSEND bit */
    i2c_ack_config(I2C1, I2C_ACK_DISABLE);
    /* wait until ADDSEND bit is set */
    while(!i2c_flag_get(I2C1, I2C_FLAG_ADDSEND));
    /* clear ADDSEND bit */
    i2c_flag_clear(I2C1, I2C_FLAG_ADDSEND);
    /* Wait until the last data byte is received into the shift register */
    while(!i2c_flag_get(I2C1, I2C_FLAG_BTC));
    for(i = 0; i < data_length; i++)
    {
        /* wait until the RBNE bit is set */
        while(!i2c_flag_get(I2C1, I2C_FLAG_RBNE));
        /* read a data from I2C_DATA */
        pdata[i] = i2c_data_receive(I2C1);
    }
    /* send a stop condition */
    i2c_stop_on_bus(I2C1);
    /* wait until stop condition generate */ 
    while(I2C_CTL0(I2C1)&0x0200);
    i2c_ackpos_config(I2C1, I2C_ACKPOS_CURRENT);
    /* enable acknowledge */
    i2c_ack_config(I2C1, I2C_ACK_ENABLE);
}

#endif

總結(jié)

以上是生活随笔為你收集整理的GD32F30x_AD5245数字电位计驱动程序的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。