Que tal,
Estoy comunicándome por SPI con un integrado, los registros de configuración del IC son de 8bits, algunos de los registros tienen campos de configuración de varios bits y no he podido implementar funciones que lean y escriban en esos campos.
Tengo pseudo código pero no se si es correcto, tengo dudas en como calcular la variable *mask*.
Para calcular *mask*:
Según lo veo se recorren *len* bits (en 1 lógico) *lsb* (least significant bit) posiciones a la izquierda, no se como hacer para obtener esos bits en 1 lógico en *mask*.
Ejemplo:
Para un campo de bits que se compone de dos bits y tiene el lsb en la posición 2, se calcula el siguiente valor de *mask*:
const uint8_t mask = 0b0000_1100; // lo puse en bits para que se vean los bits individuales
- el primer bit en 1 lógico de derecha a izquierda esta en la posición 2 (lsb=2)
- a partir de ese bit se tienen dos bits en 1 (len=2)
para leer un campo de bits:
uint8_t read_bitfield(const uint8_t register, const uint8_t lsb, const uint8_t len)
{
// const uint8_t mask = 0b0000_1100;
uint8_t mask = 0x0C;
// leemos el contenido del registro del IC
uint8_t temp_reg = read_register(register);
// 'multiplicamos' el contenido actual del registro con la mascara
// los bits que no nos interesan (todos los 0's en *mask*) se volveran 0, solo manteniendo
// intactos los bits que valen 1 en *mask*
temp_reg = temp_reg & mask;
// recorremos temp_reg *len* posiciones a la derecha
// porque solo nos interesa el valor del 'campo'
return temp_reg >> len;
}
para escribir un campo de bits:
uint8_t write_bitfield(const uint8_t register, const uint8_t val, const uint8_t lsb, const uint8_t len)
{
// const uint8_t mask = 0b0000_1100;
uint8_t mask = 0x0C;
// leemos el contenido del registro del IC
uint8_t temp_reg = read_register(register);
// multiplicando temp_reg con el inverso de mask
// se mantendran intactos los bits que no queremos modificar (1's en *mask* invertido) y
// ponemos se pondran en 0 el campo de bits que pretendemos escribir (0's en *mask* invertido)
temp_reg = temp_reg & (~(mask));
// recorremos a la izquierda el valor que queremos escribir *len* posiciones y lo escribimos en temp_reg
temp_reg = temp_reg | (val << len);
// escribimos el nuevo temp_reg al registro del IC
write_register(reg, temp_reg);
}
¿alguna forma con la cual pueda calcular la variable *mask*?
¿algun consejo con respecto al pseudo código?
Saludos
Carlos