Realización del controlador SGM58031 y SCM

Realización del controlador SGM58031 y SCM



Configuración del IDE CUBO

inserte la descripción de la imagen aquí
Use el hardware I2C para comunicarse con el chip sgm, el hardware I2C está configurado arriba y otros parámetros pueden ser predeterminados.

Paquete de comunicación I2C

implementación del paquete

/**
  * @brief  Manages error callback by re-initializing I2C.
  * @param  Addr: I2C Address
  * @retval None
  */
static void I2Cx_Error(uint8_t Addr)
{
	/* 恢复I2C寄存器为默认值 */
	HAL_I2C_DeInit(&hi2c1);
	/* 重新初始化I2C外设 */
	MX_I2C1_Init();
}
/**
  * @brief  写寄存器,这是提供给上层的接口
    * @param  slave_addr: 从机地址
    * @param     reg_addr:寄存器地址
    * @param len:写入的长度
    *    @param data_ptr:指向要写入的数据
  * @retval 正常为0,不正常为非0
  *   HAL_OK       = 0x00U,
	  HAL_ERROR    = 0x01U,
	  HAL_BUSY     = 0x02U,
	  HAL_TIMEOUT  = 0x03U
  */
int smg58031_i2c_writeregister(uint8_t slave_addr,
                                        uint8_t reg_addr,
                                        uint8_t len,
                                        uint8_t *data_ptr)
{
    HAL_StatusTypeDef status = HAL_OK;
    status = HAL_I2C_Mem_Write(&hi2c1, slave_addr, reg_addr, I2C_MEMADD_SIZE_8BIT,data_ptr, len,I2Cx_FLAG_TIMEOUT);
    /* 检查通讯状态 */
    if(status != HAL_OK)
    {
        /* 总线出错处理 */
        I2Cx_Error(slave_addr);
    }
    while (HAL_I2C_GetState(&hi2c1) != HAL_I2C_STATE_READY)
    {

    }
    /* 检查SENSOR是否就绪进行下一次读写操作 */
    while (HAL_I2C_IsDeviceReady(&hi2c1, slave_addr, I2Cx_FLAG_TIMEOUT, I2Cx_FLAG_TIMEOUT) == HAL_TIMEOUT);
    /* 等待传输结束 */
    while (HAL_I2C_GetState(&hi2c1) != HAL_I2C_STATE_READY)
    {

    }
    return status;
}

/**
  * @brief  读寄存器,这是提供给上层的接口
    * @param  slave_addr: 从机地址
    * @param     reg_addr:寄存器地址
    * @param len:要读取的长度
    *    @param data_ptr:指向要存储数据的指针
  * @retval 正常为0,不正常为非0
  */
int smg58031_i2c_readregister(uint8_t slave_addr,
                                        uint8_t reg_addr,
                                        uint8_t len,
                                        uint8_t *data_ptr)
{
    HAL_StatusTypeDef status = HAL_OK;
    status =HAL_I2C_Mem_Read(&hi2c1,slave_addr,reg_addr,I2C_MEMADD_SIZE_8BIT,data_ptr,len,I2Cx_FLAG_TIMEOUT);
    /* 检查通讯状态 */
    if(status != HAL_OK)
    {
        /* 总线出错处理 */
        I2Cx_Error(slave_addr);
    }
    while (HAL_I2C_GetState(&hi2c1) != HAL_I2C_STATE_READY)
    {

    }
    /* 检查SENSOR是否就绪进行下一次读写操作 */
    while (HAL_I2C_IsDeviceReady(&hi2c1, slave_addr, I2Cx_FLAG_TIMEOUT, I2Cx_FLAG_TIMEOUT) == HAL_TIMEOUT);
    /* 等待传输结束 */
    while (HAL_I2C_GetState(&hi2c1) != HAL_I2C_STATE_READY)
    {

    }
    return status;
}

Archivo de encabezado correspondiente


#define I2Cx_FLAG_TIMEOUT             ((uint32_t) 1000) //0x1100
#define I2Cx_LONG_TIMEOUT             ((uint32_t) (300 * I2Cx_FLAG_TIMEOUT)) //was300
/**
  * @brief  读寄存器,这是提供给上层的接口
    * @param  slave_addr: 从机地址
    * @param     reg_addr:寄存器地址
    * @param len:要读取的长度
    *    @param data_ptr:指向要存储数据的指针
  * @retval 正常为0,不正常为非0
  */
int smg58031_i2c_readregister(uint8_t slave_addr,
                                        uint8_t reg_addr,
                                        uint8_t len,
                                        uint8_t *data_ptr);
/**
  * @brief  写寄存器,这是提供给上层的接口
    * @param  slave_addr: 从机地址
    * @param     reg_addr:寄存器地址
    * @param len:写入的长度
    *    @param data_ptr:指向要写入的数据
  * @retval 正常为0,不正常为非0
  */
int smg58031_i2c_writeregister(uint8_t slave_addr,
                                        uint8_t reg_addr,
                                        uint8_t len,
                                        uint8_t *data_ptr);

Este código es una biblioteca de funciones para manipular el bus I2C. El siguiente es un análisis detallado del código:

Función I2Cx_Error:

Esta función se usa para manejar la devolución de llamada de error I2C para recuperarse del error reiniciando el periférico I2C.
Primero, restaure los registros del periférico I2C1 a los valores predeterminados utilizando la función HAL_I2C_DeInit.
Luego, llame a la función MX_I2C1_Init para reinicializar el periférico I2C1.
Función smg58031_i2c_writerregister:

Esta función se utiliza para escribir datos de registro en el dispositivo esclavo.
Los parámetros de la función incluyen la dirección del esclavo slave_addr, la dirección del registro reg_addr, la longitud de los datos que se escribirán len y el puntero data_ptr que apunta a los datos que se escribirán.
Primero, defina un estado de variable de tipo HAL_StatusTypeDef e inicialícelo a HAL_OK.
Luego, llame a la función HAL_I2C_Mem_Write para escribir datos en el dispositivo esclavo.
Luego, verifique el estado de comunicación, si el estado no es HAL_OK, llame a la función I2Cx_Error para manejar el error del bus.
Luego, use la función HAL_I2C_GetState para esperar a que el estado de I2C cambie a HAL_I2C_STATE_READY, lo que indica que la transferencia se completó.
Continúe esperando a que el dispositivo esclavo esté listo mediante la función HAL_I2C_IsDeviceReady.
Finalmente, use la función HAL_I2C_GetState nuevamente para esperar a que el estado de I2C cambie a HAL_I2C_STATE_READY para garantizar el final de la transferencia.
Finalmente, la función devuelve el estado.
función smg58031_i2c_readregister:

Esta función se utiliza para leer datos de registro de un dispositivo esclavo.
Los parámetros de la función son similares a la función smg58031_i2c_writerregister.
Primero, defina un estado de variable de tipo HAL_StatusTypeDef e inicialícelo a HAL_OK.
Luego, llame a la función HAL_I2C_Mem_Read para leer datos del dispositivo esclavo.
Luego, verifique el estado de comunicación, si el estado no es HAL_OK, llame a la función I2Cx_Error para manejar el error del bus.
Luego, use la función HAL_I2C_GetState para esperar a que el estado de I2C cambie a HAL_I2C_STATE_READY, lo que indica que la transferencia se completó.
Continúe esperando a que el dispositivo esclavo esté listo mediante la función HAL_I2C_IsDeviceReady.
Finalmente, use la función HAL_I2C_GetState nuevamente para esperar a que el estado de I2C cambie a HAL_I2C_STATE_READY para garantizar el final de la transferencia.
Finalmente, la función devuelve el estado.
En general, este código es una biblioteca de funciones de operación de bus I2C simple, que proporciona las funciones de escribir datos de registro en el dispositivo esclavo y leer datos de registro del dispositivo esclavo. Antes y después de la transferencia de datos, se comprueba el estado de la comunicación y se reinicializa el periférico I2C en caso de error.

Realización de la comunicación SGM58031

archivo principal

#define I2C_ADC_ADDR 				0x90		//adc模块的写地址
//#define I2C_ADC_ADDR				0x91		//adc模块的读地址


//输入电压 = AINP-AINN    默认AINP=AIN0 AINN=AIN1
//输出数据速率  = 100HZ,即10ms更新一次数据
/* SGM58031内部寄存器地址 */
#define Conversion_Register      0x00    //AD值转换寄存器,16bit数据,默认值0x0000,只读
#define Config_Register          0x01    //配置寄存器,默认0x8583,可读可写
#define Lo_Thresh_Register       0x02    //比较器阈值下限,默认0x8000
#define Hi_Thresh_Register       0x03    //比较器阈值上限,默认0x7FFF
#define Config1_Register         0x04    //扩展配置寄存器,默认0x0000
#define ChipID_Register          0x05    //芯片ID,默认0x0080
#define GN_Trim1_Register        0x06    //增益修正,默认0x03FA

extern uint8_t control_flag ;
void set_adc_control(void);


extern uint16_t smg58031_Data_index;//用于保存当前写入数据的索引	0~100	存ADC采采样值用

int read_adc_value(void);

realización de la comunicación

uint8_t control_flag = 0;

void set_adc_control(void){
	int i = 1;
	uint8_t value_Config[2] = {0};
	uint8_t read_value_Config[2] = {0};
	uint8_t value_Config1[1] = {0};
	uint8_t chip_id[2] = {0};
	uint8_t id;
	/* Config_Register 0x01
	 * bit[15]					工作状态/单次激发转换开始对于写入状态:
									0=无效果
									1=开始单次转换(处于单次激发模式时)
									对于读取状态:
									0=芯片正在进行转换
									1=芯片没有进行转换
									此位报告芯片的状态。
									只有当芯片处于断电状态时,才能写入此位。
	 * bit[14:12] = 100			AIN p = AIN0 和 AIN n =GND
	 * bit[11:9] = 010		 	fs = +-2.048V
	 * bit[8] = 0				连续转换模式
	 * bit[7:5] = 110		 	ADC输出数据速率 960HZ (DR_SEL = 1)或 800HZ(DR_SEL = 0)
	 *
	 * bit[4:0]=00011
	 * bit[4]					0=具有滞后的传统比较器(默认)
								1=窗口比较器
	 * bit[3]					比较器极性
									0=有效低(默认)
									1=有效高
									此位设置ALERT/RDY引脚的有效极性
	 * bit[2]					锁存比较器
									0=非锁存比较器(默认)
									1=锁存比较器
									该位设置ALERT/RDY引脚在其输出设置后是否锁存,或者当ADC转换结果在上限和下限阈值限制内时是否复位。
	 * bit[1:0]					比较器队列和禁用功能
									00=一次转换后断言
									01=两次转换后断定
									10=四次转换后确信
									11=禁用比较器(默认)
									这些位可以禁用比较器。
									在alert/RDY引脚上输出警报之前,这些位可以将连续ADC转换所需的时间设置为超过阈值。
	 */
	uint16_t value_Config_Register = 0x44c3;//默认0x8583h
	value_Config[0] = value_Config_Register >> 8;
	value_Config[1] = value_Config_Register;

	/* Config1_Register	0x04
	 * bit[6]		0=DR[2:0]=000~111转换率为6.25Hz、12.5Hz、25Hz、50Hz、100Hz、200Hz、400Hz和800Hz(默认)
	 * 				1=DR[2:0]=000~111转换速率为7.5Hz、15Hz、30Hz、60Hz、120Hz、240Hz、480Hz和960Hz
	 */
	uint16_t value_Config1_Register = 0x0040;//默认0x8583h
	value_Config1[1] = value_Config1_Register;

	while(i){
		i = 0;
		i += smg58031_i2c_writeregister(I2C_ADC_ADDR, Config_Register, 2, value_Config);
			HAL_Delay(20);

		i += smg58031_i2c_writeregister(I2C_ADC_ADDR, Config1_Register, 2, value_Config1);
	
		HAL_Delay(20);
		i += smg58031_i2c_readregister(I2C_ADC_ADDR, ChipID_Register, 2, chip_id);
		HAL_Delay(20);
		id = (chip_id[0] << 3) | (chip_id[1] >> 5);
		
//		if(id == 0x90)
		i += smg58031_i2c_readregister(I2C_ADC_ADDR,Config_Register,2,read_value_Config);


	}
	control_flag = 1;
}



float voltage;

int read_adc_value(void){
	int i = 0;
	int data;
	uint16_t tmpHL;
	uint8_t buf[2];
	if(control_flag == 1){
		i = smg58031_i2c_readregister(I2C_ADC_ADDR,Conversion_Register,2,buf);
		if(i != 0){
		
			return -1;
		}
		tmpHL= (buf[0] << 8) | buf[1];
//		tmpHL= (buf[1] << 8) | buf[0];
		voltage = (float) (tmpHL * (2.048 / 32768));
	
		return 0;
	}
	return -1;
}

Este código involucra las funciones de control y lectura del chip ADC (Convertidor analógico a digital). El siguiente es un análisis detallado del código:

función set_adc_control:

Esta función se utiliza para establecer el valor del registro de control ADC.
Primero, se definen algunas variables, incluidas value_Config, read_value_Config, value_Config1, chip_id e id.
Luego, asigne los valores correspondientes a estas variables de acuerdo con las instrucciones en los comentarios.
En un bucle, escriba los valores de value_Config y value_Config1 en los registros correspondientes llamando a la función smg58031_i2c_writerregister.
A continuación, lea el valor de chip_id llamando a la función smg58031_i2c_readregister y conviértalo en id.
Finalmente, imprima la información relevante y establezca control_flag en 1, lo que indica que el control de configuración es exitoso.
función read_adc_value:

Esta función se utiliza para leer el valor del registro de conversión ADC y realizar algún procesamiento.
Primero, defina algunas variables, incluidos datos, tmpHL y buf.
Con la condición de que control_flag sea 1, lea el valor del registro de conversión llamando a la función smg58031_i2c_readregister y almacene el resultado en buf.
A continuación, concatene los dos bytes en buf en un valor tmpHL de 16 bits.
Convierta tmpHL en voltaje de valor de voltaje de acuerdo con la fórmula.
Convierta el valor del voltaje en datos enteros e imprima la información relacionada.
Actualice los valores en la matriz smg58031_Data e imprímalos en el puerto serie.
Actualice el valor de smg58031_Data_index y sobrescriba cíclicamente el valor guardado.
Finalmente, se devuelve un valor apropiado basado en el resultado de la operación.
Este código implementa principalmente las funciones de control y lectura del chip ADC. En la función set_adc_control, los parámetros de configuración del ADC se establecen escribiendo registros. En la función read_adc_value, el resultado de la conversión del ADC se obtiene leyendo el registro, y el resultado se convierte en un valor de voltaje y se almacena en una matriz.

Si el artículo te es útil, dale me gusta y apoya, ¡gracias! !

Supongo que te gusta

Origin blog.csdn.net/weixin_52849254/article/details/131625906
Recomendado
Clasificación