TECware/Core/Drivers/ADCD_AdcDriver.c
2021-11-19 15:29:10 +01:00

427 lines
15 KiB
C

//=================================================================================================
//
// Company: Paul Scherrer Institut
// 5232 Villigen PSI
// Switzerland
//
//-------------------------------------------------------------------------------------------------
//
// Project: Peltier Controller V2
// Author: Noah Piqué (noah.pique@psi.ch)
//
//-------------------------------------------------------------------------------------------------
//
// Module: ADC-Driver
// Filename: ADCD_AdcDriver.c
// Date: Handled by Subversion (version control system)
// Revision: Handled by Subversion (version control system)
// History: Handled by Subversion (version control system)
//
//-------------------------------------------------------------------------------------------------
//
// Description: This source file contains all functions dealing with the internal ADC-Driver
//
//=================================================================================================
//=================================================================================================
// Section: INCLUDES
// Description: List of required include files.
//=================================================================================================
#include "../PDEF_ProjectDefinitions.h"
#include "ADCD_AdcDriver.h"
// Drivers
#include "SPID_SpiDriver.h"
#include "DIPO_DigitalPorts.h"
//#include "EXTI_ExtiHandler.h"
// Application
//#include "../Application/ELOG_ErrorLogger.h"
// Toolbox
#include "../Toolbox/UTIL_Utility.h"
// CMSIS OS
#include "cmsis_os2.h"
//=================================================================================================
// Section: DEFINITIONS
// Description: Definition of local constants (visible by this module only).
//=================================================================================================
// define commands
#define CMD_READ (0<<7)
#define CMD_WRITE (1<<7)
// define register
#define REG_CONFIG 0x00
#define REG_RTD_MSB 0x01
#define REG_RTD_LSB 0x02
#define REG_HIGH_FAULT_MSB 0x03
#define REG_HIGH_FAULT_LSB 0x04
#define REG_LOW_FAULT_MSB 0x05
#define REG_LOW_FAULT_LSB 0x06
#define REG_FAULT_STATUS 0x07
#define CONFIG_VBIAS_ON (1<<7)
#define CONFIG_VBIAS_OFF (0<<7)
#define CONFIG_MODE_AUTO (1<<6)
#define CONFIG_MODE_OFF (0<<6)
#define CONFIG_1SHOT (1<<5)
#define CONFIG_3WIRE (1<<4)
#define CONFIG_24WIRE (0<<4)
#define CONFIG_FAULTCYCLE_NO (0<<2)
#define CONFIG_FAULTCYCLE_AUTO (1<<2)
#define CONFIG_FAULTCYCLE_MANUAL1 (2<<2)
#define CONFIG_FAULTCYCLE_MANUAL2 (3<<2)
#define CONFIG_FAULTSTATCLEAR (1<<1)
#define CONFIG_FILT50HZ (1<<0)
#define CONFIG_FILT60HZ (0<<0)
#define FAULT_HIGHTHRESH 0x80
#define FAULT_LOWTHRESH 0x40
#define FAULT_REFINLOW 0x20
#define FAULT_REFINHIGH 0x10
#define FAULT_RTDINLOW 0x08
#define FAULT_OVUV 0x04
#define CONFIG (U8)(CONFIG_VBIAS_ON | CONFIG_MODE_OFF | CONFIG_24WIRE | CONFIG_FILT60HZ) // enable Vbias; autoconvert off; 4-wire; 60Hz;
#define EVENT_ENABLE ((U32)(1<<0))
#define EVENT_DISABLE ((U32)(1<<1))
#define EVENT_INVERT ((U32)(1<<2))
#define EVENT_EXT_SYNC_ENABLE ((U32)(1<<3))
#define EVENT_NEW_SET_VALUE ((U32)(1<<4))
#define EVENT_NEW_MODE ((U32)(1<<5))
#define EVENT_DAC_START ((U32)(1<<6))
#define EVENT_DAC_STOP ((U32)(1<<7))
#define EVENT_ADC_DATA_READY ((U32)(1<<8))
#define EVENT_RESET_DATA_COUNTER ((U32)(1<<9))
#define EVENT_FLAGS_ALL ( EVENT_ENABLE | EVENT_DISABLE | EVENT_INVERT | \
EVENT_EXT_SYNC_ENABLE | EVENT_NEW_SET_VALUE | EVENT_NEW_MODE | \
EVENT_DAC_START | EVENT_DAC_STOP | EVENT_ADC_DATA_READY | \
EVENT_RESET_DATA_COUNTER )
//=================================================================================================
// Section: MACROS
// Description: Definition of local macros (visible by this module only).
//=================================================================================================
//=================================================================================================
// Section: ENUMERATIONS
// Description: Definition of local enumerations (visible by this module only).
//=================================================================================================
//=================================================================================================
// Section: STRUCTURES
// Description: Definition of local Structures (visible by this module only).
//=================================================================================================
//=================================================================================================
// Section: LOCAL CONSTANTS
// Description: Definition of local constants (visible by this module only).
//=================================================================================================
LOCAL CONST osMutexAttr_t m_stMutexAttr =
{
"ADCD_Mutex", // human readable mutex name
osMutexRecursive | osMutexPrioInherit, // attr_bits
NULL, // memory for control block
0U // size for control block
};
// Data Ready Pin
//LOCAL CONST GPIO_TypeDef* m_pstDataReadyPort = GPIOD;
//LOCAL CONST U16 m_u16DataReadyPin = GPIO_PIN_8;
//=================================================================================================
// Section: LOCAL VARIABLES
// Description: Definition of local variables (visible by this module only).
//=================================================================================================
LOCAL U8 m_au8RxData[8];
LOCAL U8 m_au8TxData[8];
LOCAL osMutexId_t m_pstMutexID = NULL;
LOCAL SPID_StHandle m_stSPIHandle =
{
SPID_eADC, // enSPI;
0xFF, // enCS (0xFF = hardware chip select)
m_au8TxData, // pu8TxBuf;
m_au8RxData, // pu8RxBuf;
0, // u16TransferSize;
};
//=================================================================================================
// Section: LOCAL FUNCTIONS (PROTOTYPES)
// Description: Definition of local functions (visible by this module only).
//=================================================================================================
//PRIVATE VOID vAttachDataReadyISR ( VOID );
//PRIVATE VOID vDeattachDataReadyISR ( VOID );
PRIVATE BOOL boWriteReg( U8 u8Register, U16 u16Data, BOOL boIs16bit );
PRIVATE BOOL boReadReg( U8 u8Register, PU16 pu16Data, BOOL boIs16bit );
//=================================================================================================
// Section: EXTERNAL FUNCTIONS
// Description: Definition of external (global) functions.
//=================================================================================================
//=================================================================================================
// Section: EXTERNAL VARIABLES
// Description: Definition of external (global) variables.
//=================================================================================================
//=================================================================================================
// Section: GLOBAL FUNCTIONS
// Description: Definition (implementation) of global functions.
//=================================================================================================
//-------------------------------------------------------------------------------------------------
// Function: ADCD_boInitializeModule
// Description: Initializes the ADC module
// Parameters: None
// Returns: BOOL TRUE, if initializaiton sucessful, otherwise FALSE
//
//-------------------------------------------------------------------------------------------------
BOOL ADCD_boInitializeModule( VOID )
{
BOOL boOK = TRUE;
U16 u16Data = 0;
boOK &= ((m_pstMutexID = osMutexNew( &m_stMutexAttr )) == NULL) ? FALSE : TRUE;
osMutexAcquire( m_pstMutexID, osWaitForever );
DIPO_vSetOutput(DIPO_eCS_C);
boOK &= boWriteReg(REG_CONFIG, (U16) CONFIG | CONFIG_FAULTSTATCLEAR, FALSE);
DIPO_vResetOutput(DIPO_eCS_C);
DIPO_vSetOutput(DIPO_eCS_C);
boOK &= boWriteReg(REG_HIGH_FAULT_MSB, (U16) 0x5b12 , TRUE);
DIPO_vResetOutput(DIPO_eCS_C);
DIPO_vSetOutput(DIPO_eCS_C);
boOK &= boWriteReg(REG_LOW_FAULT_MSB, (U16) 0x2690 , TRUE);
DIPO_vResetOutput(DIPO_eCS_C);
DIPO_vSetOutput(DIPO_eCS_H);
boOK &= boWriteReg(REG_CONFIG, (U16) CONFIG | CONFIG_FAULTSTATCLEAR, FALSE);
DIPO_vResetOutput(DIPO_eCS_H);
DIPO_vSetOutput(DIPO_eCS_H);
boOK &= boWriteReg(REG_HIGH_FAULT_MSB, (U16) 0x5b12 , TRUE);
DIPO_vResetOutput(DIPO_eCS_H);
DIPO_vSetOutput(DIPO_eCS_H);
boOK &= boWriteReg(REG_LOW_FAULT_MSB, (U16) 0x2690 , TRUE);
DIPO_vResetOutput(DIPO_eCS_H);
osMutexRelease( m_pstMutexID );
return( boOK );
}
//-------------------------------------------------------------------------------------------------
// Function: ADCD_dReadData
// Description: Reads the conversion data form the ADC
// Parameters: PU8 pu8Error error
// Returns: DOUBLE conversion data
//
//-------------------------------------------------------------------------------------------------
BOOL ADCD_dReadData(ADCD_EnTemps eChannel, PU8 pu8Error, PU16 pu16Data)
{
BOOL boOK = TRUE;
*pu8Error = 0; // reset error state
U16 u16Data = 0;
DIPO_EnDigitalOutput CS = DIPO_eCS_H;
if(eChannel == ADCD_eHot)CS = DIPO_eCS_H;
else if (eChannel == ADCD_eCold)CS = DIPO_eCS_C;
osMutexAcquire( m_pstMutexID, osWaitForever );
DIPO_vSetOutput(CS);
boOK &= boWriteReg(REG_CONFIG, CONFIG | CONFIG_1SHOT , FALSE);
DIPO_vResetOutput(CS);
osMutexRelease( m_pstMutexID );
osDelay(55);
osMutexAcquire( m_pstMutexID, osWaitForever );
DIPO_vSetOutput(CS);
boOK &= boReadReg(REG_RTD_MSB, &u16Data, TRUE);
DIPO_vResetOutput(CS);
osMutexRelease( m_pstMutexID );
if( !boOK )
{
*pu8Error |= ADCD_SPI_FAILURE;
return 0;
}
if((u16Data & 0x01) == 0x01)
{
*pu8Error |= ADCD_STATUS_DATA_ERROR;
osMutexAcquire( m_pstMutexID, osWaitForever );
DIPO_vSetOutput(CS);
boOK &= boReadReg(REG_FAULT_STATUS, &u16Data, FALSE);
DIPO_vResetOutput(CS);
DIPO_vSetOutput(CS);
boOK &= boWriteReg(REG_CONFIG, (U16) CONFIG | CONFIG_FAULTSTATCLEAR, FALSE);
DIPO_vResetOutput(CS);
DIPO_vSetOutput(CS);
boOK &= boReadReg(REG_HIGH_FAULT_MSB, &u16Data, TRUE);
DIPO_vResetOutput(CS);
osMutexRelease( m_pstMutexID );
*pu8Error |= u16Data & 0xFC;
return 0;
}
u16Data = u16Data >> 1;
*pu16Data = u16Data;
osMutexAcquire( m_pstMutexID, osWaitForever );
DIPO_vSetOutput(CS);
boOK &= boWriteReg(REG_CONFIG, CONFIG | CONFIG_FAULTCYCLE_AUTO , FALSE);
DIPO_vResetOutput(CS);
osMutexRelease( m_pstMutexID );
return( boOK );
}
//=================================================================================================
// Section: LOCAL FUNCTIONS
// Descriptionn: Definition (implementation) of local functions.
//=================================================================================================
//-------------------------------------------------------------------------------------------------
// Function: boWriteReg
// Description: Writes to the regiser
// Parameters: U8 u8Register
// U16 u16Data
// BOOL boIs16bit TRUE, if Data is 16bit, FALSE, if Data is 8bit
// Returns: BOOL TRUE, if successful, otherwise FALSE
//-------------------------------------------------------------------------------------------------
PRIVATE BOOL boWriteReg( U8 u8Register, U16 u16Data, BOOL boIs16bit )
{
BOOL boOK = TRUE;
if(boIs16bit){
m_au8TxData[0] = CMD_WRITE | u8Register;
m_au8TxData[1] = (U8)(u16Data>>8);
m_au8TxData[2] = (U8)u16Data;
m_stSPIHandle.u16TransferSize = 3;
boOK &= SPID_boSendReceive( &m_stSPIHandle );
} else {
m_au8TxData[0] = CMD_WRITE | u8Register;
m_au8TxData[1] = (U8)u16Data;
m_stSPIHandle.u16TransferSize = 2;
boOK &= SPID_boSendReceive( &m_stSPIHandle );
}
return( boOK );
}
//-------------------------------------------------------------------------------------------------
// Function: boReadReg
// Description: Reads the regiser
// Parameters: U8 u8Register
// PU16 pu16Data
// BOOL boIs16bit TRUE, if Data is 16bit, FALSE, if Data is 8bit
// Returns: BOOL TRUE, if successful, otherwise FALSE
//-------------------------------------------------------------------------------------------------
PRIVATE BOOL boReadReg( U8 u8Register, PU16 pu16Data, BOOL boIs16bit )
{
BOOL boOK = TRUE;
if(boIs16bit){
m_au8TxData[0] = CMD_READ | u8Register;
m_au8TxData[1] = 0;
m_au8TxData[2] = 0;
m_stSPIHandle.u16TransferSize = 3;
boOK &= SPID_boSendReceive( &m_stSPIHandle );
*pu16Data = ((U16)m_au8RxData[1]<<8) | ((U16)m_au8RxData[2]<<0);
} else {
m_au8TxData[0] = CMD_READ | u8Register;
m_au8TxData[1] = 0;
m_stSPIHandle.u16TransferSize = 2;
boOK &= SPID_boSendReceive( &m_stSPIHandle );
*pu16Data = (U16)m_au8RxData[1];
}
return( boOK );
}
//-------------------------------------------------------------------------------------------------
// Function: vEventCallback
// Description: Callback for events
// Parameters: None
// Returns: None
//-------------------------------------------------------------------------------------------------
//PRIVATE VOID vEventCallback( PVOID pvData )
//{
// osEventFlagsSet( m_pstEventID, (U32)pvData );
//}
//-------------------------------------------------------------------------------------------------
// Function: vAttachDataReadyISR
// Description: Set Data Ready Pin Mode to ISR falling Edge
// Parameters: None
// Returns: None
//-------------------------------------------------------------------------------------------------
//PRIVATE VOID vAttachDataReadyISR ( VOID )
//{
// GPIO_InitTypeDef GPIO_InitStruct = {0};
// /*Configure GPIO pin : ADC_RDY_Pin */
// GPIO_InitStruct.Pin = m_u16DataReadyPin;
// GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
// GPIO_InitStruct.Pull = GPIO_NOPULL;
// HAL_GPIO_Init((GPIO_TypeDef*)m_pstDataReadyPort, &GPIO_InitStruct);
//}
//-------------------------------------------------------------------------------------------------
// Function: vDeattachDataReadyISR
// Description: Set Data Ready Pin Mode to Input
// Parameters: None
// Returns: None
//-------------------------------------------------------------------------------------------------
//PRIVATE VOID vDeattachDataReadyISR ( VOID )
//{
//
// HAL_GPIO_DeInit((GPIO_TypeDef*)m_pstDataReadyPort, m_u16DataReadyPin);
//}