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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

GD32F30x_AD5245数字电位计驱动程序

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

一、工具

  1、硬件:GD32F30x系列單片機

  2、編譯環境:KEIL

  3、AD5245芯片:AD5245BRJ10

二、芯片簡介

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

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

  其它具體介紹請看相關手冊,這里不再贅述。

三、芯片I2C通訊協議

  下圖包含了設備地址以及讀寫時序。

四、硬件電路

五、代碼實現

  1、設置電位計值函數

/**
  * @brief 數字電位計值設置
  * @param addr 數字電位計設備地址
  * @param value 數字電位計設置的值
  * @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);/*設置I2C頻率*/
    i2c_mode_addr_config(I2C1, I2C_I2CMODE_ENABLE, I2C_ADDFORMAT_7BITS, 0);/*設置I2C 地址長度*/

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

  3、I2C寫

/**
  * @brief I2C1寫函數
  * @param addr設備地址
  * @param pdata 數據指針
  * @param data_length 數據長度
  * @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讀函數
  * @param addr設備地址
  * @param pdata 數據指針
  * @param data_length 數據長度
  * @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

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。