取32位形参的低8bit* 返回值:无**********************************************************************************************************/voidTM7705_WriteReg(uint8_t_RegID,uint32_t_RegValue){ uint8_tbits; switch(_RegID) { caseREG_COMM: /*通信寄存器*/ caseREG_SETUP: /*设置寄存器8bit*/ caseREG_CLOCK: /*时钟寄存器8bit*/ bits=8; break; caseREG_ZERO_CH1: /*CH1偏移寄存器24bit*/ caseREG_FULL_CH1: /*CH1满量程寄存器24bit*/ caseREG_ZERO_CH2: /*CH2偏移寄存器24bit*/ caseREG_FULL_CH2: /*CH2满量程寄存器24bit*/ bits=24; break; caseREG_DATA: /*数据寄存器16bit*/ default: return; } TM7705_WriteByte(_RegID|WRITE); /*写通信寄存器,指定下一步是写操作,通道1*/ TM7705_WriteByte(MD_CAL_FULL|__CH2_GAIN_BIPOLAR_BUF|FSYNC_0); /*启动自校准*/ TM7705_WaitDRDY(); /*等待内部操作完成*/ }}/*********************************************************************************************************** 函数名:TM7705_ReadAdc1* 功能说明:读通道1或2的ADC数据* 形 参:无* 返回值:无**********************************************************************************************************/uint16_tTM7705_ReadAdc(uint8_t_ch){ uint8_ti; uint16_tread=0; /*为了避免通道切换造成读数失效,* 实测约180ms* 形 参: _ch:ADC通道,约180ms*/ } elseif(_ch==2) { /*自校准CH2*/ TM7705_WriteByte(REG_SETUP|WRITE|CH_2); /*写通信寄存器,下一步是写设置寄存器。
* 形 参:_data:数据* 返回值:无**********************************************************************************************************/staticvoidTM7705_Send8Bit(uint8_t_data){ uint8_ti; for(i=0;i<8;i ) { if(_data0x80) { DI_1(); } else { DI_0(); } SCK_0(); _data<<=1; TM7705_Delay(); SCK_1(); TM7705_Delay(); }}/*********************************************************************************************************** 函数名:TM7705_Recive8Bit* 功能说明:从SPI总线接收8个bit数据,不带CS控制,* 执行完毕后,* 形 参:无* 返回值:无**********************************************************************************************************/staticuint8_tTM7705_Recive8Bit(void){ uint8_ti; uint8_tread=0; for(i=0;i<8;i ) { SCK_0(); TM7705_Delay(); read=read<<1; if(DO_IS_HIGH()) { read ; } SCK_1(); TM7705_Delay(); } returnread;}/*********************************************************************************************************** 函数名:TM7705_WriteByte* 功能说明:写入1个字节, */ delay_ms(5); TM7705_SyncSPI(); /*同步SPI接口时序*/ delay_ms(5); /*配置时钟寄存器*/ TM7705_WriteByte(REG_CLOCK|WRITE|CH_1); /*先写通信寄存器,通道1*/ TM7705_WriteByte(MD_CAL_SELF|__CH1_GAIN_BIPOLAR_BUF|FSYNC_0);/*启动自校准*/ TM7705_WaitDRDY(); /*等待内部操作完成---时间较长,下一步是写设置寄存器,可以通过TM7705_ReadReg(REG_FULL_CH1)和 TM7705_ReadReg(REG_FULL_CH2)读取校准参数,内部短接到Vref校准满位
通道1*/ TM7705_WriteByte(MD_CAL_ZERO|__CH2_GAIN_BIPOLAR_BUF|FSYNC_0); /*启动自校准*/ TM7705_WaitDRDY(); /*等待内部操作完成*/ }}/*********************************************************************************************************** 函数名:TM7705_SytemCalibFull* 功能说明:启动系统校准满位.请将AIN AIN-接最大输入电压源
强烈建议将时钟寄存器设为84H,此时数据输出更新率为10Hz,即每0.1S输出一个新数据, TM7705将会回到默认状态,需要等待,下一步是写时钟寄存器*/ TM7705_WriteByte(CLKDIS_0|CLK_4_9152M|FS_50HZ); /*刷新速率50Hz*/ //TM7705_WriteByte(CLKDIS_0|CLK_4_9152M|FS_500HZ); /*刷新速率500Hz*/ /*每次上电进行一次自校准*/ TM7705_CalibSelf(1); /*内部自校准CH1*/ delay_ms(5);}/*********************************************************************************************************** 函数名:TM7705_Delay* 功能说明:CLK之间的延迟,* 形 参:_ch:ADC通道,下一步是写设置寄存器,校准应该由主程序控制并保存校准参数,对于8位的寄存器,1或2* 返回值:无**********************************************************************************************************/voidTM7705_SytemCalibFull(uint8_t_ch){ if(_ch==1) { /*校准CH1*/ TM7705_WriteByte(REG_SETUP|WRITE|CH_1); /*写通信寄存器,* 形 参: _ch:ADC通道,约180ms*/ }}/*********************************************************************************************************** 函数名:TM7705_SytemCalibZero* 功能说明:启动系统校准零位.请将AIN AIN-短接后,通道2*/ TM7705_WriteByte(MD_CAL_SELF|__CH2_GAIN_BIPOLAR_BUF|FSYNC_0); /*启动自校准*/ TM7705_WaitDRDY(); /*等待内部操作完成 ---时间较长。
执行该函数,复位后要延时500us再访问*/ CS_0(); TM7705_Send8Bit(0xFF); TM7705_Send8Bit(0xFF); TM7705_Send8Bit(0xFF); TM7705_Send8Bit(0xFF); CS_1();}/*********************************************************************************************************** 函数名:TM7705_Send8Bit* 功能说明:向SPI总线发送8个bit数据, TM7705模块 STM32F407开发板 SCK ------ PB3/SPI3_SCK DOUT ------ PB4/SPI3_MISO DIN ------ PB5/SPI3_MOSI CS ------ PF7/NRF24L01_CSN DRDY ------ PH7/NRF24L01_IRQ RST ------ PA4/NRF905_TX_EN/NRF24L01_CE/DAC1_OUT (复位RESET)*/#if!defined(SOFT_SPI)!defined(HARD_SPI) #error"PleasedefineSPIInterfacemode:SOFT_SPIorHARD_SPI"#endif#ifdefSOFT_SPI /*软件SPI*/ /*定义GPIO端口*/ #defineRCC_SCK RCC_APB2Periph_GPIOA #definePORT_SCK GPIOA #definePIN_SCK GPIO_Pin_0 #defineRCC_DIN RCC_APB2Periph_GPIOA #definePORT_DIN GPIOA #definePIN_DIN GPIO_Pin_1 #defineRCC_DOUT RCC_APB2Periph_GPIOA #definePORT_DOUT GPIOA #definePIN_DOUT GPIO_Pin_2 #defineRCC_CS RCC_APB2Periph_GPIOA #definePORT_CS GPIOA #definePIN_CS GPIO_Pin_3 #defineRCC_DRDY RCC_APB2Periph_GPIOA #definePORT_DRDY GPIOA #definePIN_DRDY GPIO_Pin_4 #defineRCC_RESET RCC_APB2Periph_GPIOA #definePORT_RESET GPIOA #definePIN_RESET GPIO_Pin_5 /*定义口线置0和置1的宏*/ #defineRESET_0() GPIO_ResetBits(PORT_RESET,PIN_RESET) #defineRESET_1() GPIO_SetBits(PORT_RESET,PIN_RESET) #defineCS_0() GPIO_ResetBits(PORT_CS,PIN_CS) #defineCS_1() GPIO_SetBits(PORT_CS,PIN_CS) #defineSCK_0() GPIO_ResetBits(PORT_SCK,PIN_SCK) #defineSCK_1() GPIO_SetBits(PORT_SCK,PIN_SCK) #defineDI_0() GPIO_ResetBits(PORT_DIN,PIN_DIN) #defineDI_1() GPIO_SetBits(PORT_DIN,PIN_DIN) #defineDO_IS_HIGH() (GPIO_ReadInputDataBit(PORT_DOUT,PIN_DOUT)==Bit_SET) #defineDRDY_IS_LOW() (GPIO_ReadInputDataBit(PORT_DRDY,PIN_DRDY)==Bit_RESET)#endif#ifdefHARD_SPI /*硬件SPI*/ ;#endif/*通信寄存器bit定义*/enum{ /*寄存器选择 RS2RS1RS0 */ REG_COMM =0x00, /*通信寄存器*/ REG_SETUP =0x10, /*设置寄存器*/ REG_CLOCK =0x20, /*时钟寄存器*/ REG_DATA =0x30, /*数据寄存器*/ REG_ZERO_CH1 =0x60, /*CH1偏移寄存器*/ REG_FULL_CH1 =0x70, /*CH1满量程寄存器*/ REG_ZERO_CH2 =0x61, /*CH2偏移寄存器*/ REG_FULL_CH2 =0x71, /*CH2满量程寄存器*/ /*读写操作*/ WRITE =0x00, /*写操作*/ READ =0x08, /*读操作*/ /*通道*/ CH_1 =0, /*AIN1 AIN1-*/ CH_2 =1, /*AIN2 AIN2-*/ CH_3 =2, /*AIN1- AIN1-*/ CH_4 =3 /*AIN1- AIN2-*/};/*设置寄存器bit定义*/enum{ MD_NORMAL =(0<<6), /*正常模式*/ MD_CAL_SELF =(1<<6), /*自校准模式*/ MD_CAL_ZERO =(2<<6), /*校准0刻度模式*/ MD_CAL_FULL =(3<<6), /*校准满刻度模式*/ GAIN_1 =(0<<3), /*增益*/ GAIN_2 =(1<<3), /*增益*/ GAIN_4 =(2<<3), /*增益*/ GAIN_8 =(3<<3), /*增益*/ GAIN_16 =(4<<3), /*增益*/ GAIN_32 =(5<<3), /*增益*/ GAIN_64 =(6<<3), /*增益*/ GAIN_128 =(7<<3), /*增益*/ /*无论双极性还是单极性都不改变任何输入信号的状态,如果在DIN高电平的写操作持续了足够长的时间(至少32个串行时钟周期),带CS控制* 形 参:_data:将要写入的数据* 返回值:无**********************************************************************************************************/staticvoidTM7705_WriteByte(uint8_t_data){ CS_0(); TM7705_Send8Bit(_data); CS_1();}/*********************************************************************************************************** 函数名:TM7705_Write3Byte* 功能说明:写入3个字节,它只改变输出数据的代码和转换函数上的校准点*/ BIPOLAR =(0<<2), /*双极性输入*/ UNIPOLAR =(1<<2), /*单极性输入*/ BUF_NO =(0<<1), /*输入无缓冲(内部缓冲器不启用)*/ BUF_EN =(1<<1), /*输入有缓冲(启用内部缓冲器)*/ FSYNC_0 =0, FSYNC_1 =1 /*不启用*/};/*时钟寄存器bit定义*/enum{ CLKDIS_0 =0x00, /*时钟输出使能(当外接晶振时,通道1*/ TM7705_WriteByte(MD_CAL_FULL|__CH1_GAIN_BIPOLAR_BUF|FSYNC_0);/*启动自校准*/ TM7705_WaitDRDY(); /*等待内部操作完成*/ } elseif(_ch==2) { /*校准CH2*/ TM7705_WriteByte(REG_SETUP|WRITE|CH_2); /*写通信寄存器,执行该函数,带CS控制* 形 参:_data:将要写入的数据* 返回值:无**********************************************************************************************************/staticvoidTM7705_Write3Byte(uint32_t_data){ CS_0(); TM7705_Send8Bit((_data>>16)0xFF); TM7705_Send8Bit((_data>>8)0xFF); TM7705_Send8Bit(_data); CS_1();}/*********************************************************************************************************** 函数名:TM7705_ReadByte* 功能说明:从AD芯片读取一个字(16位)* 形 参:无* 返回值:读取的字(16位)**********************************************************************************************************/staticuint8_tTM7705_ReadByte(void){ uint8_tread; CS_0(); read=TM7705_Recive8Bit(); CS_1(); returnread;}/*********************************************************************************************************** 函数名:TM7705_Read2Byte* 功能说明:读2字节数据* 形 参:无* 返回值:读取的数据(16位)**********************************************************************************************************/staticuint16_tTM7705_Read2Byte(void){ uint16_tread; CS_0(); read=TM7705_Recive8Bit(); read<<=8; read =TM7705_Recive8Bit(); CS_1(); returnread;}/*********************************************************************************************************** 函数名:TM7705_Read3Byte* 功能说明:读3字节数据* 形 参:无* 返回值:读取到的数据(24bit)高8位固定为0.**********************************************************************************************************/staticuint32_tTM7705_Read3Byte(void){ uint32_tread; CS_0(); read=TM7705_Recive8Bit(); read<<=8; read =TM7705_Recive8Bit(); read<<=8; read =TM7705_Recive8Bit(); CS_1(); returnread;}/*********************************************************************************************************** 函数名:TM7705_WaitDRDY* 功能说明:等待内部操作完成。
对于8位的寄存器,极性*/#define__CH1_GAIN_BIPOLAR_BUF (GAIN_1|UNIPOLAR|BUF_EN)#define__CH2_GAIN_BIPOLAR_BUF (GAIN_1|UNIPOLAR|BUF_EN)/* TM7705模块可以直接插到STM32-V5开发板nRF24L01模块的排母接口上,强烈建议将时钟寄存器设为80H,此时数据输出更新率为4Hz,即每0.25S输出一个新数据 */ ZERO_0 =0x84, ZERO_1 =0x80};staticvoidTM7705_SyncSPI(void);staticvoidTM7705_Send8Bit(uint8_t_data);staticuint8_tTM7705_Recive8Bit(void);staticvoidTM7705_WriteByte(uint8_t_data);staticvoidTM7705_Write3Byte(uint32_t_data);staticuint8_tTM7705_ReadByte(void);staticuint16_tTM7705_Read2Byte(void);staticuint32_tTM7705_Read3Byte(void);staticvoidTM7705_WaitDRDY(void);staticvoidTM7705_ResetHard(void);staticvoidTM7705_Delay(void);/*********************************************************************************************************** 函数名:bsp_InitTM7705* 功能说明:配置STM32的GPIO和SPI接口, 当使用主时钟为1MHz时,此函数执行过程较长,1或2* 返回值:无**********************************************************************************************************/voidTM7705_SytemCalibZero(uint8_t_ch){ if(_ch==1) { /*校准CH1*/ TM7705_WriteByte(REG_SETUP|WRITE|CH_1); /*写通信寄存器,不带CS控制,1或2* 返回值:无**********************************************************************************************************/voidTM7705_CalibSelf(uint8_t_ch){ if(_ch==1) { /*自校准CH1*/ TM7705_WriteByte(REG_SETUP|WRITE|CH_1); /*写通信寄存器, 1MHz(CLKDIV=0)或2MHz (CLKDIV=1),下一步是写设置寄存器,#include"bsp_tm7705.h"#include"delay.h"#include"usart.h"#defineSOFT_SPI /*定义此行表示使用GPIO模拟SPI接口*///#defineHARD_SPI /*定义此行表示使用CPU的硬件SPI接口*//*通道1和通道2的增益,输入缓冲,通道1*/ TM7705_WriteByte(MD_CAL_ZERO|__CH1_GAIN_BIPOLAR_BUF|FSYNC_0);/*启动自校准*/ TM7705_WaitDRDY(); /*等待内部操作完成*/ } elseif(_ch==2) { /*校准CH2*/ TM7705_WriteByte(REG_SETUP|WRITE|CH_2); /*写通信寄存器,并指定写哪个寄存器*/ if(bits==16) { read=TM7705_Read2Byte(); } elseif(bits==8) { read=TM7705_ReadByte(); } else /*24bit*/ { read=TM7705_Read3Byte(); } returnread;}/*********************************************************************************************************** 函数名:TM7705_CalibSelf* 功能说明:启动自校准.内部自动短接AIN AIN-校准0位,设置该位可以禁止MCK_OUT引脚输出时钟以省电*/ /* 2.4576MHz(CLKDIV=0)或为4.9152MHz(CLKDIV=1),校准应该由主程序控制并保存校准参数,* 执行完毕后,取32位形参的低8bit**********************************************************************************************************/uint32_tTM7705_ReadReg(uint8_t_RegID){ uint8_tbits; uint32_tread; switch(_RegID) { caseREG_COMM: /*通信寄存器*/ caseREG_SETUP: /*设置寄存器8bit*/ caseREG_CLOCK: /*时钟寄存器8bit*/ bits=8; break; caseREG_ZERO_CH1: /*CH1偏移寄存器24bit*/ caseREG_FULL_CH1: /*CH1满量程寄存器24bit*/ caseREG_ZERO_CH2: /*CH2偏移寄存器24bit*/ caseREG_FULL_CH2: /*CH2满量程寄存器24bit*/ bits=24; break; caseREG_DATA: /*数据寄存器16bit*/ default: return0xFFFFFFFF; } TM7705_WriteByte(_RegID|READ); /*写通信寄存器,指定下一步是写操作,对于8位的寄存器,时序延迟.用于STM32F407 168M主频* 形 参:无* 返回值:无**********************************************************************************************************/staticvoidTM7705_Delay(void){ uint16_ti; for(i=0;i<5;i );}/*********************************************************************************************************** 函数名:TM7705_ResetHard* 功能说明:硬件复位TM7705芯片* 形 参:无* 返回值:无**********************************************************************************************************/staticvoidTM7705_ResetHard(void){ RESET_1(); delay_ms(1); RESET_0(); delay_ms(2); RESET_1(); delay_ms(1);}/*********************************************************************************************************** 函数名:TM7705_SyncSPI* 功能说明:同步TM7705芯片SPI接口时序* 形 参:无* 返回值:无**********************************************************************************************************/staticvoidTM7705_SyncSPI(void){ /*AD7705串行接口失步后将其复位,* 形 参:无* 返回值:无**********************************************************************************************************/staticvoidTM7705_WaitDRDY(void){ uint32_ti; for(i=0;i<4000000;i ) { if(DRDY_IS_LOW()) { break; } } if(i>=4000000) {// printf("TM7705_WaitDRDY()TimeOut...\r\n"); /*调试语句.用语排错*/ }}/*********************************************************************************************************** 函数名:TM7705_WriteReg* 功能说明:写指定的寄存器* 形 参: _RegID:寄存器ID* _RegValue:寄存器值
用于连接TM7705* 形 参:无* 返回值:无**********************************************************************************************************/voidbsp_InitTM7705(void){ GPIO_InitTypeDefGPIO_InitStructure;#ifdefSOFT_SPI /*软件SPI*/ CS_1(); SCK_1(); DI_1(); /*打开GPIO时钟*/ RCC_APB2PeriphClockCmd(RCC_SCK|RCC_DIN|RCC_DOUT|RCC_CS|RCC_DRDY|RCC_RESET,ENABLE); /*配置几个推完输出IO*/ GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE); GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; /*设为输出口*/ GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; /*IO口最大速度*/ GPIO_InitStructure.GPIO_Pin=PIN_SCK; GPIO_Init(PORT_SCK,GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin=PIN_DIN; GPIO_Init(PORT_DIN,GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin=PIN_CS; GPIO_Init(PORT_CS,GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin=PIN_RESET; GPIO_Init(PORT_RESET,GPIO_InitStructure); /*配置GPIO为浮动输入模式(实际上CPU复位后就是输入状态)*/ GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING; /*设为输入口*/ GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; /*IO口最大速度*/ GPIO_InitStructure.GPIO_Pin=PIN_DOUT; GPIO_Init(PORT_DOUT,GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin=PIN_DRDY; GPIO_Init(PORT_DRDY,GPIO_InitStructure); #endif delay_ms(10); TM7705_ResetHard(); /*硬件复位*/ /* 在接口序列丢失的情况下
自校准时间较长,下一步是写设置寄存器。
CLK该位应置 “1” */ CLK_4_9152M=0x08, CLK_2_4576M=0x00, CLK_1M =0x04, CLK_2M =0x0C, FS_50HZ =0x00, FS_60HZ =0x01, FS_250HZ =0x02, FS_500HZ =0x04, /* 四十九、电子秤应用中提高TM7705精度的方法 当使用主时钟为2.4576MHz时,AD7705和TM7705是个坑啊?,必须使能才能振荡)*/ CLKDIS_1 =0x10, /*时钟禁止(当外部提供时钟时,可以通过TM7705_ReadReg(REG_ZERO_CH1)和 TM7705_ReadReg(REG_ZERO_CH2)读取校准参数,CLK应置“0”,下一步是写设置寄存器,并指定写哪个寄存器*/ if(bits==8) { TM7705_WriteByte((uint8_t)_RegValue); } else /*24bit*/ { TM7705_Write3Byte(_RegValue); }}/*********************************************************************************************************** 函数名:TM7705_ReadReg* 功能说明:写指定的寄存器* 形 参: _RegID:寄存器ID* _RegValue:寄存器值,取32位形参的低8bit* 返回值:读到的寄存器值,读2次*/ for(i=0;i<2;i ) { TM7705_WaitDRDY(); /*等待DRDY口线为0*/ if(_ch==1) { TM7705_WriteByte(0x38); } elseif(_ch==2) { TM7705_WriteByte(0x39); } read=TM7705_Read2Byte(); } returnread; }。