GD32F30x_AD5245数字电位计驱动程序
一、工具
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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: centos 系统日志
- 下一篇: 【CVPR2021】Neighbor2N