/** * @file AD5933_ATY.c * * @param Project DEVICE_GENERAL_ATY_LIB * * @author ATY * * @copyright * - Copyright 2017 - 2025 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 Familiar functions of AD5933 for all embedded device * * @version * - 1_01_24015 > ATY * -# Preliminary version, first Release ******************************************************************************** */ #ifndef __AD5933_ATY_C #define __AD5933_ATY_C #include "AD5933_ATY.h" /******************************* For user *************************************/ /******************************************************************************/ uint8_t AD5933_Write(uint8_t addr, uint8_t* data_t, uint8_t len, struct AD5933_ATY_Dev* dev) { uint8_t errCode = 0; __ATY_LOCK(dev); errCode = dev->i2cProcess(dev->addr, data_t, len, _ATY_RW_W); __ATY_UNLOCK(dev); return errCode; } uint8_t AD5933_Read(uint8_t addr, uint8_t* data_t, uint8_t len, struct AD5933_ATY_Dev* dev) { uint8_t errCode = 0; __ATY_LOCK(dev); errCode = dev->i2cProcess(dev->addr, data_t, len, _ATY_RW_R); __ATY_UNLOCK(dev); return errCode; } uint8_t AD5933_WriteReg(uint8_t reg, uint8_t data, struct AD5933_ATY_Dev* dev) { uint8_t errCode = 0; uint8_t data_t[2] = {reg, data}; errCode = AD5933_Write(dev->addr, data_t, 2, dev); return errCode; } uint8_t AD5933_ReadReg(uint8_t reg, uint8_t* data, struct AD5933_ATY_Dev* dev) { uint8_t errCode = 0; uint8_t data_t[2] = {reg, 0xB0}; errCode = AD5933_Write(dev->addr, data_t, 2, dev); errCode = AD5933_Read(dev->addr, data_t, 2, dev); *data = data_t[1]; return errCode; } void AD5933_Init(struct AD5933_ATY_Dev* dev) { // Transmit to start frequency register // program 30khz start frequency assuming internal osc of 16.776Khz AD5933_WriteReg(0x84, 0x45, dev); AD5933_WriteReg(0x83, 0xA6, dev); AD5933_WriteReg(0x82, 0x0E, dev); // Transmit to frequency increment register // program 1Khz frequency increment assuming internal osc of 16.776Khz AD5933_WriteReg(0x87, 0x02, dev); AD5933_WriteReg(0x86, 0x7D, dev); AD5933_WriteReg(0x85, 0x00, dev); // Transmit to NUMBER OF INCREMENTS register // program 10 frequency increments AD5933_WriteReg(0x89, 0x0A, dev); AD5933_WriteReg(0x88, 0x00, dev); // Transmit to settling time cycles register // program 15 output cycles at each frequency before a adc conversion AD5933_WriteReg(0x8B, 0x0F, dev); AD5933_WriteReg(0x8A, 0x00, dev); // Transmit to CONTROL register // place the AD5933 in standby mode AD5933_WriteReg(0x80, 0xB0, dev); // Choose the internal system clock AD5933_WriteReg(0x81, 0x00, dev); // Choose range 1 (2vp-p, 1.6v) PGA = x1 AD5933_WriteReg(0x80, 0x01, dev); // initialise the sensor with contents of start frequency regsister with range 1 (2vp-p, 1.6v) PGA = x1 AD5933_WriteReg(0x80, 0x10, dev); // start of frequency swee, devp (2vp-p, 1.6v) PGA = x1 AD5933_WriteReg(0x80, 0x20, dev); // initialise the sweep sequence AD5933_Measure(dev); // //issue a measure temperature command to the control register // AD5933_WriteReg(0x80, 0x90, dev); // // read the temperature data and send to uart // Measure_Temp(dev); } // status reg D0 = valid temp, D1 = valid real/imag data, D2 = frequency sweep complete void AD5933_Measure(struct AD5933_ATY_Dev* dev) { while(1){ // D1 status reg loop uint8_t status = 0; AD5933_ReadReg(0x8F, &status, dev); status = (status & 0x02); // mask off the valid data bit for(uint16_t i = 0; i < 10000; i++){} // printf("Status: %02X\r\n", status); if(((status) | 0xFD) == 0xFF) // valid data should be present after start freqy command { // D1 true condition AD5933_ReadReg(0x8F, &status, dev); if((status | 0xFB) != 0xFF)// D2 test condition { uint8_t real_byte_high = 0, real_byte_low = 0, imag_byte_high = 0, imag_byte_low = 0; AD5933_ReadReg(0x94, &real_byte_high, dev); AD5933_ReadReg(0x95, &real_byte_low, dev); AD5933_ReadReg(0x96, &imag_byte_high, dev); AD5933_ReadReg(0x97, &imag_byte_low, dev); uint16_t real_data = ((real_byte_high << 8) | real_byte_low); uint16_t imag_data = ((imag_byte_high << 8) | imag_byte_low); // printf("Original real register = 0x%02x\r\n", (unsigned int)((unsigned short)real_data)); // printf("Orocessed real register = %d(decimal equivilant)\r\n", (int)real_data); // printf("Original imag register = 0x%02X\r\n", (unsigned int)((unsigned short)imag_data)); // printf("Orocessed imag register = %d(decimal equivilant)\r\n", (int)imag_data); printf("%d %d\r\n", (uint16_t)real_data, (uint16_t)imag_data); // increment to the next frequency status = 0x30; AD5933_WriteReg(0x80, status, dev); } else // End of frequency sweep exit loop { // printf("Status: %02X\r\n", status); // printf("end sweep\r\n"); break; } } } } #endif /* __AD5933_ATY_C */ /************************************ etc *************************************/ // void LOG_ALL(uint8_t* str){ printf((const char*)str); } /* init */ // uint8_t AD5933_1_I2C(uint8_t addr, uint8_t* data_t, uint8_t len, uint8_t rw){ // if(rw == _ATY_RW_W) // return (uint8_t)HAL_I2C_Master_Transmit(&hi2c1, (addr << 1 | 0), data_t, len, 1000); // else if(rw == _ATY_RW_R) // return (uint8_t)HAL_I2C_Master_Receive(&hi2c1, (addr << 1 | 1), data_t, len, 1000); // } // struct AD5933_ATY_Dev AD5933_ATY_t_1 = { // .addr = AD5933_ADDRESS, // .i2cProcess = AD5933_1_I2C, // .lock = _ATY_UNLOCKED, // .debugEnable = 0, // .LOG = printf // }; /* use */ // AD5933_SetValue(0xF0, &AD5933_ATY_t_1); // AD5933_GetValue(&getValue, &AD5933_ATY_t_1); /******************************************************************************/ /******************************** End Of File *********************************/