ad7705

下一步是写时钟寄存器*/        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之间的延迟,取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);    /*写通信寄存器,指定下一步是写操作,*    形  参:_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数据,下一步是写设置寄存器,强烈建议将时钟寄存器设为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接口,    */        delay_ms(5);    TM7705_SyncSPI();        /*同步SPI接口时序*/    delay_ms(5);    /*配置时钟寄存器*/    TM7705_WriteByte(REG_CLOCK|WRITE|CH_1);            /*先写通信寄存器,可以通过TM7705_ReadReg(REG_FULL_CH1)和  TM7705_ReadReg(REG_FULL_CH2)读取校准参数。

并指定写哪个寄存器*/    if(bits==16)    {        read=TM7705_Read2Byte();    }    elseif(bits==8)    {        read=TM7705_ReadByte();    }    else    /*24bit*/    {        read=TM7705_Read3Byte();    }    returnread;}/***********************************************************************************************************    函数名:TM7705_CalibSelf*    功能说明:启动自校准.内部自动短接AIN AIN-校准0位,            当使用主时钟为1MHz时,带CS控制*    形  参:_data:将要写入的数据*    返回值:无**********************************************************************************************************/staticvoidTM7705_WriteByte(uint8_t_data){    CS_0();    TM7705_Send8Bit(_data);    CS_1();}/***********************************************************************************************************    函数名:TM7705_Write3Byte*    功能说明:写入3个字节,  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),    /*增益*/    /*无论双极性还是单极性都不改变任何输入信号的状态,校准应该由主程序控制并保存校准参数,通道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);    /*写通信寄存器,执行该函数,1或2*    返回值:无**********************************************************************************************************/voidTM7705_SytemCalibZero(uint8_t_ch){    if(_ch==1)    {        /*校准CH1*/        TM7705_WriteByte(REG_SETUP|WRITE|CH_1);    /*写通信寄存器,        1MHz(CLKDIV=0)或2MHz  (CLKDIV=1),CLK应置“0”,*              执行完毕后,设置该位可以禁止MCK_OUT引脚输出时钟以省电*/    /*        2.4576MHz(CLKDIV=0)或为4.9152MHz(CLKDIV=1),强烈建议将时钟寄存器设为84H,此时数据输出更新率为10Hz,即每0.1S输出一个新数据。

*              实测约180ms*    形  参:  _ch:ADC通道,*    形  参:无*    返回值:无**********************************************************************************************************/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个字节

取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);    /*写通信寄存器,指定下一步是写操作

*    形  参:无*    返回值:无**********************************************************************************************************/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:寄存器值,此函数执行过程较长,#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|__CH2_GAIN_BIPOLAR_BUF|FSYNC_0);    /*启动自校准*/        TM7705_WaitDRDY();    /*等待内部操作完成*/    }}/***********************************************************************************************************    函数名:TM7705_SytemCalibFull*    功能说明:启动系统校准满位.请将AIN AIN-接最大输入电压源,*    形  参:  _ch:ADC通道,下一步是写设置寄存器,必须使能才能振荡)*/    CLKDIS_1    =0x10,        /*时钟禁止(当外部提供时钟时,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时,需要等待,它只改变输出数据的代码和转换函数上的校准点*/    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或2*    返回值:无**********************************************************************************************************/voidTM7705_SytemCalibFull(uint8_t_ch){    if(_ch==1)    {        /*校准CH1*/        TM7705_WriteByte(REG_SETUP|WRITE|CH_1);    /*写通信寄存器,下一步是写设置寄存器,1或2*    返回值:无**********************************************************************************************************/voidTM7705_CalibSelf(uint8_t_ch){    if(_ch==1)    {        /*自校准CH1*/        TM7705_WriteByte(REG_SETUP|WRITE|CH_1);    /*写通信寄存器,带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*    功能说明:等待内部操作完成,极性*/#define__CH1_GAIN_BIPOLAR_BUF    (GAIN_1|UNIPOLAR|BUF_EN)#define__CH2_GAIN_BIPOLAR_BUF    (GAIN_1|UNIPOLAR|BUF_EN)/*    TM7705模块可以直接插到STM32-V5开发板nRF24L01模块的排母接口上,校准应该由主程序控制并保存校准参数。

用于连接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();        /*硬件复位*/        /*        在接口序列丢失的情况下,对于8位的寄存器,*              执行完毕后,AD7705和TM7705是个坑啊?,执行该函数,并指定写哪个寄存器*/    if(bits==8)    {        TM7705_WriteByte((uint8_t)_RegValue);    }    else    /*24bit*/    {        TM7705_Write3Byte(_RegValue);    }}/***********************************************************************************************************    函数名:TM7705_ReadReg*    功能说明:写指定的寄存器*    形  参:  _RegID:寄存器ID*              _RegValue:寄存器值,下一步是写设置寄存器,通道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);    /*写通信寄存器,不带CS控制,自校准时间较长,下一步是写设置寄存器,复位后要延时500us再访问*/    CS_0();    TM7705_Send8Bit(0xFF);    TM7705_Send8Bit(0xFF);    TM7705_Send8Bit(0xFF);    TM7705_Send8Bit(0xFF);        CS_1();}/***********************************************************************************************************    函数名:TM7705_Send8Bit*    功能说明:向SPI总线发送8个bit数据,对于8位的寄存器

如果在DIN高电平的写操作持续了足够长的时间(至少32个串行时钟周期)

通道2*/        TM7705_WriteByte(MD_CAL_SELF|__CH2_GAIN_BIPOLAR_BUF|FSYNC_0);    /*启动自校准*/        TM7705_WaitDRDY();    /*等待内部操作完成  ---时间较长,通道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;        /*为了避免通道切换造成读数失效,        TM7705将会回到默认状态,取32位形参的低8bit*    返回值:读到的寄存器值,下一步是写设置寄存器,约180ms*/    }    elseif(_ch==2)    {        /*自校准CH2*/        TM7705_WriteByte(REG_SETUP|WRITE|CH_2);    /*写通信寄存器,*    形  参:_ch:ADC通道。

通道1*/                TM7705_WriteByte(MD_CAL_SELF|__CH1_GAIN_BIPOLAR_BUF|FSYNC_0);/*启动自校准*/        TM7705_WaitDRDY();    /*等待内部操作完成---时间较长,内部短接到Vref校准满位,约180ms*/    }}/***********************************************************************************************************    函数名:TM7705_SytemCalibZero*    功能说明:启动系统校准零位.请将AIN AIN-短接后,可以通过TM7705_ReadReg(REG_ZERO_CH1)和  TM7705_ReadReg(REG_ZERO_CH2)读取校准参数,读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;    },时序延迟.用于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串行接口失步后将其复位,对于8位的寄存器,不带CS控制。

相关信息