#include "FreeRTOS.h" #include "task.h" #include "gpio.h" #include "spi.h" #include "stm32f407xx.h" #include "utils.h" #include "ads1220.h" #include "dac7811.h" uint8_t RcvData[8]; long ADS1220RTDGainCorrection = 1; long ADS1220TCGainCorrection = 1; BOOL ads1220_spi_init_flag = FALSE; // void test1() // { // static uint32_t count = 0; // while(1) // { // count = 10000; // HAL_GPIO_WritePin(GPIOC, GPIO_PIN_4, GPIO_PIN_SET); // while(!(count--)); // HAL_GPIO_WritePin(GPIOC, GPIO_PIN_4, GPIO_PIN_RESET); // } // } static void ads1220_cs(cs_state_type state) { if (state == CS_L) { ADS1220_CS(GPIO_PIN_RESET); } else { ADS1220_CS(GPIO_PIN_SET); } } static void fun_ads1220_spi1_init(void) { hspi1.Instance = SPI1; hspi1.Init.Mode = SPI_MODE_MASTER; hspi1.Init.Direction = SPI_DIRECTION_2LINES; hspi1.Init.DataSize = SPI_DATASIZE_8BIT; hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; hspi1.Init.CLKPhase = SPI_PHASE_2EDGE; hspi1.Init.NSS = SPI_NSS_SOFT; hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8; hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; hspi1.Init.TIMode = SPI_TIMODE_DISABLE; hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; hspi1.Init.CRCPolynomial = 10; if (HAL_SPI_Init(&hspi1) != HAL_OK) { Error_Handler(); } ADS1220_CS(GPIO_PIN_RESET); //DAC7811_CS(GPIO_PIN_SET); } // static void spi_write_byte(uint8_t data) // { // HAL_SPI_Transmit(&hspi1, &data, 1, 1000); // } // static void spi_write_read_byte(uint8_t *pTxData, uint8_t *pRxData) // { // HAL_SPI_TransmitReceive(&hspi1, pTxData, pRxData, 1, 1000); // } HAL_StatusTypeDef ads1220spi_status_watch; static void spi_write_read(uint8_t *pTxData, uint8_t *pRxData, uint16_t Size) { ads1220spi_status_watch = HAL_SPI_TransmitReceive(&hspi1, pTxData, pRxData, Size, 1000); } static void ads1220_write_regs(uint8_t *writeValues, uint8_t startReg, uint8_t length) { uint8_t outData[5]; uint8_t i; outData[0] = ADS1220_WRITE_CMD(startReg, length); // 该命令为告诉芯片写入寄存器,并且告知长度和初始寄存器位置 for (i = 0; i < length; i++) { outData[i + 1] = writeValues[i]; } spi_write_read(outData, RcvData, length + 1); // Add 1 to length for command byte } /* static void ads1220_read_regs(uint8_t *readValues, uint8_t startReg, uint8_t length) { uint8_t outData[5] = {0x55, 0x55, 0x55, 0x55, 0x55}; outData[0] = ADS1220_READ_CMD(startReg, length); spi_write_read(outData, readValues, length + 1); // 第一位作为命令数据 } */ //static void ads1220_send_read_data_command(void) //{ // uint8_t cmd = ADS1220_RDATA_CMD; // spi_write_read(&cmd, RcvData, 1); //} static void setup_ads1220(uint8_t inputMux, uint8_t opMode, uint8_t conversionMode, uint8_t dataRate, uint8_t gainLevel, uint8_t pgaBypass, uint8_t routeIDAC1, uint8_t routeIDAC2, uint8_t idacCurrent, uint8_t selectVref, uint8_t intTempSensor) { uint8_t config[4]; config[0] = inputMux + gainLevel + pgaBypass; config[1] = dataRate + opMode + conversionMode + intTempSensor + ADS1220_BURN_OUT_CURRENT_OFF; config[2] = ADS1220_FIR_50_60 + selectVref + ADS1220_LOW_SIDE_POWER_OPEN + idacCurrent; config[3] = routeIDAC1 + routeIDAC2 + ADS1220_DRDY_ON_DRDY_ONLY; ads1220_write_regs(config, ADS1220_CONFIG_0_REG, 4); } /*一般单次转换时候采集时候使用的代码 if(!Read_DRDY){//当检测到数据可读时 ads1220_get_conversion_data(ADC1220.DigitValue);//启动读取函数 ADS1220_Start();//及时发送一个下一次转换的信号 ADC1220.AllDigit = (ADC1220.DigitValue[1]<<16)+(ADC1220.DigitValue[2]<<8)+ADC1220.DigitValue[3];//合并分开的24位数据 if(ADC1220.DigitValue[1] < 0x80){//正负号判断 ADC1220.AnalogValue = ((ADC1220.AllDigit)*VRef/0x800000); } else{ ADC1220.AnalogValue = (-1)*((0xffffff-ADC1220.AllDigit)*VRef/0x800000); } */ /*ADS1220配置*/ /*输入: inputMux :输入多路复用器配置(对于AINn=AVSS的设置,PGA必须(PGA_BYPASS=1),并且仅可使用增益1,2,4) ADS1220_MUX_AIN0_AIN1 ADS1220_MUX_AIN0_AIN2 ADS1220_MUX_AIN0_AIN3 ADS1220_MUX_AIN1_AIN2 ADS1220_MUX_AIN1_AIN3 ADS1220_MUX_AIN2_AIN3 ADS1220_MUX_AIN1_AIN0 ADS1220_MUX_AIN3_AIN2 ADS1220_MUX_AIN0_AVSS ADS1220_MUX_AIN1_AVSS ADS1220_MUX_AIN2_AVSS ADS1220_MUX_AIN3_AVSS ADS1220_MUX_REFP-REFN ADS1220_MUX_AVDD-AVSS ADS1220_MUX_SHORTED opMode: 工作模式选择 ADS1220_OP_MODE_NORMAL 正常模式(256kHz 调制时钟 默认设置) ADS1220_OP_MODE_DUTY 占空比模式(内部占空比1:4) ADS1220_OP_MODE_TURBO Turbo模式 (512kHz调制时钟) conversionMode: 转换模式 ADS1220_CONVERSION_SINGLE_SHOT 单次 ADS1220_CONVERSION_CONTINUOUS 连续 dateRate:数据速率(详见说明书表18) ADS1220_DATA_RATE_20SPS ADS1220_DATA_RATE_45SPS ADS1220_DATA_RATE_90SPS ADS1220_DATA_RATE_175SPS ADS1220_DATA_RATE_330SPS ADS1220_DATA_RATE_600SPS ADS1220_DATA_RATE_1000SPS gainLevel:增益配置(在不使用PGA的情况下,可使用增益1,2,4.在这种情况下,通过开关电容结构获得增益) ADS1220_GAIN_1 ADS1220_GAIN_2 ADS1220_GAIN_4 ADS1220_GAIN_8 ADS1220_GAIN_16 ADS1220_GAIN_32 ADS1220_GAIN_64 ADS1220_GAIN_128 pgaBypass:禁止/启用可编程增益放大器(PGA) ADS1220_USE_PGA 启用 ADS1220_PGA_BYPASS 禁用 routeIDAC1:选择IDAC1将路由到的通道 ADS1220_IDAC1_DISABLED ADS1220_IDAC1_AIN0 ADS1220_IDAC1_AIN1 ADS1220_IDAC1_AIN2 ADS1220_IDAC1_AIN3 ADS1220_IDAC1_REFP ADS1220_IDAC1_REFN routeIDAC2:选择IDAC2将路由到的通道 ADS1220_IDAC2_DISABLED ADS1220_IDAC2_AIN0 ADS1220_IDAC2_AIN1 ADS1220_IDAC2_AIN2 ADS1220_IDAC2_AIN3 ADS1220_IDAC2_REFP ADS1220_IDAC2_REFN idacCurrent:IDAC电流设置 ADS1220_IDAC_CURRENT_OFF ADS1220_IDAC_CURRENT_10_UA ADS1220_IDAC_CURRENT_50_UA ADS1220_IDAC_CURRENT_100_UA ADS1220_IDAC_CURRENT_250_UA ADS1220_IDAC_CURRENT_500_UA ADS1220_IDAC_CURRENT_1000_UA ADS1220_IDAC_CURRENT_1500_UA selectVref:基准电压选择 ADS1220_VREF_INTERNAL 选择2.048V的内部基准电压(默认) ADS1220_VREF_EXT_REF0_PINS 使用专用REFP0和REFN0输入选择的外部基准电压 ADS1220_VREF_EXT_REF1_PINS 使用AIN0/REFP1和AIN3/REFN1输入选择的外部基准电压 ADS1220_VREF_AVDD 做基准的模拟电源(AVDD-AVSS) intTempSensor:温度传感器模式 0:禁用 1:启用 */ //static void ads1220_init(void) //{ // setup_ads1220( // ADS1220_MUX_AIN0_AIN1, // 输入多路复用器配置 // ADS1220_OP_MODE_NORMAL, // 工作模式选择 // ADS1220_CONVERSION_SINGLE_SHOT, // 转换模式 // ADS1220_DATA_RATE_45SPS, // 数据速率 // ADS1220_GAIN_1, // 增益配置 // ADS1220_PGA_BYPASS, // 禁止/启用可编程增益放大器 // ADS1220_IDAC1_DISABLED, // 选择IDAC1将路由到的通道 // ADS1220_IDAC2_DISABLED, // 选择IDAC2将路由到的通道 // ADS1220_IDAC_CURRENT_OFF, // IDAC电流设置 // ADS1220_VREF_EXT_REF0_PINS, // 基准电压选择 // ADS1220_TEMP_SENSOR_OFF); // 温度传感器 //} static void ads1220_reset(void) { uint8_t cmd = ADS1220_RESET_CMD; spi_write_read(&cmd, RcvData, 1); } static void ads1220_start(void) { uint8_t cmd = ADS1220_START_CMD; spi_write_read(&cmd, RcvData, 1); } //static void ads1220_powerdown(void) //{ // uint8_t cmd = ADS1220_POWERDOWN_CMD; // spi_write_read(&cmd, RcvData, 1); //} static void ads1220_get_conversion_data(float32 *conversionData) { uint8_t out_data[3] = {0xff, 0xff, 0xff}; uint8_t in_data[3] = {0}; long data = 0; spi_write_read(out_data, in_data, 3); data = (((long)in_data[0] << 16) + ((long)in_data[1] << 8) + (long)in_data[2]); if (data & 0x800000) { data ^= 0x00FFFFFF; data += 1; } //mv *conversionData = 1000 * (float32)data * 2.5f / 8388608; } //static void ads1220_get_rtd_conversion_data_calibrated(volatile long *code) //{ // uint8_t outData[3] = {0xff, 0xff, 0xff}; // uint8_t tempData[3]; // spi_write_read(outData, tempData, 3); // *code = (((long)tempData[0] << 16) + ((long)tempData[1] << 8) + (long)tempData[2]); // combine 3 Bytes of Conversion Data to 24 bit value // if (*code & 0x800000) // check if result is negative // { // *code ^= 0x00FFFFFF; // invert and make // *code += 1; // two's complement // } // *code = (long)((long long)(*code) * ADS1220RTDGainCorrection / 100000); // ADS1220 Gain correction //} void ads1220_operation(uint8_t channel, float32 *data_pv) { if (ads1220_spi_init_flag == FALSE) { ads1220_spi_init_flag = TRUE; dac7811_spi_init_flag = FALSE; fun_ads1220_spi1_init(); } ads1220_cs(CS_L); vTaskDelay(10); // if (channel == CH2_OUT_CUR) // { // ads1220_reset(); // vTaskDelay(5); // setup_ads1220( // ADS1220_MUX_AIN2_AVSS, // 输入多路复用器配置 // ADS1220_OP_MODE_NORMAL, // 工作模式选择 // ADS1220_CONVERSION_SINGLE_SHOT, // 转换模式 // ADS1220_DATA_RATE_45SPS, // 数据速率 // ADS1220_GAIN_1, // 增益配置 // ADS1220_PGA_BYPASS, // 禁止/启用可编程增益放大器 // ADS1220_IDAC1_DISABLED, // 选择IDAC1将路由到的通道 // ADS1220_IDAC2_DISABLED, // 选择IDAC2将路由到的通道 // ADS1220_IDAC_CURRENT_OFF, // IDAC电流设置 // ADS1220_VREF_EXT_REF0_PINS, // 基准电压选择 // ADS1220_TEMP_SENSOR_OFF); // 温度传感器 // vTaskDelay(5); // ads1220_start(); // vTaskDelay(30); // ads1220_get_conversion_data(data_pv); // } // else if (channel == CH10_IN_TC) // { ads1220_reset(); vTaskDelay(5); setup_ads1220( ADS1220_MUX_AIN0_AIN1, // 输入多路复用器配置 ADS1220_OP_MODE_NORMAL, // 工作模式选择 ADS1220_CONVERSION_SINGLE_SHOT, // 转换模式* ADS1220_DATA_RATE_45SPS, // 数据速率* ADS1220_GAIN_1, // 增益配置* ADS1220_PGA_BYPASS, // 禁止/启用可编程增益放大器 ADS1220_IDAC1_DISABLED, // 选择IDAC1将路由到的通道 ADS1220_IDAC2_DISABLED, // 选择IDAC2将路由到的通道 ADS1220_IDAC_CURRENT_OFF, // IDAC电流设置 ADS1220_VREF_EXT_REF0_PINS, // 基准电压选择* ADS1220_TEMP_SENSOR_OFF); // 温度传感器 vTaskDelay(5); ads1220_start(); vTaskDelay(30); ads1220_get_conversion_data(data_pv); // } ads1220_cs(CS_H); vTaskDelay(5); }