Soy muy nuevo en el uso de CUBE y HAL_libraries de STM. Estoy usando un microcontrolador STM32F0 con 32 pines. El esquema para I2C es correcto. Entonces necesito un poco de ayuda aquí.
Tengo un sensor capacitivo ( FDC1004 ) que utiliza la comunicación I2C. Tengo que escribir estos registros para leer los datos.
¿Cómo podría enviar correctamente el formulario de solicitud de INICIO maestro al esclavo (la dirección del esclavo es A0)?
¿Cómo configurar el puntero al registro 0x0C?
- La hoja de datos ve (Registro 0x0C: bit [7: 4]) a 1.) No sé, ¿cómo hacer eso? ¿Y finalmente cómo LEER desde el mismo registro?
- Además, ¿tengo que esperar el campo DONE_x (Registro 0x0C: bits [3: 0]) antes de leerlo?
¡Pero no sé si me dirijo a los registros correctos! ¡Porque no recibo ningún dato del sensor!
Aquí está mi código:
int I2Ccomm ()
{
HAL_I2C_Master_Transmit(&hi2c1,0xA1,0x0C, 10, 100); //start bit and pointer to register
HAL_Delay(50);
HAL_I2C_Master_Transmit(&hi2c1,0xA1,0x054, 10, 100); // setting the register
HAL_Delay(50);
HAL_I2C_Master_Receive(&hi2c1, 0xA0, 0x0C, 10, 100); //read from this register
HAL_Delay(50);
HAL_I2C_Master_Receive(&hi2c1, 0xA0, 0x02, 10, 100); //read data from register
return ReadREG[1];
}
microcontroller
i2c
stm32
stm32f0
hal-library
yest111
fuente
fuente
Respuestas:
Comencemos con la
HAL_I2C_Master_Transmit()
función. Si revisas su declaración:Problema menor con el segundo parámetro, la dirección del dispositivo esclavo. La dirección del dispositivo esclavo es
b1010000
si la completamos en formato de 8 bits, será0xA0
, tal como usted dijo. Ahora, al pasarle estoHAL_I2C_Master_Transmit()
, no tiene que configurar el bit R / W manualmente, HAL lo hará por usted. Entonces, cuando llameHAL_I2C_Master_Transmit()
al bit R / W transmitido, será automáticamente 0 lo que indica la operación de escritura y cuando llameHAL_I2C_Master_Receive()
al bit R / W transmitido será automáticamente 1 lo que indica la operación de escritura . Ha mezclado los valores R / W, pero creo que es un poco no importa la función, por lo que no es un error real en su código.El tercer parámetro (
uint8_t *pData
) es un puntero a un búfer que contiene los datos que se enviarán . Ahora, en su llamada, el tercer parámetro es0x0C
cuál es su información real, la dirección de registro. El problema es que se interpretará como un puntero (por elHAL_I2C_Master_Transmit()
) a una ubicación de memoria, donde se pueden encontrar algunos datos indefinidos.El cuarto parámetro es el tamaño del búfer , el número de bytes que se enviarán. Si desea enviar un solo byte, este parámetro debe ser 1 y no 10.
Escribir registros
Aquí está el diagrama correspondiente de la hoja de datos.
Entonces, después de enviar la dirección del esclavo al bus, se deben transmitir tres bytes más: puntero de registro , byte MSB , byte LSB . Una implementación general con HAL escribiendo registros de 16 bits:
Ejemplo con tus valores:
write_register(0x0C, 0x0054);
Alternativamente, también se puede utilizar la función de escritura de registro definida por HAL, que tiene parámetros adicionales para pasar la dirección de registro y el tamaño de la dirección.
Ahora, la
HAL_I2C_Master_Receive()
función es casi la misma que la otra.La única diferencia es que el tercer parámetro es un puntero al búfer donde se almacenarán los datos recibidos . Está
0x02
en su código y no sé cuál fue su propósito con él, pero se interpretará como un puntero (desafortunadamente a una ubicación de memoria aleatoria).Leer registros
Ejemplo:
También hay una función de lectura de registro definida por HAL, que tiene.
Lea la sección 8.5 Programación de la hoja de datos para obtener más detalles.
fuente