Modified sps30 to function as a standalone lib
This commit is contained in:
		
							
								
								
									
										104
									
								
								sps30.c
									
									
									
									
									
								
							
							
						
						
									
										104
									
								
								sps30.c
									
									
									
									
									
								
							@@ -6,7 +6,25 @@
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "sps30.h"
 | 
					#include "sps30.h"
 | 
				
			||||||
#include "main.h" /* for uart_disable_interrupts() */
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Functions to be implemented by user
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* I2C */
 | 
				
			||||||
 | 
					int8_t sps30_i2c_transmit(uint8_t address, uint8_t *buffer, int len) __attribute__((weak));
 | 
				
			||||||
 | 
					int8_t sps30_i2c_receive(uint8_t address, uint8_t *buffer, int len) __attribute__((weak));
 | 
				
			||||||
 | 
					/* CRC */
 | 
				
			||||||
 | 
					uint8_t sensirion_crc8_calculate(const uint8_t *data, uint16_t count) __attribute__((weak));
 | 
				
			||||||
 | 
					/* Interrupts */
 | 
				
			||||||
 | 
					int8_t sps30_disable_interrupts(void) __attribute__((weak));
 | 
				
			||||||
 | 
					int8_t sps30_enable_interrupts(void) __attribute__((weak));
 | 
				
			||||||
 | 
					/* delay function */
 | 
				
			||||||
 | 
					void delay_ms(int delay_ms) __attribute__((weak));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Public functions
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int8_t sps30_send_cmd(sps30_cmd_t cmd)
 | 
					int8_t sps30_send_cmd(sps30_cmd_t cmd)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -16,11 +34,11 @@ int8_t sps30_send_cmd(sps30_cmd_t cmd)
 | 
				
			|||||||
	// start measurement
 | 
						// start measurement
 | 
				
			||||||
	buffer[0] = cmd >> 8;
 | 
						buffer[0] = cmd >> 8;
 | 
				
			||||||
	buffer[1] = cmd & 0x00ff;
 | 
						buffer[1] = cmd & 0x00ff;
 | 
				
			||||||
	uart_disable_interrupts();
 | 
						sps30_disable_interrupts();
 | 
				
			||||||
	result = i2c_transmit(SPS30_I2C_ADDRESS<<1, buffer, 2);
 | 
						result = sps30_i2c_transmit(SPS30_I2C_ADDRESS<<1, buffer, 2);
 | 
				
			||||||
	uart_enable_interrupts();
 | 
						sps30_enable_interrupts();
 | 
				
			||||||
	// TODO: Proc to vraci NACK? Vyresit.
 | 
						// TODO: Proc to vraci NACK? Vyresit.
 | 
				
			||||||
	if (result != I2C_OK) {
 | 
						if (result != 0) {
 | 
				
			||||||
		return SPS30_ERROR;
 | 
							return SPS30_ERROR;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -36,13 +54,13 @@ int8_t sps30_start_measurement( void )
 | 
				
			|||||||
	buffer[1] = SPS30_START_MEASUREMENT & 0x00ff;
 | 
						buffer[1] = SPS30_START_MEASUREMENT & 0x00ff;
 | 
				
			||||||
	buffer[2] = SPS30_UINT16_FORMAT;
 | 
						buffer[2] = SPS30_UINT16_FORMAT;
 | 
				
			||||||
	buffer[3] = 0x00;
 | 
						buffer[3] = 0x00;
 | 
				
			||||||
	buffer[4] = crc8_calculate(buffer + 2, 2);
 | 
						buffer[4] = sensirion_crc8_calculate(buffer + 2, 2);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	uart_disable_interrupts();
 | 
						sps30_disable_interrupts();
 | 
				
			||||||
	result = i2c_transmit(SPS30_I2C_ADDRESS<<1, buffer, 5);
 | 
						result = sps30_i2c_transmit(SPS30_I2C_ADDRESS<<1, buffer, 5);
 | 
				
			||||||
	uart_enable_interrupts();
 | 
						sps30_enable_interrupts();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (result != I2C_OK) {
 | 
						if (result != 0) {
 | 
				
			||||||
		return SPS30_ERROR;
 | 
							return SPS30_ERROR;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return SPS30_OK;
 | 
						return SPS30_OK;
 | 
				
			||||||
@@ -59,28 +77,28 @@ int8_t sps30_read_measured_values(sps30_data_t *measured_data)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	uint8_t result;
 | 
						uint8_t result;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// start measurement
 | 
						/* start measurement */
 | 
				
			||||||
	buffer[0] = SPS30_READ_MEASURED_VALUES >> 8;
 | 
						buffer[0] = SPS30_READ_MEASURED_VALUES >> 8;
 | 
				
			||||||
	buffer[1] = SPS30_READ_MEASURED_VALUES & 0xFF;
 | 
						buffer[1] = SPS30_READ_MEASURED_VALUES & 0xFF;
 | 
				
			||||||
	uart_disable_interrupts();
 | 
						sps30_disable_interrupts();
 | 
				
			||||||
	result = i2c_transmit(SPS30_I2C_ADDRESS<<1, buffer, 2);
 | 
						result = sps30_i2c_transmit(SPS30_I2C_ADDRESS<<1, buffer, 2);
 | 
				
			||||||
	uart_enable_interrupts();
 | 
						sps30_enable_interrupts();
 | 
				
			||||||
	if (result != I2C_OK) {
 | 
						if (result != 0) {
 | 
				
			||||||
		return SPS30_ERROR;
 | 
							return SPS30_ERROR;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	LL_mDelay(10); // 10 ms should be enough
 | 
						delay_ms(10);
 | 
				
			||||||
	// read out
 | 
						/* read out */
 | 
				
			||||||
	uart_disable_interrupts();
 | 
						sps30_disable_interrupts();
 | 
				
			||||||
	result = i2c_receive(SPS30_I2C_ADDRESS<<1, buffer, 3 * SPS30_MEASURED_VALUES_COUNT);
 | 
						result = sps30_i2c_receive(SPS30_I2C_ADDRESS<<1, buffer, 3 * SPS30_MEASURED_VALUES_COUNT);
 | 
				
			||||||
	uart_enable_interrupts();
 | 
						sps30_enable_interrupts();
 | 
				
			||||||
	if (result != I2C_OK)
 | 
						if (result != 0)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		return SPS30_ERROR;
 | 
							return SPS30_ERROR;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	/* check data integrity */
 | 
						/* check data integrity */
 | 
				
			||||||
	for (uint8_t i = 0; i < SPS30_MEASURED_VALUES_COUNT; i++)
 | 
						for (uint8_t i = 0; i < SPS30_MEASURED_VALUES_COUNT; i++)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		uint8_t checksum_calculated = crc8_calculate(buffer + 3*i, 2);
 | 
							uint8_t checksum_calculated = sensirion_crc8_calculate(buffer + 3*i, 2);
 | 
				
			||||||
		uint8_t checksum_received = buffer[3*i + 2];
 | 
							uint8_t checksum_received = buffer[3*i + 2];
 | 
				
			||||||
		if (checksum_calculated != checksum_received) {
 | 
							if (checksum_calculated != checksum_received) {
 | 
				
			||||||
			return SPS30_CRC8_ERROR;
 | 
								return SPS30_CRC8_ERROR;
 | 
				
			||||||
@@ -131,20 +149,20 @@ int8_t sps30_read_status_register ( void )
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	uint8_t result;
 | 
						uint8_t result;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// start measurement
 | 
						/* start measurement */
 | 
				
			||||||
	buffer[0] = SPS30_READ_DEVICE_STATUS_REGISTER >> 8;
 | 
						buffer[0] = SPS30_READ_DEVICE_STATUS_REGISTER >> 8;
 | 
				
			||||||
	buffer[1] = SPS30_READ_DEVICE_STATUS_REGISTER & 0x00ff;
 | 
						buffer[1] = SPS30_READ_DEVICE_STATUS_REGISTER & 0x00ff;
 | 
				
			||||||
	uart_disable_interrupts();
 | 
						sps30_disable_interrupts();
 | 
				
			||||||
	result = i2c_transmit(SPS30_I2C_ADDRESS<<1, buffer, 2);
 | 
						result = sps30_i2c_transmit(SPS30_I2C_ADDRESS<<1, buffer, 2);
 | 
				
			||||||
	uart_enable_interrupts();
 | 
						sps30_enable_interrupts();
 | 
				
			||||||
	if (result != I2C_OK) {
 | 
						if (result != 0) {
 | 
				
			||||||
		return SPS30_ERROR;
 | 
							return SPS30_ERROR;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	LL_mDelay(10); // 10 ms should be enough
 | 
						delay_ms(10);
 | 
				
			||||||
	// read out
 | 
						/* read out */
 | 
				
			||||||
	uart_disable_interrupts();
 | 
						sps30_disable_interrupts();
 | 
				
			||||||
	result = i2c_receive(SPS30_I2C_ADDRESS<<1, buffer, 6);
 | 
						result = sps30_i2c_receive(SPS30_I2C_ADDRESS<<1, buffer, 6);
 | 
				
			||||||
	uart_enable_interrupts();
 | 
						sps30_enable_interrupts();
 | 
				
			||||||
	// TODO
 | 
						// TODO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return SPS30_OK;
 | 
						return SPS30_OK;
 | 
				
			||||||
@@ -157,25 +175,25 @@ int8_t sps30_read_firmware_version ( uint8_t * fw_ver_hi, uint8_t * fw_ver_lo )
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	uint8_t result;
 | 
						uint8_t result;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// start measurement
 | 
						/* start measurement */
 | 
				
			||||||
	i2c_tx_buffer[0] = SPS30_READ_VERSION >> 8;
 | 
						i2c_tx_buffer[0] = SPS30_READ_VERSION >> 8;
 | 
				
			||||||
	i2c_tx_buffer[1] = SPS30_READ_VERSION & 0x00ff;
 | 
						i2c_tx_buffer[1] = SPS30_READ_VERSION & 0x00ff;
 | 
				
			||||||
	uart_disable_interrupts();
 | 
						sps30_disable_interrupts();
 | 
				
			||||||
	result = i2c_transmit(SPS30_I2C_ADDRESS<<1, i2c_tx_buffer, 2);
 | 
						result = sps30_i2c_transmit(SPS30_I2C_ADDRESS<<1, i2c_tx_buffer, 2);
 | 
				
			||||||
	uart_enable_interrupts();
 | 
						sps30_enable_interrupts();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// TODO: Proc to vraci NACK? Vyresit.
 | 
						// TODO: Proc to vraci NACK? Vyresit.
 | 
				
			||||||
	/*if (result != I2C_OK) {
 | 
						/*if (result != 0) {
 | 
				
			||||||
		return SPS30_ERROR;
 | 
							return SPS30_ERROR;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return SPS30_OK;*/
 | 
						return SPS30_OK;*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	LL_mDelay(1); // 10 ms should be enough
 | 
						delay_ms(1);
 | 
				
			||||||
	// read out
 | 
						/* read out */
 | 
				
			||||||
	uart_disable_interrupts();
 | 
						sps30_disable_interrupts();
 | 
				
			||||||
	result = i2c_receive(SPS30_I2C_ADDRESS<<1, i2c_rx_buffer, 3);
 | 
						result = sps30_i2c_receive(SPS30_I2C_ADDRESS<<1, i2c_rx_buffer, 3);
 | 
				
			||||||
	uart_enable_interrupts();
 | 
						sps30_enable_interrupts();
 | 
				
			||||||
	/*if (result != I2C_OK)
 | 
						/*if (result != 0)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		return SPS30_ERROR;
 | 
							return SPS30_ERROR;
 | 
				
			||||||
	}*/
 | 
						}*/
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										9
									
								
								sps30.h
									
									
									
									
									
								
							
							
						
						
									
										9
									
								
								sps30.h
									
									
									
									
									
								
							@@ -9,10 +9,6 @@
 | 
				
			|||||||
#define INC_SPS30_H_
 | 
					#define INC_SPS30_H_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "stdint.h"
 | 
					#include "stdint.h"
 | 
				
			||||||
#include "stm32l0xx_ll_i2c.h"
 | 
					 | 
				
			||||||
#include "stm32l0xx_ll_utils.h"
 | 
					 | 
				
			||||||
#include "i2c.h"
 | 
					 | 
				
			||||||
#include "crc8.h"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Defines & macros
 | 
					 * Defines & macros
 | 
				
			||||||
@@ -77,16 +73,11 @@ int8_t sps30_send_cmd(sps30_cmd_t cmd);
 | 
				
			|||||||
int8_t sps30_start_measurement(void);
 | 
					int8_t sps30_start_measurement(void);
 | 
				
			||||||
int8_t sps30_stop_measurement(void);
 | 
					int8_t sps30_stop_measurement(void);
 | 
				
			||||||
int8_t sps30_read_measured_values(sps30_data_t *measured_data);
 | 
					int8_t sps30_read_measured_values(sps30_data_t *measured_data);
 | 
				
			||||||
 | 
					 | 
				
			||||||
int8_t sps30_sleep(void);
 | 
					int8_t sps30_sleep(void);
 | 
				
			||||||
int8_t sps30_wake_up(void);
 | 
					int8_t sps30_wake_up(void);
 | 
				
			||||||
 | 
					 | 
				
			||||||
int8_t sps30_start_fan_cleaning( void );
 | 
					int8_t sps30_start_fan_cleaning( void );
 | 
				
			||||||
 | 
					 | 
				
			||||||
int8_t sps30_reset(void);
 | 
					int8_t sps30_reset(void);
 | 
				
			||||||
 | 
					 | 
				
			||||||
int8_t sps30_read_status_register(void);
 | 
					int8_t sps30_read_status_register(void);
 | 
				
			||||||
 | 
					 | 
				
			||||||
int8_t sps30_read_firmware_version(uint8_t *fw_ver_hi, uint8_t *fw_ver_lo);
 | 
					int8_t sps30_read_firmware_version(uint8_t *fw_ver_hi, uint8_t *fw_ver_lo);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif /* INC_SPS30_H_ */
 | 
					#endif /* INC_SPS30_H_ */
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user