/**
* @file AD7124_ATY.c
*
* @param Project DEVICE_DRIVER_ATY_LIB
*
* @author ATY
*
* @copyright
* - Copyright 2017 - 2026 MZ-ATY
* - This code follows:
* - MZ-ATY Various Contents Joint Statement -
*
* https://mengze.top/MZ-ATY_VCJS
* - CC 4.0 BY-NC-SA -
*
* https://creativecommons.org/licenses/by-nc-sa/4.0/
* - Your use will be deemed to have accepted the terms of this statement.
*
* @brief functions of AD7124 for C platform
*
* @note SPI_POLARITY_LOW + SPI_PHASE_1EDGE = CPOL=0, CPHA=0 = SPI Mode 1
*
* @version
* - 1_01_230828 > ATY
* -# Preliminary version, first Release
* - 1_02_231229 > ATY
* -# add multy addr and dev->channel
* - 1_03_240111 > ATY
* -# add lock
* - 1_04_251124 > ATY
* -# change log and test basely
* - 1_05_251225 > ATY
* -# change dev position and add initFlag to auto init
********************************************************************************
*/
#ifndef __AD7124_ATY_C
#define __AD7124_ATY_C
#include "AD7124_ATY.h"
#define AD7124_ATY_TAG "\r\n[AD7124_ATY] "
/******************************* For user *************************************/
/******************************************************************************/
/**
* @brief
*
* @param data
* @param len
* @param dev
* @return uint8_t
*/
uint8_t AD7124_WriteRead(struct AD7124_ATY_Dev* dev, uint8_t* data, uint8_t len){
uint8_t errCode = 0;
__ATY_LOCK(dev);
dev->nssSet(__ATY_HL_L);
printf_ATY_D("%sRW_W: ", AD7124_ATY_TAG);
for(int i = 0; i < len; i++) printf_ATY_D("%02X ", data[i]);
errCode = dev->spiProcess(data, len);
printf_ATY_D("%sRW_R: ", AD7124_ATY_TAG);
for(int i = 0; i < len; i++) printf_ATY_D("%02X ", data[i]);
dev->nssSet(__ATY_HL_H);
__ATY_UNLOCK(dev);
return errCode;
}
/**
* @brief
*
* @param dev
* @return uint8_t
*/
uint8_t AD7124_Reset(struct AD7124_ATY_Dev* dev){
uint8_t errCode = 0, resetBuf[9] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
printf_ATY_D("%s--Reset", AD7124_ATY_TAG);
__ATY_LOCK(dev);
dev->syncSet(__ATY_HL_H);
// dev->delay(10);
dev->nssSet(__ATY_HL_H);
dev->delay(10);
__ATY_UNLOCK(dev);
// write more than 64 bits to reset AD7124
errCode = AD7124_WriteRead(dev, resetBuf, 9);
return errCode;
}
/**
* @brief
*
* @param id
* @param dev
* @return uint8_t
*/
uint8_t AD7124_ReadId(struct AD7124_ATY_Dev* dev, uint8_t* id){
uint8_t errCode = 0, groupTrans[2] = {0};
printf_ATY_D("%s--ReadId", AD7124_ATY_TAG);
groupTrans[0] = 0x45;
groupTrans[1] = 0;
errCode = AD7124_WriteRead(dev, groupTrans, 2);
dev->id = groupTrans[1];
*id = dev->id;
printf_ATY_D("%sAD7124_ID: %02X\r\n", AD7124_ATY_TAG, dev->id);
return errCode;
}
/**
* @brief
*
* @param regAddr
* @param data
* @param len
* @param dev
* @return uint8_t
* @note AD7124_ERR_REG_SPI_IGNORE_ERR only for crc trans
*/
uint8_t AD7124_WriteReg(struct AD7124_ATY_Dev* dev, uint8_t regAddr, uint32_t data, uint8_t len){
uint8_t errCode = 0, i = 0, groupTrans[4] = {0};
printf_ATY_D("%s--WriteReg", AD7124_ATY_TAG);
groupTrans[0] = AD7124_COMM_REG_WA(regAddr);
for(i = 0; i < len; i++){
groupTrans[len - i] = data & 0xFF;
data = data >> 8;
}
printf_ATY_D("%sWriteReg: ", AD7124_ATY_TAG);
for(i = 0; i < len + 1; i++)
printf_ATY_D("%02X ", groupTrans[i]);
errCode = AD7124_WriteRead(dev, groupTrans, len + 1);
return errCode;
}
/**
* @brief
*
* @param regAddr
* @param data
* @param len
* @param dev
* @return uint8_t
*/
uint8_t AD7124_ReadReg(struct AD7124_ATY_Dev* dev, uint8_t regAddr, uint32_t* data, uint8_t len){
uint8_t errCode = 0, i = 0, groupTrans[4] = {0};
printf_ATY_D("%s--ReadReg", AD7124_ATY_TAG);
groupTrans[0] = AD7124_COMM_REG_RA(regAddr);
errCode = AD7124_WriteRead(dev, groupTrans, len + 1);
if(len == 1)
*data = groupTrans[1];
else if(len == 2)
*data = (groupTrans[1] + (groupTrans[2] << 8));
else if(len == 3)
*data = (groupTrans[1] + (groupTrans[2] << 8) + (groupTrans[3] << 16));
printf_ATY_D("%sReadReg: ", AD7124_ATY_TAG);
for(i = 0; i < len + 1; i++)
printf_ATY_D("%X ", data);
return errCode;
}
/**
* @brief
*
* @param data
* @param dev
* @return uint8_t
*/
uint8_t AD7124_ReadData(struct AD7124_ATY_Dev* dev, uint8_t* data){
AD7124_Init(dev, dev->cfg);
printf_ATY_D("%s--ReadData", AD7124_ATY_TAG);
uint8_t errCode = 0, i = 0;
data[0] = AD7124_COMM_REG_RA(AD7124_DATA_REG);
errCode = AD7124_WriteRead(dev, data, 5);
printf_ATY_D("%sReadData: 0x ", AD7124_ATY_TAG);
for(i = 0; i < 5; i++)
printf_ATY_D("%02X ", data[i]);
return errCode;
}
/**
* @brief
*
* @param status
* @param dev
* @return uint8_t
*/
uint8_t AD7124_ReadStatus(struct AD7124_ATY_Dev* dev, uint8_t* status){
printf_ATY_D("%s--ReadStatus", AD7124_ATY_TAG);
if(AD7124_ReadReg(dev, AD7124_STATUS_REG, (uint32_t*)status, 1)){
printf_ATY_D("%sAD7124_ERR: STATE %02X %02X\r\n",
AD7124_ATY_TAG, status[0], status[1]);
return 1;
}
dev->delay(10);
return 0;
}
/**
* @brief
*
* @param data
* @param resolution
* @param refRes
* @param gain
* @return float
*/
float AD7124_DataToRes(uint32_t data, uint8_t resolution, float refRes, uint8_t gain){
uint32_t tempNum = 1;
uint8_t i = 0;
for(i = 0; i < resolution - 1; i++)
tempNum *= 2;
return (float)((((float)data - (float)tempNum) * refRes) / ((float)gain * (float)tempNum));
}
/**
* @brief
*
* @param data
* @return float
*/
float AD7124_DataToResDefault(uint32_t data){
return (float)((((float)data - 8388608.0) * 5110.0) / (16.0 * 8388608.0));
}
/**
* @brief
*
* @param cfg
* @param dev
* @return uint8_t
*/
uint8_t AD7124_Init(struct AD7124_ATY_Dev* dev, struct AD7124_ATY_Cfg* cfg){
if(dev->initFlag == 0){
uint8_t id = 0, status[2] = {0};
printf_ATY_D("%sAD7124_Init", AD7124_ATY_TAG);
dev->enSet(__ATY_HL_H);
if(AD7124_Reset(dev)){
printf_ATY_D("%sAD7124_ERR: RST", AD7124_ATY_TAG);
return 1;
}
if(AD7124_ReadId(dev, &id)){
printf_ATY_D("%sAD7124_ERR: ID", AD7124_ATY_TAG);
return 2;
}
if(AD7124_ReadStatus(dev, status)){
printf_ATY_D("%sAD7124_ERR: Status", AD7124_ATY_TAG);
return 3;
}
if(AD7124_Config(dev, cfg)){
printf_ATY_D("%sAD7124_ERR: CFG", AD7124_ATY_TAG);
return 4;
}
dev->initFlag = 1;
return 0;
}
return 0;
}
/**
* @brief
*
* @param cfg
* @param dev
* @return uint8_t
*/
uint8_t AD7124_Config(struct AD7124_ATY_Dev* dev, struct AD7124_ATY_Cfg* cfg){
printf_ATY_D("%s--Config", AD7124_ATY_TAG);
if(cfg->AD7124_ADC_CTRL_REG_t) AD7124_WriteReg(dev, AD7124_ADC_CTRL_REG, cfg->AD7124_ADC_CTRL_REG_t, 2);
if(cfg->AD7124_IO_CTRL1_REG_t) AD7124_WriteReg(dev, AD7124_IO_CTRL1_REG, cfg->AD7124_IO_CTRL1_REG_t, 3);
if(cfg->AD7124_IO_CTRL2_REG_t) AD7124_WriteReg(dev, AD7124_IO_CTRL2_REG, cfg->AD7124_IO_CTRL2_REG_t, 2);
if(cfg->AD7124_ERREN_REG_t) AD7124_WriteReg(dev, AD7124_ERREN_REG, cfg->AD7124_ERREN_REG_t, 3);
if(cfg->AD7124_CH0_MAP_REG_t) AD7124_WriteReg(dev, AD7124_CH0_MAP_REG, cfg->AD7124_CH0_MAP_REG_t, 2);
if(cfg->AD7124_CH1_MAP_REG_t) AD7124_WriteReg(dev, AD7124_CH1_MAP_REG, cfg->AD7124_CH1_MAP_REG_t, 2);
if(cfg->AD7124_CH2_MAP_REG_t) AD7124_WriteReg(dev, AD7124_CH2_MAP_REG, cfg->AD7124_CH2_MAP_REG_t, 2);
if(cfg->AD7124_CH3_MAP_REG_t) AD7124_WriteReg(dev, AD7124_CH3_MAP_REG, cfg->AD7124_CH3_MAP_REG_t, 2);
if(cfg->AD7124_CH4_MAP_REG_t) AD7124_WriteReg(dev, AD7124_CH4_MAP_REG, cfg->AD7124_CH4_MAP_REG_t, 2);
if(cfg->AD7124_CH5_MAP_REG_t) AD7124_WriteReg(dev, AD7124_CH5_MAP_REG, cfg->AD7124_CH5_MAP_REG_t, 2);
if(cfg->AD7124_CH6_MAP_REG_t) AD7124_WriteReg(dev, AD7124_CH6_MAP_REG, cfg->AD7124_CH6_MAP_REG_t, 2);
if(cfg->AD7124_CH7_MAP_REG_t) AD7124_WriteReg(dev, AD7124_CH7_MAP_REG, cfg->AD7124_CH7_MAP_REG_t, 2);
if(cfg->AD7124_CH8_MAP_REG_t) AD7124_WriteReg(dev, AD7124_CH8_MAP_REG, cfg->AD7124_CH8_MAP_REG_t, 2);
if(cfg->AD7124_CH9_MAP_REG_t) AD7124_WriteReg(dev, AD7124_CH9_MAP_REG, cfg->AD7124_CH9_MAP_REG_t, 2);
if(cfg->AD7124_CH10_MAP_REG_t) AD7124_WriteReg(dev, AD7124_CH10_MAP_REG, cfg->AD7124_CH10_MAP_REG_t, 2);
if(cfg->AD7124_CH11_MAP_REG_t) AD7124_WriteReg(dev, AD7124_CH11_MAP_REG, cfg->AD7124_CH11_MAP_REG_t, 2);
if(cfg->AD7124_CH12_MAP_REG_t) AD7124_WriteReg(dev, AD7124_CH12_MAP_REG, cfg->AD7124_CH12_MAP_REG_t, 2);
if(cfg->AD7124_CH13_MAP_REG_t) AD7124_WriteReg(dev, AD7124_CH13_MAP_REG, cfg->AD7124_CH13_MAP_REG_t, 2);
if(cfg->AD7124_CH14_MAP_REG_t) AD7124_WriteReg(dev, AD7124_CH14_MAP_REG, cfg->AD7124_CH14_MAP_REG_t, 2);
if(cfg->AD7124_CH15_MAP_REG_t) AD7124_WriteReg(dev, AD7124_CH15_MAP_REG, cfg->AD7124_CH15_MAP_REG_t, 2);
if(cfg->AD7124_CFG0_REG_t) AD7124_WriteReg(dev, AD7124_CFG0_REG, cfg->AD7124_CFG0_REG_t, 2);
if(cfg->AD7124_CFG1_REG_t) AD7124_WriteReg(dev, AD7124_CFG1_REG, cfg->AD7124_CFG1_REG_t, 2);
if(cfg->AD7124_CFG2_REG_t) AD7124_WriteReg(dev, AD7124_CFG2_REG, cfg->AD7124_CFG2_REG_t, 2);
if(cfg->AD7124_CFG3_REG_t) AD7124_WriteReg(dev, AD7124_CFG3_REG, cfg->AD7124_CFG3_REG_t, 2);
if(cfg->AD7124_CFG4_REG_t) AD7124_WriteReg(dev, AD7124_CFG4_REG, cfg->AD7124_CFG4_REG_t, 2);
if(cfg->AD7124_CFG5_REG_t) AD7124_WriteReg(dev, AD7124_CFG5_REG, cfg->AD7124_CFG5_REG_t, 2);
if(cfg->AD7124_CFG6_REG_t) AD7124_WriteReg(dev, AD7124_CFG6_REG, cfg->AD7124_CFG6_REG_t, 2);
if(cfg->AD7124_CFG7_REG_t) AD7124_WriteReg(dev, AD7124_CFG7_REG, cfg->AD7124_CFG7_REG_t, 2);
if(cfg->AD7124_FILT0_REG_t) AD7124_WriteReg(dev, AD7124_FILT0_REG, cfg->AD7124_FILT0_REG_t, 3);
if(cfg->AD7124_FILT1_REG_t) AD7124_WriteReg(dev, AD7124_FILT1_REG, cfg->AD7124_FILT1_REG_t, 3);
if(cfg->AD7124_FILT2_REG_t) AD7124_WriteReg(dev, AD7124_FILT2_REG, cfg->AD7124_FILT2_REG_t, 3);
if(cfg->AD7124_FILT3_REG_t) AD7124_WriteReg(dev, AD7124_FILT3_REG, cfg->AD7124_FILT3_REG_t, 3);
if(cfg->AD7124_FILT4_REG_t) AD7124_WriteReg(dev, AD7124_FILT4_REG, cfg->AD7124_FILT4_REG_t, 3);
if(cfg->AD7124_FILT5_REG_t) AD7124_WriteReg(dev, AD7124_FILT5_REG, cfg->AD7124_FILT5_REG_t, 3);
if(cfg->AD7124_FILT6_REG_t) AD7124_WriteReg(dev, AD7124_FILT6_REG, cfg->AD7124_FILT6_REG_t, 3);
if(cfg->AD7124_FILT7_REG_t) AD7124_WriteReg(dev, AD7124_FILT7_REG, cfg->AD7124_FILT7_REG_t, 3);
if(cfg->AD7124_OFFS0_REG_t) AD7124_WriteReg(dev, AD7124_OFFS0_REG, cfg->AD7124_OFFS0_REG_t, 3);
if(cfg->AD7124_OFFS1_REG_t) AD7124_WriteReg(dev, AD7124_OFFS1_REG, cfg->AD7124_OFFS1_REG_t, 3);
if(cfg->AD7124_OFFS2_REG_t) AD7124_WriteReg(dev, AD7124_OFFS2_REG, cfg->AD7124_OFFS2_REG_t, 3);
if(cfg->AD7124_OFFS3_REG_t) AD7124_WriteReg(dev, AD7124_OFFS3_REG, cfg->AD7124_OFFS3_REG_t, 3);
if(cfg->AD7124_OFFS4_REG_t) AD7124_WriteReg(dev, AD7124_OFFS4_REG, cfg->AD7124_OFFS4_REG_t, 3);
if(cfg->AD7124_OFFS5_REG_t) AD7124_WriteReg(dev, AD7124_OFFS5_REG, cfg->AD7124_OFFS5_REG_t, 3);
if(cfg->AD7124_OFFS6_REG_t) AD7124_WriteReg(dev, AD7124_OFFS6_REG, cfg->AD7124_OFFS6_REG_t, 3);
if(cfg->AD7124_OFFS7_REG_t) AD7124_WriteReg(dev, AD7124_OFFS7_REG, cfg->AD7124_OFFS7_REG_t, 3);
if(cfg->AD7124_GAIN0_REG_t) AD7124_WriteReg(dev, AD7124_GAIN0_REG, cfg->AD7124_GAIN0_REG_t, 3);
if(cfg->AD7124_GAIN1_REG_t) AD7124_WriteReg(dev, AD7124_GAIN1_REG, cfg->AD7124_GAIN1_REG_t, 3);
if(cfg->AD7124_GAIN2_REG_t) AD7124_WriteReg(dev, AD7124_GAIN2_REG, cfg->AD7124_GAIN2_REG_t, 3);
if(cfg->AD7124_GAIN3_REG_t) AD7124_WriteReg(dev, AD7124_GAIN3_REG, cfg->AD7124_GAIN3_REG_t, 3);
if(cfg->AD7124_GAIN4_REG_t) AD7124_WriteReg(dev, AD7124_GAIN4_REG, cfg->AD7124_GAIN4_REG_t, 3);
if(cfg->AD7124_GAIN5_REG_t) AD7124_WriteReg(dev, AD7124_GAIN5_REG, cfg->AD7124_GAIN5_REG_t, 3);
if(cfg->AD7124_GAIN6_REG_t) AD7124_WriteReg(dev, AD7124_GAIN6_REG, cfg->AD7124_GAIN6_REG_t, 3);
if(cfg->AD7124_GAIN7_REG_t) AD7124_WriteReg(dev, AD7124_GAIN7_REG, cfg->AD7124_GAIN7_REG_t, 3);
printf_ATY_D("\r\n");
return 0;
}
/**
* @brief
*
* @param calibrateType b1111
* @param cfg
* @param dev
* @return uint8_t
* @note 0001 int full cal at mid power
0010 int zero cal at full power
0100 sys full cal
1000 sys zero cal
*/
uint8_t AD7124_Calibrate(struct AD7124_ATY_Dev* dev, struct AD7124_ATY_Cfg* cfg, uint8_t calibrateType){
uint32_t regTrans = 0;
AD7124_Init(dev, dev->cfg);
printf_ATY_D("%s--Calibrate: %02X", AD7124_ATY_TAG, calibrateType);
AD7124_WriteReg(dev, AD7124_OFFS0_REG, 0x800000, 3);
AD7124_WriteReg(dev, AD7124_OFFS1_REG, 0x800000, 3);
AD7124_WriteReg(dev, AD7124_OFFS2_REG, 0x800000, 3);
AD7124_WriteReg(dev, AD7124_OFFS3_REG, 0x800000, 3);
AD7124_WriteReg(dev, AD7124_OFFS4_REG, 0x800000, 3);
AD7124_WriteReg(dev, AD7124_OFFS5_REG, 0x800000, 3);
AD7124_WriteReg(dev, AD7124_OFFS6_REG, 0x800000, 3);
AD7124_WriteReg(dev, AD7124_OFFS7_REG, 0x800000, 3);
if(calibrateType & AD7124_CALIBRATE_INT_FULL){
AD7124_WriteReg(dev, AD7124_ADC_CTRL_REG, 0x0058, 2); // int full cal at mid power
AD7124_ReadReg(dev, AD7124_ADC_CTRL_REG, ®Trans, 2);
dev->delay(1500); // 1300ms min
AD7124_ReadReg(dev, AD7124_ADC_CTRL_REG, ®Trans, 2);
}
if(calibrateType & AD7124_CALIBRATE_INT_ZERO){
AD7124_WriteReg(dev, AD7124_ADC_CTRL_REG, 0x0094, 2); // int zero cal at full power
AD7124_ReadReg(dev, AD7124_ADC_CTRL_REG, ®Trans, 2);
dev->delay(100); // 80ms min
AD7124_ReadReg(dev, AD7124_ADC_CTRL_REG, ®Trans, 2);
}
if(calibrateType & AD7124_CALIBRATE_SYS_FULL){
AD7124_WriteReg(dev, AD7124_ADC_CTRL_REG, 0x00A0, 2); // sys full cal
AD7124_ReadReg(dev, AD7124_ADC_CTRL_REG, ®Trans, 2);
dev->delay(100); // 80ms min
AD7124_ReadReg(dev, AD7124_ADC_CTRL_REG, ®Trans, 2);
}
if(calibrateType & AD7124_CALIBRATE_SYS_ZERO){
AD7124_WriteReg(dev, AD7124_ADC_CTRL_REG, 0x009C, 2); // sys zero cal
AD7124_ReadReg(dev, AD7124_ADC_CTRL_REG, ®Trans, 2);
dev->delay(100); // 80ms min
AD7124_ReadReg(dev, AD7124_ADC_CTRL_REG, ®Trans, 2);
}
AD7124_WriteReg(dev, AD7124_ADC_CTRL_REG, cfg->AD7124_ADC_CTRL_REG_t, 2); // detect mode
printf_ATY_D("\r\n");
dev->delay(1);
return 0;
}
/**
* @brief
*
* @param dev
* @return uint8_t
*/
uint8_t AD7124_ReadAllReg(struct AD7124_ATY_Dev* dev, struct AD7124_ATY_Cfg* cfg){
uint8_t i = 0;
uint32_t* p = (uint32_t*)cfg;
printf_ATY_D("%s--AllRegs %d", AD7124_ATY_TAG, (sizeof(struct AD7124_ATY_Cfg) / sizeof(uint32_t)));
for(i = 0; i < (sizeof(struct AD7124_ATY_Cfg) / sizeof(uint32_t)); i++){ // 0x00~0x38
printf_ATY_D("\r\nReg 0x%02X: ", i);
AD7124_ReadReg(dev, i, (p + i), 3);
}
// AD7124_ReadReg(AD7124_ADC_CTRL_REG, groupTrans, 2, dev);
printf_ATY_D("\r\n");
return 0;
}
#endif /* __AD7124_ATY_C */
/************************************ etc *************************************/
/* init
// AD7124 ----------------------------------------------------------------------
#include "AD7124_ATY.h"
uint8_t group_AD7124_Data[5] = {0};
void AD7124_1_NSS_SET(uint8_t level){
if(level == __ATY_HL_L)
HAL_GPIO_WritePin(SPI2_NSS_GPIO_Port, SPI2_NSS_Pin, GPIO_PIN_RESET);
else if(level == __ATY_HL_H)
HAL_GPIO_WritePin(SPI2_NSS_GPIO_Port, SPI2_NSS_Pin, GPIO_PIN_SET);
}
void AD7124_1_EN_SET(uint8_t level){}
void AD7124_1_SYNC_SET(uint8_t level){}
uint8_t AD7124_1_SPI(uint8_t* data_t, uint16_t len){
return HAL_SPI_TransmitReceive(&hspi2, (uint8_t*)data_t, (uint8_t*)data_t, len, 1000);
}
// config template
struct AD7124_ATY_Cfg AD7124_ATY_Cfg_CHIP_T = {
.AD7124_ADC_CTRL_REG_t = 0x0580,
.AD7124_CFG0_REG_t = 0x09F0,
.AD7124_CH0_MAP_REG_t = 0x8211, // IC Temp, int vref
};
struct AD7124_ATY_Cfg AD7124_ATY_Cfg_NTC10_O1 = {
.AD7124_ADC_CTRL_REG_t = 0x0580,
.AD7124_CFG1_REG_t = 0x09F0,
.AD7124_FILT1_REG_t = 0x0060180,
.AD7124_GAIN1_REG_t = 0x5558CC,
.AD7124_CH0_MAP_REG_t = 0x918D,
};
struct AD7124_ATY_Cfg AD7124_ATY_Cfg_RTD4_1 = {
.AD7124_ADC_CTRL_REG_t = 0x0480,
.AD7124_IO_CTRL1_REG_t = 0x000400,
// .AD7124_ERREN_REG_t = 0x06FFFF,
.AD7124_CFG0_REG_t = 0x09E4,
.AD7124_FILT0_REG_t = 0x0060180,
.AD7124_GAIN0_REG_t = 0x5558CC,
.AD7124_CH0_MAP_REG_t = 0x9211, //IC Temp
.AD7124_CFG1_REG_t = 0x09E4,
.AD7124_FILT1_REG_t = 0x0060180,
.AD7124_GAIN1_REG_t = 0x05558CC,
.AD7124_CH1_MAP_REG_t = 0x9022,
};
struct AD7124_ATY_Cfg AD7124_ATY_Cfg_NTC1_1 = {
.AD7124_ADC_CTRL_REG_t = 0x0480,
.AD7124_IO_CTRL1_REG_t = 0x002040,
.AD7124_CFG1_REG_t = 0x09E1,
.AD7124_FILT1_REG_t = 0x0060180,
.AD7124_GAIN1_REG_t = 0x05558CC,
// 500uA * 5.11K = 2.5Vref, 1K gain 2 max
.AD7124_CH2_MAP_REG_t = 0x90A6,
};
struct AD7124_ATY_Cfg AD7124_ATY_Cfg_NTC10_1 = {
.AD7124_ADC_CTRL_REG_t = 0x0580,
.AD7124_CFG1_REG_t = 0x09F0,
.AD7124_FILT1_REG_t = 0x0060180,
.AD7124_GAIN1_REG_t = 0x5558CC,
.AD7124_CH3_MAP_REG_t = 0x918D,
.AD7124_CH4_MAP_REG_t = 0x91CF,
};
struct AD7124_ATY_Cfg AD7124_ATY_Cfg_TC_1 = {
.AD7124_ADC_CTRL_REG_t = 0x0580,
.AD7124_IO_CTRL2_REG_t = 0x0500,
.AD7124_CFG1_REG_t = 0x09F7,
.AD7124_FILT1_REG_t = 0x0060180,
.AD7124_GAIN1_REG_t = 0x5558CC,
.AD7124_CH5_MAP_REG_t = 0x9109,
.AD7124_CH6_MAP_REG_t = 0x914B,
};
struct AD7124_ATY_Dev AD7124_ATY_Dev_1 = {
.enSet = AD7124_1_EN_SET,
.syncSet = AD7124_1_SYNC_SET,
.nssSet = AD7124_1_NSS_SET,
.spiProcess = AD7124_1_SPI,
.initFlag = 0,
.addr = 0,
.id = 0,
.data = group_AD7124_Data,
// .cfg = &AD7124_ATY_Cfg_NTC10_O1,
.cfg = &AD7124_ATY_Cfg_CHIP_T,
.delay = HAL_Delay,
.lock = __ATY_UNLOCKED
};
*/
/* use
// tested 18ms fastest at stm32f103cbt6 72MHz, spi 18MBit/s, line 50mm, signal channel IC T
#define AD_INIT_MAX_COUNT 8
uint8_t adDetectType = 0; // 0: IC Temp / user channel, 1: RTD, 2: NTC1K, 34: NTC10K, 56: TC
uint32_t ad7124Code = 0;
void AD7124_Calc(uint8_t* codeGroup){
if((codeGroup[4] & 0x80) != 0){
AD7124_ATY_Dev_1.initFlag++;
if(AD7124_ATY_Dev_1.initFlag > AD_INIT_MAX_COUNT){
AD7124_ATY_Dev_1.initFlag = 0;
}
return;
}
if((codeGroup[4] & 0x0F) != adDetectType){
AD7124_ATY_Dev_1.initFlag++;
if(AD7124_ATY_Dev_1.initFlag > AD_INIT_MAX_COUNT)
AD7124_ATY_Dev_1.initFlag = 0;
return;
}
ad7124Code = (codeGroup[3] + (codeGroup[2] << 8) + (codeGroup[1] << 16));
printf_ATY("\r\nChip: %f", (((float)(ad7124Code - 0x800000) / 13584.0) - 272.5));
// Type Calc
float calcVol = 0, calcRes = 0, fastTempCalc = 0, aboveTempCalc = 0, belowTempCalc = 0;
if((codeGroup[4] & 0x0F) == 0){ // IC Temp
fastTempCalc = ((float)(ad7124Code - 0x800000) / 13584.0) - 272.5;
}
if((codeGroup[4] & 0x0F) == 1){ // RTD4
calcRes = AD7124_DataToRes(ad7124Code, 24, 5110.0, 16);
}
if((codeGroup[4] & 0x0F) == 2){ // NTC1K
calcRes = AD7124_DataToRes(ad7124Code, 24, 5110.0, 2);
}
if(((codeGroup[4] & 0x0F) == 3) || ((codeGroup[4] & 0x0F) == 4)){ // NTC10K
calcRes = 10.0 * 1000.0 * ((double)((double)(ad7124Code - 0x800000) / (double)(0x1000000 - ad7124Code)));
}
if(((codeGroup[4] & 0x0F) == 5) || ((codeGroup[4] & 0x0F) == 6)){ // TC
calcVol = (((float)ad7124Code - 8388608.0) * 2500.0 / (128.0 * 8388608.0));
}
// Type Table, put table out of function!!
const uint16_t RT_table_N30toP50_1_T_size = 81;
const double RT_table_N30toP50_1_T[81] = {-30, -29, -28, -27, -26, -25, -24, -23, -22, -21, -20, -19, -18, -17, -16, -15, -14, -13, -12, -11, -10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50};
const double RT_table_PT1000_N30toP50_1_R[81] = {882.21656767, 886.1604620248771, 890.1030863723519, 894.0444460833969, 897.984546428592, 901.9233925781249, 905.8609896017921, 909.797342468997, 913.7324560487519, 917.666335109677, 921.5989843200001, 925.530408247557, 929.460611359792, 933.389598023757, 937.317372506112, 941.243938973125, 945.1693014906721, 949.0934640242369, 953.0164304389119, 956.938204499397, 960.85878987, 964.7781901146369, 968.696408696832, 972.613448979717, 976.529314226032, 980.444007598125, 984.3575321579519, 988.2698908670769, 992.1810865866721, 996.091122077517, 1000, 1003.9077225, 1007.81429, 1011.7197025, 1015.6239599999999, 1019.5270625000002, 1023.4290100000001, 1027.3298025, 1031.2294399999998, 1035.1279225, 1039.02525, 1042.9214224999998, 1046.81644, 1050.7103025, 1054.60301, 1058.4945625000003, 1062.38496, 1066.2742025, 1070.16229, 1074.0492225, 1077.935, 1081.8196225, 1085.70309, 1089.5854024999999, 1093.46656, 1097.3465625000001, 1101.22541, 1105.1031025, 1108.97964, 1112.8550225, 1116.7292499999999, 1120.6023225, 1124.47424, 1128.3450025000002, 1132.2146100000002, 1136.0830625, 1139.95036, 1143.8165025, 1147.68149, 1151.5453224999999, 1155.408, 1159.2695224999998, 1163.12989, 1166.9891025000002, 1170.84716, 1174.7040625, 1178.5598100000002, 1182.4144025, 1186.26784, 1190.1201225, 1193.97125};
const double RT_table_NTC10K_B3950_N30toP50_1_R[81] = {200203.9024466842, 187316.35371436414, 175353.56517945265, 164242.815037761, 153917.57353446394, 144316.93726809666, 135385.11855020453, 127070.98414555467, 119327.63833441163, 112112.04578468086, 105384.690206038, 99109.26518793346, 93252.3940049376, 87783.37551199133, 82673.95355365716, 77898.10757980836, 73431.86239916032, 69253.11521500889, 65341.47827746307, 61678.13565594302, 58245.71278707882, 55028.15758840015, 52010.63204917008, 49179.41331794596, 46521.80340337541, 44026.046691571566, 41681.25456127495, 39477.33644786429, 37404.936769989145, 35455.37718893085, 33620.60372143574, 31893.138272305434, 30266.034194017953, 28732.835517560583, 27287.53953191174, 25924.56241959352, 24638.70768276219, 23425.137118719744, 22279.344125776763, 21197.12914032421, 20174.57702398485, 19208.036236013788, 18294.09964087108, 17429.586814247774, 16611.527722935953, 15837.147664908136, 15103.853365929419, 14409.220138062792, 13750.980013633698, 13127.010775676536, 12535.32581266281, 11974.064731474306, 11441.484668193882, 10935.952241391826, 10455.936097237052, 10000, 9566.796425378521, 9155.060617602236, 8763.605074487228, 8391.314427550227, 8037.140686973136, 7700.09882366077, 7379.2626628761145, 7073.761065987096, 6782.774378735532, 6505.531126156567, 6241.304935849771, 5989.411672745506, 5749.206769831047, 5520.082740513648, 5301.466859409668, 5092.818999369683, 4893.62961348718, 4703.417851699504, 4521.7298023814565, 4348.136850059472, 4182.234141043995, 4023.6391493935307, 3871.990336190894, 3726.945895634597, 3588.1825819290834};
const double RT_table_NTC10K_B3380_N30toP50_1_R[81] = {129916.73842576398, 122726.45506217859, 115987.98389609528, 109669.80710548842, 103742.81092588141, 98180.08736222527, 92956.75343550005, 88049.78631286524, 83437.87283482423, 79101.27210022854, 75021.689901878, 71182.16392373295, 67566.95871677202, 64161.46956567978, 60952.13444397613, 57926.35333195929, 55072.41424084727, 52379.42534858893, 49837.25270871057, 47436.46304390781, 45168.27118147633, 43024.49172859917, 40997.49462244794, 39080.16422340271, 37265.86164983361, 35548.39008012747, 33921.96277228722, 32381.173573736873, 30920.9697141643, 29536.62669253702, 28223.725086022154, 26978.129123593826, 25795.96688077618, 24673.61196437721, 23607.66656734277, 22594.945784110834, 21632.463086167136, 20717.41686598908, 19847.177965288593, 19019.278110503867, 18231.399184902846, 17481.363272511575, 16767.123414418118, 16086.755022872807, 15438.44790305672, 14820.498836453826, 14231.304683479702, 13669.355966418227, 13133.230896827301, 12621.589814422336, 12133.170007053395, 11666.78088378108, 11221.299475246835, 10795.666237541593, 10388.881137620136, 10000, 9628.131096037672, 9272.431958502, 8932.106405476528, 8606.401758829414, 8294.606243598528, 7996.046555661133, 7710.085585997876, 7436.120290726329, 7173.579696877923, 6921.923034627457, 6680.637987362497, 6449.239051606348, 6227.265999385221, 6014.2824361639205, 5809.8744479667575, 5613.649331755301, 5425.234403555528, 5244.275879215621, 5070.437823035709, 4903.401159843523, 4742.862746398391, 4588.534498291319, 4440.142568773257, 4297.426576188887, 4160.138876920097};
if(ntcType == 0){
fastTempCalc = ALGO_RT_Table_R2T(calcRes * 1.0,
RT_table_N30toP50_1_T,
RT_table_Custom3950_N30toP50_1_R,
RT_table_N30toP50_1_T_size);
}
else if(ntcType == 1){
fastTempCalc = ALGO_RT_Table_R2T(calcRes * 1.0,
RT_table_N30toP50_1_T,
RT_table_NTC10K_B3380_N30toP50_1_R,
RT_table_N30toP50_1_T_size);
}
else if(ntcType == 2){
fastTempCalc = ALGO_RT_Table_R2T(calcRes * 1.0,
RT_table_N30toP50_1_T,
RT_table_NTC10K_B3950_N30toP50_1_R,
RT_table_N30toP50_1_T_size);
}
// offset
fastTempCalc = (fastTempCalc * 1000.0) + 180.0;
}
void AD7124_Detect(void){
static uint8_t lastChannel = 0;
if(lastChannel != adDetectType){
lastChannel = adDetectType;
AD7124_ATY_Dev_1.initFlag++;
if(AD7124_ATY_Dev_1.initFlag > AD_INIT_MAX_COUNT)
AD7124_ATY_Dev_1.initFlag = 0;
return;
}
switch(adDetectType){
case 0:
case 1:
// AD7124_Calibrate(AD7124_CALIBRATE_INT_FULL | AD7124_CALIBRATE_INT_ZERO,
// &AD7124_ATY_Cfg_RTD4_1, &AD7124_ATY_Dev_1);
AD7124_ReadData(group_AD7124_Data, &AD7124_ATY_Dev_1);
AD7124_Calc(group_AD7124_Data);
AD7124_ReadData(group_AD7124_Data, &AD7124_ATY_Dev_1);
AD7124_Calc(group_AD7124_Data);
break;
case 2:
AD7124_Calibrate(AD7124_CALIBRATE_INT_FULL | AD7124_CALIBRATE_INT_ZERO,
&AD7124_ATY_Cfg_NTC1_1, &AD7124_ATY_Dev_1);
AD7124_ReadData(group_AD7124_Data, &AD7124_ATY_Dev_1);
AD7124_Calc(group_AD7124_Data);
break;
case 3:
case 4:
AD7124_Calibrate(AD7124_CALIBRATE_INT_FULL | AD7124_CALIBRATE_INT_ZERO,
&AD7124_ATY_Cfg_NTC10_1, &AD7124_ATY_Dev_1);
AD7124_ReadData(group_AD7124_Data, &AD7124_ATY_Dev_1);
AD7124_Calc(group_AD7124_Data);
AD7124_ReadData(group_AD7124_Data, &AD7124_ATY_Dev_1);
AD7124_Calc(group_AD7124_Data);
break;
case 5:
case 6:
AD7124_Calibrate(AD7124_CALIBRATE_INT_FULL | AD7124_CALIBRATE_INT_ZERO,
&AD7124_ATY_Cfg_TC_1, &AD7124_ATY_Dev_1);
AD7124_ReadData(group_AD7124_Data, &AD7124_ATY_Dev_1);
AD7124_Calc(group_AD7124_Data);
AD7124_ReadData(group_AD7124_Data, &AD7124_ATY_Dev_1);
AD7124_Calc(group_AD7124_Data);
break;
default:
break;
}
}
*/
/* calc
// IC Temp
fastTempCalc = ((float)(ad7124Code - 0x800000) / 13584.0) - 272.5;
// RTD4
calcRes = AD7124_DataToRes(ad7124Code, 24, 5110.0, 16);
fastTempCalc = ALGO_Temp_RTD_Res_Fast(calcRes);
aboveTempCalc = ALGO_Temp_RTD_Res_Above(calcRes);
belowTempCalc = ALGO_Temp_RTD_Res_Below(calcRes);
// NTC1K
calcRes = AD7124_DataToRes(ad7124Code, 24, 5110.0, 2);
fastTempCalc = ALGO_ResToKelvinTemp((calcRes / 1000.0), 1.0, 3950);
// NTC10K
calcVol = (((float)ad7124Code - 8388608.0) * 2500.0 / (1.0 * 8388608.0));
calcRes = ((calcVol * 10.0) / (2500.0 - calcVol));
fastTempCalc = ALGO_ResToKelvinTemp(calcRes, 10.0, 3380);
// TC
calcVol = (((float)ad7124Code - 8388608.0) * 2500.0 / (128.0 * 8388608.0));
float coldTemp = 25.0;
float calcVolCold = ALGO_Temp_TC_TempToVol('T', coldTemp);
calcVol += calcVolCold;
aboveTempCalc = ALGO_Temp_TC_VolToTemp('T', calcVol);
belowTempCalc = ALGO_Temp_TC_VolToTemp('T', calcVol);
fastTempCalc = aboveTempCalc;
*/
/******************************************************************************/
/******************************** End Of File *********************************/