Así que diseñé una pieza de hardware que tiene un microcontrolador Atmega168pa que se comunica con un IC externo a través de un bus SPI. El dispositivo externo tiene algunos registros, con bits de hardware asignados.
Estoy buscando una manera de manipular fácilmente estos datos de bits estructurados en el Atmega. La primera solución obvia es un campo de bits, pero no he tenido mucho éxito.
El objetivo es tratar de asignar esto a 3 bytes para que pueda:
A) acceder a los datos de manera simple, por ejemplo, n_reg.b_counter = 230
B) Escriba este byte a byte de datos estructurados con una función de tipo spi_write(uint_8t)
. Obviamente, esto tendría que iterar a través de los tres bytes, tal vez con algún tipo de índice.
Lo que he intentado hasta ahora:
struct PLL_N_REG
{
uint32_t control_bits : 2;
uint32_t a_counter : 5;
uint32_t reserved : 1;
uint32_t b_counter : 13;
uint32_t cp_gain : 1;
uint32_t div_by_2 : 1;
uint32_t div_by_sel : 1;
};
struct PLL_N_REG n_reg;
n_reg.div_by_sel = 1;
n_reg.b_counter = 230;
n_reg.control_bits = 2;
Esto cumple con el objetivo A , ya que es de fácil acceso, pero no sé cómo agarraría fácilmente cada byte para enviar a la función spi_write(uint8_t)
.
He intentado hacer algo similar con proyectos de hardware en el pasado, pero terminé usando soluciones alternativas. Me gustaría un método que pueda aplicar fácilmente a cualquier hardware que necesite implementar. Todos los otros ejemplos que he encontrado han sido para mapear registros de hardware internos del microcontrolador.
Muchas gracias de antemano!