Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
# KiCad project files to include in the repository
!*.kicad_pro
!*.kicad_sch
!*.kicad_pcb
!*.kicad_sym
!*.kicad_mod
!*.kicad_wks

# Ignore backup and autosave files
*.bak
*.b#*
*.s#*
*.~*
*.kicad_prl
*-backups
_autosave-*

# Ignore user settings and logs
*.prl
*.net
*.xml
*.dcm
*.emp
fp-info-cache
sym-lib-table
fp-lib-table
*~

# Ignore gerber and fabrication outputs
*.gbr
*.drl
*.gbo
*.gtl
*.gts
*.gbs
*.gm1
*.gm2
*.fab
*.pos
*.gko

# Ignore simulation-related files
*.cir
*.spice

# Ignore intermediate build or temporary files
__pycache__/
.cache/
*.pyc

# Ignore debugging and crash logs
*.log

# Ignore specific files for user/system configurations
*.config.json
Binary file not shown.
1 change: 1 addition & 0 deletions software/development/libTUSS4470/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
.vscode
63 changes: 63 additions & 0 deletions software/development/libTUSS4470/libTUSS4470.ino
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
#define PLATFORM_ARDUINO
#include "tuss4470.h"
#include "tuss4470_arduino.h"
#include <SPI.h>


const int SPI_CS = 10;
const int IO1 = 8;
const int IO2 = 9;
const int O3 = 6;
const int O4 = 5;
const int analogIn = A0;


void setup() {
Serial.begin(115200);

// Using default contructor which uses the internal Arduino SPI
// Use .beginCustomSPI() for different platforms
TUSS4470 tuss;
int err = tuss.begin();
if (err)
{
Serial.println("Error init tuss");
return;
}
// Read the complete configuration from TUSS device
err = tuss.readConfig();
if (err) {
Serial.println("Error reading config");
}
Serial.println("TUSS4470 Configuration:");
uint8_t *cfg_data = (uint8_t *)tuss.getConfig();
for (int i = 0; i < sizeof(tuss4470_config_t); ++i) {
Serial.print("Register 0x");
Serial.print(tuss4470_register_map[i], HEX);
Serial.print(": 0x");
Serial.println(cfg_data[i], HEX);
}

// Set a specific register, the register is written to the device and automatically read again
// written value must match read value otherwise error will be returned
// Also the value is checked if it is in the valid range
err = tuss.setBPF_HPFFreq(0x1D);
if (err) {
Serial.println(F("Failed to set parameter HPFFreq to 0x1D"));
return;
}
Serial.println(F("Successfully set parameter HPFFreq to 0x1D"));

// Read the register again to verify the value
uint8_t data = tuss.getBPF_HPFFreq();
Serial.print(F("Read back HPFFreq: 0x"));
Serial.println(data, HEX);
if (data != 0x1D) {
Serial.println(F("Error: Read back value does not match written value"));
}
}

void loop() {


}
176 changes: 176 additions & 0 deletions software/development/libTUSS4470/tuss4470.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,176 @@
//
// Created by javerik on 20.01.25.
//
#include "tuss4470.h"


#ifdef PLATFORM_X86
#include <malloc.h>
#elif defined(PLATFORM_ARM)
#include <stdint.h>
#elif defined(PLATFORM_ARDUINO)


#endif


#include <stdint.h>
#include <stddef.h>
uint8_t parity(const uint8_t *data) {
uint16_t data16 = (data[0] << 8) | data[1];
uint8_t parity = 0;
for (int i = 0; i < 16; ++i) {
if ((data16 >> i) & 1) {
parity++;
}
}
return (parity + 1) % 2;
}

int evaluate_status(uint8_t status, tuss4470_t *tuss4470) {
tuss4470->raw_device_state = status;
tuss4470->device_state = (tuss4470_device_state_t)(status & TUSS4470_STAT_DEV_STATE);
tuss4470->flag_vdrv_ready = (status & TUSS4470_STAT_VDRV_READY) >> 5;
tuss4470->flag_pulse_num_flt = (status & TUSS4470_STAT_PULSE_NUM_FLT) >> 4;
tuss4470->flag_drv_pulse_flt = (status & TUSS4470_STAT_DRV_PULSE_FLT) >> 3;
tuss4470->flag_ee_crc_flt = (status & TUSS4470_STAT_EE_CRC_FLT) >> 2;
if ((tuss4470->flag_ee_crc_flt || tuss4470->flag_drv_pulse_flt || tuss4470->flag_drv_pulse_flt )) {
return 1;
} else {
return 0;
}
}

int tuss4470_t_init(tuss4470_spi_transfer_fptr spiTransfer_fptr, tuss4470_t *tuss4470) {
tuss4470->spiTransfer_fptr = spiTransfer_fptr;
tuss4470->config = (tuss4470_config_t *)malloc(sizeof(tuss4470_config_t));
if (tuss4470->config == NULL) {
return 1;
}
tuss4470->ctx = NULL;
return 0;
}

int tuss4470_t_free(tuss4470_t *tuss4470) {
free(tuss4470->config);
return 0;
}

int tuss4470_read_config(tuss4470_t *tuss4470, tuss4470_config_t *config) {
uint8_t *cfg_data = (uint8_t *)config;
int err = 0;
uint8_t data = 0;
for (size_t i = 0; i < sizeof(tuss4470_config_t); i++)
{
err = tuss4470_read_register(tuss4470, (tuss4470_register_map_t) (tuss4470_register_map[i]), &data);
if (err) return err;
cfg_data[i] = data;
}
return 0;
}

int tuss4470_write_config(tuss4470_t *tuss4470, tuss4470_config_t *config) {
uint8_t *cfg_data = (uint8_t *)config;
int err = 0;
for (size_t i = 0; i < sizeof(tuss4470_config_t); i++)
{
err = tuss4470_write_register(tuss4470, (tuss4470_register_map_t) (tuss4470_register_map[i]), cfg_data[i]);
if (err) return err;
}
return 0;
}

int tuss4470_read_register(tuss4470_t *tuss4470, tuss4470_register_map_t reg, uint8_t *data) {
if (tuss4470->spiTransfer_fptr == NULL) {
return 1;
}
static uint8_t spi_mode = 0x80;

uint8_t tx_data[2] = {0};
tx_data[0] = 0x80 + ((reg & 0x3F) << 1);
tx_data[1] = 0;
tx_data[0] |= parity(tx_data);

int err = tuss4470->spiTransfer_fptr(spi_mode, tx_data, 2, tuss4470->ctx);
if (err) {
return err;
}
err = evaluate_status(tx_data[0], tuss4470);
if (err) {
return err;
}
*data = tx_data[1];
return 0;
}

int tuss4470_write_register(tuss4470_t *tuss4470, tuss4470_register_map_t reg, uint8_t data) {
if (tuss4470->spiTransfer_fptr == NULL) {
return 1;
}
static uint8_t spi_mode = 0x00;
uint8_t tx_data[2] = {0};
tx_data[0] = (reg & 0x3F) << 1;
tx_data[1] = data;
tx_data[0] |= parity(tx_data);
int err = tuss4470->spiTransfer_fptr(spi_mode, tx_data, 2, tuss4470->ctx);
if (err) {
return err;
}
err = evaluate_status(tx_data[0], tuss4470);
if (err) {
return err;
}
err = tuss4470_read_register(tuss4470, reg, &tx_data[1]);
if (err) {
return err;
}
if (tx_data[1] != data) {
return 1;
}
return 0;
}

uint8_t tuss4470_get_config(uint8_t configData, uint8_t mask) {
uint8_t dataOut = configData & mask;
// to have a nicer representation of the data, we need to shift it to the right
uint8_t copy_mask = mask;
// count number of bits to shift left until bit 0 is set
uint8_t shift = 0;
while ((copy_mask & 1) == 0) {
copy_mask >>= 1;
shift++;
}
dataOut >>= shift;
return dataOut;
}

uint8_t tuss4470_set_config(uint8_t configData, uint8_t mask, uint8_t value) {
// first we need to clear the bits that are set in the mask
uint8_t dataOut = configData & ~mask;
// now we need to shift the value to the left until the bits are set in the mask
uint8_t copy_mask = mask;
// count number of bits to shift left until bit 0 is set
uint8_t shift = 0;
while ((copy_mask & 1) == 0) {
copy_mask >>= 1;
shift++;
}
value <<= shift;
dataOut |= value;
return dataOut;
}

int tuss4470_value_is_in_range(uint8_t mask, uint8_t value) {
uint8_t copy_mask = mask;
// count number of bits to shift left until bit 0 is set
uint8_t shift = 0;
while ((copy_mask & 1) == 0) {
copy_mask >>= 1;
shift++;
}
uint8_t mask_value = mask >> shift;
if (value > mask_value) {
return 1;
}
return 0;
}
56 changes: 56 additions & 0 deletions software/development/libTUSS4470/tuss4470.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
//
// Created by javerik on 20.01.25.
//

#ifndef LIBTUSS4470_TUSS4470_H
#define LIBTUSS4470_TUSS4470_H

#include "tuss4470_types.h"
#include <stdint.h>


#ifdef __cplusplus
extern "C" {
#endif

// region function definitions for hw communication
typedef int (*tuss4470_spi_transfer_fptr)(uint8_t mode, uint8_t *data, uint8_t size, void *ctx);
// endregion

typedef struct {
uint8_t raw_device_state;
tuss4470_device_state_t device_state;
int flag_vdrv_ready;
int flag_pulse_num_flt;
int flag_drv_pulse_flt;
int flag_ee_crc_flt;
tuss4470_config_t *config;
tuss4470_spi_transfer_fptr spiTransfer_fptr;
void *ctx;
} tuss4470_t;

int tuss4470_t_init(tuss4470_spi_transfer_fptr spiTransfer_fptr, tuss4470_t *tuss4470);
int tuss4470_t_free(tuss4470_t *tuss4470);

// region generic Register access
int tuss4470_read_register(tuss4470_t *tuss4470, tuss4470_register_map_t reg, uint8_t *data);
int tuss4470_write_register(tuss4470_t *tuss4470, tuss4470_register_map_t reg, uint8_t data);
int tuss4470_read_config(tuss4470_t *tuss4470, tuss4470_config_t *config);
int tuss4470_write_config(tuss4470_t *tuss4470, tuss4470_config_t *config);
// endregion

// region specific register access
uint8_t tuss4470_get_config(uint8_t configData, uint8_t mask);
uint8_t tuss4470_set_config(uint8_t configData, uint8_t mask, uint8_t value);
// endregion

// region utility functions
int tuss4470_value_is_in_range(uint8_t mask, uint8_t value);
// endregion


#ifdef __cplusplus
}
#endif

#endif //LIBTUSS4470_TUSS4470_H
Loading