/* ********************************************************************************************************* * 功能说明: 写指定的寄存器 * 形 参: _RegID : 寄存器ID * _RegValue : 寄存器值。 对于8位的寄存器,取32位形参的低8bit * 返 回 值: 无 ********************************************************************************************************* */ void TM7705_WriteReg(unsigned char _RegID, unsigned long _RegValue) { unsigned char bits; switch (_RegID) { case REG_COMM: /* 通信寄存器 */ case REG_SETUP: /* 设置寄存器 8bit */ case REG_CLOCK: /* 时钟寄存器 8bit */ bits = 8; break; case REG_ZERO_CH1: /* CH1 偏移寄存器 24bit */ case REG_FULL_CH1: /* CH1 满量程寄存器 24bit */ case REG_ZERO_CH2: /* CH2 偏移寄存器 24bit */ case REG_FULL_CH2: /* CH2 满量程寄存器 24bit*/ bits = 24; break; case REG_DATA: /* 数据寄存器 16bit */ default: return; } TM7705_WriteByte(_RegID | WRITE); /* 写通信寄存器, 指定下一步是写操作,并指定写哪个寄存器 */ if (bits == 8) { TM7705_WriteByte((unsigned char)_RegValue); } else { //24 bits TM7705_Write3Byte(_RegValue); } }
/* ********************************************************************************************************* * 函 数 名: TM7705_SytemCalibFull * 功能说明: 启动系统校准满位. 请将AIN+ AIN-接最大输入电压源,执行该函数。校准应该由主程序控制并保存校准参数。 * 执行完毕后。可以通过 TM7705_ReadReg(REG_FULL_CH1) 和 TM7705_ReadReg(REG_FULL_CH2) 读取校准参数。 * 形 参: _ch : ADC通道,1或2 * 返 回 值: 无 ********************************************************************************************************* */ void TM7705_SytemCalibFull(unsigned char _ch) { if (_ch == 1) { /* 校准CH1 */ TM7705_WriteByte(REG_SETUP | WRITE | CH_1); /* 写通信寄存器,下一步是写设置寄存器,通道1 */ TM7705_WriteByte(MD_CAL_FULL | __CH1_GAIN_BIPOLAR_BUF | FSYNC_0);/* 启动自校准 */ TM7705_WaitDRDY(); /* 等待内部操作完成 */ } else if (_ch == 2) { /* 校准CH2 */ TM7705_WriteByte(REG_SETUP | WRITE | CH_2); /* 写通信寄存器,下一步是写设置寄存器,通道2 */ TM7705_WriteByte(MD_CAL_FULL | __CH2_GAIN_BIPOLAR_BUF | FSYNC_0); /* 启动自校准 */ TM7705_WaitDRDY(); /* 等待内部操作完成 */ } }
/* ********************************************************************************************************* * 函 数 名: TM7705_CalibSelf * 功能说明: 启动自校准. 内部自动短接AIN+ AIN-校准0位,内部短接到Vref 校准满位。此函数执行过程较长, * 实测约 180ms * 形 参: _ch : ADC通道,1或2 * 返 回 值: 无 ********************************************************************************************************* */ void TM7705_CalibSelf(unsigned char _ch) { if (_ch == 1) { /* 自校准CH1 */ TM7705_WriteByte(REG_SETUP | WRITE | CH_1); /* 写通信寄存器,下一步是写设置寄存器,通道1 */ TM7705_WriteByte(MD_CAL_SELF | __CH1_GAIN_BIPOLAR_BUF | FSYNC_0);/* 启动自校准 */ TM7705_WaitDRDY(); /* 等待内部操作完成 --- 时间较长,约180ms */ } else if (_ch == 2) { /* 自校准CH2 */ TM7705_WriteByte(REG_SETUP | WRITE | CH_2); /* 写通信寄存器,下一步是写设置寄存器,通道2 */ TM7705_WriteByte(MD_CAL_SELF | __CH2_GAIN_BIPOLAR_BUF | FSYNC_0); /* 启动自校准 */ TM7705_WaitDRDY(); /* 等待内部操作完成 --- 时间较长,约180ms */ } }
/* ********************************************************************************************************* * 函 数 名: TM7705_CalibSelf * 功能说明: 启动自校准. 内部自动短接AIN+ AIN-校准0位,内部短接到Vref 校准满位。此函数执行过程较长, * 实测约 180ms * 形 参: _ch : ADC通道,1或2 * 返 回 值: 无 ********************************************************************************************************* */ void ICACHE_FLASH_ATTR TM7705_CalibSelf(uint8_t _ch) { if (_ch == 1){ /* 自校准CH1 */ TM7705_WriteByte(REG_SETUP | WRITE | CH_1); /* 写通信寄存器,下一步是写设置寄存器,通道1 */ TM7705_WriteByte(MD_CAL_SELF | __CH1_GAIN_BIPOLAR_BUF | FSYNC_0);/* 启动自校准 */ TM7705_WaitDRDY(); /* 等待内部操作完成 --- 时间较长,约180ms */ } else if (_ch == 2){ /* 自校准CH2 */ TM7705_WriteByte(REG_SETUP | WRITE | CH_2); /* 写通信寄存器,下一步是写设置寄存器,通道2 */ TM7705_WriteByte(MD_CAL_SELF | __CH2_GAIN_BIPOLAR_BUF | FSYNC_0); /* 启动自校准 */ TM7705_WaitDRDY(); /* 等待内部操作完成 --- 时间较长,约180ms */ } os_printf("TM7705_CalibSelf %d\r\n", _ch); }
/* ********************************************************************************************************* * 函 数 名: TM7705_ReadAdc1 * 功能说明: 读通道1或2的ADC数据 * 形 参: 无 * 返 回 值: 无 ********************************************************************************************************* */ uint16_t ICACHE_FLASH_ATTR TM7705_ReadAdc(u8 _ch) { u8 i; u16 read = 0; /* 为了避免通道切换造成读数失效,读2次 */ for (i = 0; i < 2; i++){ TM7705_WaitDRDY(); /* 等待DRDY口线为0 */ if (_ch == 1){ TM7705_WriteByte(0x38); }else if (_ch == 2){ TM7705_WriteByte(0x39); } read = TM7705_Read2Byte(); } return read; }
/* ********************************************************************************************************* * 函 数 名: TM7705_SytemCalibZero * 功能说明: 启动系统校准零位. 请将AIN+ AIN-短接后,执行该函数。校准应该由主程序控制并保存校准参数。 * 执行完毕后。可以通过 TM7705_ReadReg(REG_ZERO_CH1) 和 TM7705_ReadReg(REG_ZERO_CH2) 读取校准参数。 * 形 参: _ch : ADC通道,1或2 * 返 回 值: 无 ********************************************************************************************************* */ void ICACHE_FLASH_ATTR TM7705_SytemCalibZero(uint8_t _ch) { if (_ch == 1) { /* 校准CH1 */ TM7705_WriteByte(REG_SETUP | WRITE | CH_1); /* 写通信寄存器,下一步是写设置寄存器,通道1 */ TM7705_WriteByte(MD_CAL_ZERO | __CH1_GAIN_BIPOLAR_BUF | FSYNC_0);/* 启动自校准 */ TM7705_WaitDRDY(); /* 等待内部操作完成 */ } else if (_ch == 2) { /* 校准CH2 */ TM7705_WriteByte(REG_SETUP | WRITE | CH_2); /* 写通信寄存器,下一步是写设置寄存器,通道1 */ TM7705_WriteByte(MD_CAL_ZERO | __CH2_GAIN_BIPOLAR_BUF | FSYNC_0); /* 启动自校准 */ TM7705_WaitDRDY(); /* 等待内部操作完成 */ } }
/* ********************************************************************************************************* * 函 数 名: TM7705_ReadAdc * 功能说明: 读通道1或2的ADC数据 * 形 参: _ch : ADC通道,1或2 * 返 回 值: 0 ~ 65535 ********************************************************************************************************* */ unsigned short TM7705_ReadAdc(unsigned char _ch) { unsigned char i; unsigned short read = 0; /* 为了避免通道切换造成读数失效,读3次 */ for (i = 0; i < 3; i++) { TM7705_WaitDRDY(); /* 等待DRDY口线为0 */ if (_ch == 1) { TM7705_WriteByte(0x38); } else if (_ch == 2) { TM7705_WriteByte(0x39); } read = TM7705_Read2Byte(); } return read; }
//初始化 void TM7705_Init() { TM7705_ResetHard(); /* 硬件复位 */ DelayMs(5); TM7705_SyncSPI(); /* 同步SPI接口时序 */ DelayMs(5); /* 配置时钟寄存器 */ /* 先写通信寄存器,下一步是写时钟寄存器 */ TM7705_WriteByte(REG_CLOCK | WRITE | CH_1); /* 使能外部晶振,刷新速率50Hz */ TM7705_WriteByte(CLKDIS_0 | CLK_4_9152M | FS_50HZ); //TM7705_WriteByte(CLKDIS_0 | CLK_4_9152M | FS_500HZ); /* 刷新速率500Hz */ /* 每次上电进行一次自校准 */ TM7705_CalibSelf(1); /* 内部自校准 CH1 */ //TM7705_CalibSelf(2); /* 内部自校准 CH2 */ DelayMs(5); }
/* ********************************************************************************************************* * 函 数 名: bsp_InitTM7705 * 功能说明: 配置STM32的GPIO和SPI接口,用于连接 TM7705 * 形 参: 无 * 返 回 值: 无 ********************************************************************************************************* */ void ICACHE_FLASH_ATTR bsp_InitTM7705(void) { bsp_DelayMS(10); TM7705_ResetHard(); /* 硬件复位 */ /* 在接口序列丢失的情况下,如果在DIN 高电平的写操作持续了足够长的时间(至少 32个串行时钟周期), TM7705 将会回到默认状态。 */ bsp_DelayMS(5); TM7705_SyncSPI(); /* 同步SPI接口时序 */ bsp_DelayMS(5); /* 配置时钟寄存器 */ TM7705_WriteByte(REG_CLOCK | WRITE | CH_1); /* 先写通信寄存器,下一步是写时钟寄存器 */ TM7705_WriteByte(CLKDIS_0 | CLK_4_9152M | FS_50HZ); /* 刷新速率50Hz */ //TM7705_WriteByte(CLKDIS_0 | CLK_4_9152M | FS_500HZ); /* 刷新速率500Hz */ }
/* ********************************************************************************************************* * 功能说明: 读指定的寄存器 * 形 参: _RegID : 寄存器ID * _RegValue : 寄存器值。 对于8位的寄存器,取32位形参的低8bit * 返 回 值: 读到的寄存器值。 对于8位的寄存器,取32位形参的低8bit ********************************************************************************************************* */ unsigned long TM7705_ReadReg(unsigned char _RegID) { unsigned char bits; unsigned long read; switch (_RegID) { case REG_COMM: /* 通信寄存器 */ case REG_SETUP: /* 设置寄存器 8bit */ case REG_CLOCK: /* 时钟寄存器 8bit */ bits = 8; break; case REG_ZERO_CH1: /* CH1 偏移寄存器 24bit */ case REG_FULL_CH1: /* CH1 满量程寄存器 24bit */ case REG_ZERO_CH2: /* CH2 偏移寄存器 24bit */ case REG_FULL_CH2: /* CH2 满量程寄存器 24bit*/ bits = 24; break; case REG_DATA: /* 数据寄存器 16bit */ default: return 0xFFFFFFFF; } TM7705_WriteByte(_RegID | READ); /* 写通信寄存器, 指定下一步是写操作,并指定写哪个寄存器 */ if (bits == 16) { read = TM7705_Read2Byte(); } else if (bits == 8) { read = TM7705_ReadByte(); } else { // 24 bits read = TM7705_Read3Byte(); } return read; }