GD32F30x_AD5245数字电位计驱动程序
生活随笔
收集整理的這篇文章主要介紹了
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数字电位计驱动程序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: centos 系统日志
- 下一篇: 【CVPR2021】Neighbor2N