C-Libs/AS6221.c

202 lines
5.4 KiB
C

/*
* AS6221.c
*
* Created on: Nov 15, 2021
* Author: angoosh
*/
#include "AS6221.h"
#include "main.h"
extern I2C_HandleTypeDef AS6221_I2C_HANDLE;
float AS6221_Read_Temperature();
int AS6221_Register(SETUP_REG reg, uint8_t value, ACCESS_OP rw);
/*
* @brief Reads temperature measured by sensor
* @retval temperature in C
*/
float AS6221_Read_Temperature(){
uint8_t temp_raw[2];
uint16_t temp_bin = 0;
double temp = 0;
uint8_t index[1] = {1};
HAL_I2C_Master_Transmit(&AS6221_I2C_HANDLE, (AS6221_ADDRESS << 1), index, 2, 0xFFFF);
HAL_I2C_Master_Receive(&AS6221_I2C_HANDLE, (AS6221_ADDRESS << 1), temp_raw, 2, 0xFFFF);
temp_bin = temp_raw[0] * 256 + temp_raw[1];
if(temp_bin >= 0x8000){//is negative
temp = ((~(temp_bin - 1)) * LSB) * (-1);
}
else{//is positive
temp = temp_bin * LSB;
}
return temp;
}
/*
* @brief Reads and Writes to control register
* @param register
* @param value to write
* @param access operation: R,W,RW
* @retval register contents
*/
int AS6221_Register(SETUP_REG reg, uint8_t value, ACCESS_OP rw){
uint8_t conf_reg[2];
uint8_t index[1] = {1};
HAL_I2C_Master_Transmit(&AS6221_I2C_HANDLE, (AS6221_ADDRESS << 1), index, 2, 0xFFFF);
HAL_I2C_Master_Receive(&AS6221_I2C_HANDLE, (AS6221_ADDRESS << 1), conf_reg, 2, 0xFFFF);
switch(reg){
case AL:
return ((conf_reg[0] & 0x04) >> 2);
case CR:
if(rw == R){
return (conf_reg[0] & 0x03);
}
else if(rw == W){
value = value & 0x03;
conf_reg[0] = (conf_reg[0] & ~(0x03 << 0));
conf_reg[0] = (conf_reg[0] | (value << 0));
uint8_t msg[3] = {index[0], conf_reg[0], conf_reg[1]};
HAL_I2C_Master_Transmit(&AS6221_I2C_HANDLE, (AS6221_ADDRESS << 1), msg, 4, 0xFFFF);
}
else{
value = value & 0x03;
uint8_t retVal =(conf_reg[0] & 0x03);
conf_reg[0] = (conf_reg[0] & ~(0x03 << 0));
conf_reg[0] = (conf_reg[0] | (value << 0));
uint8_t msg[3] = {index[0], conf_reg[0], conf_reg[1]};
HAL_I2C_Master_Transmit(&AS6221_I2C_HANDLE, (AS6221_ADDRESS << 1), msg, 4, 0xFFFF);
return retVal;
}
case SM:
if(rw == R){
return (conf_reg[1] & 0x80);
}
else if(rw == W){
value = value & 0x01;
conf_reg[1] = (conf_reg[1] & ~(0x01 << 7));
conf_reg[1] = (conf_reg[1] | (value << 7));
uint8_t msg[3] = {index[0], conf_reg[0], conf_reg[1]};
HAL_I2C_Master_Transmit(&AS6221_I2C_HANDLE, (AS6221_ADDRESS << 1), msg, 4, 0xFFFF);
}
else{
value = value & 0x01;
uint8_t retVal =(conf_reg[1] & 0x80);
conf_reg[1] = (conf_reg[1] & ~(0x01 << 7));
conf_reg[1] = (conf_reg[1] | (value << 7));
uint8_t msg[3] = {index[0], conf_reg[0], conf_reg[1]};
HAL_I2C_Master_Transmit(&AS6221_I2C_HANDLE, (AS6221_ADDRESS << 1), msg, 4, 0xFFFF);
return retVal;
}
case IM:
if(rw == R){
return (conf_reg[1] & 0x40);
}
else if(rw == W){
value = value & 0x01;
conf_reg[1] = (conf_reg[1] & ~(0x01 << 6));
conf_reg[1] = (conf_reg[1] | (value << 6));
uint8_t msg[3] = {index[0], conf_reg[0], conf_reg[1]};
HAL_I2C_Master_Transmit(&AS6221_I2C_HANDLE, (AS6221_ADDRESS << 1), msg, 4, 0xFFFF);
}
else{
value = value & 0x01;
uint8_t retVal =(conf_reg[1] & 0x40);
conf_reg[1] = (conf_reg[1] & ~(0x01 << 6));
conf_reg[1] = (conf_reg[1] | (value << 6));
uint8_t msg[3] = {index[0], conf_reg[0], conf_reg[1]};
HAL_I2C_Master_Transmit(&AS6221_I2C_HANDLE, (AS6221_ADDRESS << 1), msg, 4, 0xFFFF);
return retVal;
}
case POL:
if(rw == R){
return (conf_reg[1] & 0x20);
}
else if(rw == W){
value = value & 0x01;
conf_reg[1] = (conf_reg[1] & ~(0x01 << 5));
conf_reg[1] = (conf_reg[1] | (value << 5));
uint8_t msg[3] = {index[0], conf_reg[0], conf_reg[1]};
HAL_I2C_Master_Transmit(&AS6221_I2C_HANDLE, (AS6221_ADDRESS << 1), msg, 4, 0xFFFF);
}
else{
value = value & 0x01;
uint8_t retVal =(conf_reg[1] & 0x20);
conf_reg[1] = (conf_reg[1] & ~(0x01 << 5));
conf_reg[1] = (conf_reg[1] | (value << 5));
uint8_t msg[3] = {index[0], conf_reg[0], conf_reg[1]};
HAL_I2C_Master_Transmit(&AS6221_I2C_HANDLE, (AS6221_ADDRESS << 1), msg, 4, 0xFFFF);
return retVal;
}
case CF:
if(rw == R){
return (conf_reg[1] & 0x18);
}
else if(rw == W){
value = value & 0x03;
conf_reg[1] = (conf_reg[1] & ~(0x03 << 3));
conf_reg[1] = (conf_reg[1] | (value << 3));
uint8_t msg[3] = {index[0], conf_reg[0], conf_reg[1]};
HAL_I2C_Master_Transmit(&AS6221_I2C_HANDLE, (AS6221_ADDRESS << 1), msg, 4, 0xFFFF);
}
else{
value = value & 0x03;
uint8_t retVal =(conf_reg[1] & 0x18);
conf_reg[1] = (conf_reg[1] & ~(0x01 << 3));
conf_reg[1] = (conf_reg[1] | (value << 3));
uint8_t msg[3] = {index[0], conf_reg[0], conf_reg[1]};
HAL_I2C_Master_Transmit(&AS6221_I2C_HANDLE, (AS6221_ADDRESS << 1), msg, 4, 0xFFFF);
return retVal;
}
case SS:
if(rw == R){
return (conf_reg[1] & 0x01);
}
else if(rw == W){
value = value & 0x01;
conf_reg[1] = (conf_reg[1] & ~(0x01 << 0));
conf_reg[1] = (conf_reg[1] | (value << 0));
uint8_t msg[3] = {index[0], conf_reg[0], conf_reg[1]};
HAL_I2C_Master_Transmit(&AS6221_I2C_HANDLE, (AS6221_ADDRESS << 1), msg, 4, 0xFFFF);
}
else{
value = value & 0x01;
uint8_t retVal =(conf_reg[1] & 0x01);
conf_reg[1] = (conf_reg[1] & ~(0x01 << 0));
conf_reg[1] = (conf_reg[1] | (value << 0));
uint8_t msg[3] = {index[0], conf_reg[0], conf_reg[1]};
HAL_I2C_Master_Transmit(&AS6221_I2C_HANDLE, (AS6221_ADDRESS << 1), msg, 4, 0xFFFF);
return retVal;
}
}
return 0;
}