OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 8365|回复: 5

TM7707AD转换读取两个通道转换值时异常。

[复制链接]

22

主题

133

帖子

2

精华

高级会员

Rank: 4

积分
901
金钱
901
注册时间
2015-12-24
在线时间
197 小时
发表于 2016-10-19 10:01:34 | 显示全部楼层 |阅读模式
1金钱
    如题,写的STM32F103的TM7707驱动程序,现在只读取一个通道的转换值时正常,同时读取两个通道的时候读取不正确。请搞过的童鞋赐教。    代码如下,GPIO和SPI初始化代码省略。
    TM7707初始化。
    void TM7707_Initialize(void)
    {
        // Initialize GPIO for TM7707 device.
        TM7707_InitializeGPIO();
        // Initialize SPI controler.
        TM7707_InitializeSPI2();
        // Reset device(hardware).
        TM7707_Reset();
        // Synchronize device clock.
        TM7707_SynchronizeDeviceClock();
        // Self-calibration
        TM7707_SelfCalibration(CH_1, GAIN_1); // Channel 1 internal self-calibration.
        TM7707_SelfCalibration(CH_2, GAIN_1); // Channel 2 internal self-calibration.
        // Configure the clock registers
        TM7707_TransferByte(REG_CLOCK | WRITE | CH_1); // Write communication register to set clook register.
        TM7707_TransferByte(CLKDIS_0 | CLK_4_9152M | FS_50HZ); // External clock, frequency is 4.9152 MHz and the sampling frequency is 50Hz.
        TM7707_TransferByte(REG_CLOCK | WRITE | CH_2); // Write communication register to set clook register.
        TM7707_TransferByte(CLKDIS_0 | CLK_4_9152M | FS_50HZ); // External clock, frequency is 4.9152 MHz and the sampling frequency is 50Hz.
    }

    TM7707校准
    void TM7707_SelfCalibration(uint8_t    uiChannelIndex, uint8_t uiGain)
    {
        uiChannelIndex = uiChannelIndex % CH_MAX;
        // ADC channel self-calibration
        TM7707_TransferByte(REG_SETUP | WRITE | uiChannelIndex); //Write communication register to set setup register.
        TM7707_TransferByte(MD_CAL_SELF | uiGain | UNIPOLAR | BUF_EN | FSYNC_0); //Write configuration register, start self-calibration.
        TM7707_WaitForDRDY(); // Wait for operation to complete(ablut 180ms).
        TM7707_TransferByte(REG_SETUP | WRITE | uiChannelIndex); //Write communication register to set setup register.
        TM7707_TransferByte(MD_NORMAL | uiGain | UNIPOLAR | BUF_EN | FSYNC_0); //Write configuration register, start self-calibration.
        TM7707_WaitForDRDY();
    }

    硬件复位
    void TM7707_Reset(void)
    {
        TM7707_ST_RESET();
        TM7707_Delay(5000);
        TM7707_ST_UNRESET();
        TM7707_Delay(1000);
    }

    时钟同步
    void TM7707_SynchronizeDeviceClock(void)
    {
        uint8_t i;
        // Keep SCLK pin high at 40 cycles.
        for(i=0; i<5; i++)
        {
            TM7707_TransferByte(0xFF);
        }
    }

    读取转换值
    uint32_t TM7707_ReadADCValue(uint8_t uiChannelIndex)
    {
        uint32_t    rtnADValue;

        rtnADValue = 0x00000000;
        // Wait for the conversion to complete
        TM7707_WaitForDRDY();
        // Write channel index.
        TM7707_TransferByte(REG_DATA | READ | uiChannelIndex);
        // Read ADC value.
        TM7707_CS_ENABLE();
        rtnADValue |= TM7707_TransferByte(0xFF);
        rtnADValue <<= 8;
        rtnADValue |= TM7707_TransferByte(0xFF);
        rtnADValue <<= 8;
        rtnADValue |= TM7707_TransferByte(0xFF);
        TM7707_CS_DISABLE();

        return rtnADValue;
    }

    主入口
    int main(void)
    {
        uint32_t auiADCValue[2] = {0};
        float auiVoltage[2] = {0};

        HSEClocks_Initialize(RCC_PLLMul_9);
        NVIC_Initialize(NVIC_PriorityGroup_2);
        DebugPort_Initialize(DEBUG_SWD);
        Initialize_Systick(72, TRUE);

        DebugSerialPort_Initialize(9600);

        TM7707_Initialize();
        TM7707_SelfCalibration(CH_1, GAIN_1);
        TM7707_SelfCalibration(CH_2, GAIN_1);

        while(1)
        {
            // Read adc value.
            auiADCValue[0] = TM7707_ReadADCValue(CH_1);
            auiVoltage[0] = 5.0*auiADCValue[0]/16777216;
            auiADCValue[1] = TM7707_ReadADCValue(CH_2);
            auiVoltage[1] = 5.0*auiADCValue[1]/16777216;

            // Print adc value to serial.
            // Format as ADvalue:Voltage:Reference
            printf("CH1:%10u, Voltage:%1.6f  |  CH2:%10u, Voltage:%1.6f\r\n", auiADCValue[0], auiVoltage[0], auiADCValue[1], auiVoltage[1]);
        }
    }

    附件为MDK5完整工程,STM32F103ZET6,使用SPI2,72MHz,64分频。
    STM32F1_TM7707.zip (310.89 KB, 下载次数: 449)

最佳答案

查看完整内容[请看2#楼]

已找到原因,很低级的错误,DRDY位判断错了。 但是发现一个新的问题,这个驱动是用TM7705的驱动程序改造而来,而根据官方的数据手册,TM7705和7707的寄存器定义并不相同,比如,7707是没有时钟寄存器的,但是有滤波数据寄存器。 但关键问题是,我按照7707数据手册操作芯片,程序乱跑,读出来的不知道啥数,但是按照7705就好用,真是费解………………
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

22

主题

133

帖子

2

精华

高级会员

Rank: 4

积分
901
金钱
901
注册时间
2015-12-24
在线时间
197 小时
 楼主| 发表于 2016-10-19 10:01:35 | 显示全部楼层
已找到原因,很低级的错误,DRDY位判断错了。

但是发现一个新的问题,这个驱动是用TM7705的驱动程序改造而来,而根据官方的数据手册,TM7705和7707的寄存器定义并不相同,比如,7707是没有时钟寄存器的,但是有滤波数据寄存器。
但关键问题是,我按照7707数据手册操作芯片,程序乱跑,读出来的不知道啥数,但是按照7705就好用,真是费解………………
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2016-10-20 22:04:16 | 显示全部楼层
帮顶
回复

使用道具 举报

22

主题

133

帖子

2

精华

高级会员

Rank: 4

积分
901
金钱
901
注册时间
2015-12-24
在线时间
197 小时
 楼主| 发表于 2016-10-21 11:13:03 | 显示全部楼层
最新的调查结果发表在:
http://www.openedv.com/thread-86432-1-1.html
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2019-8-2
在线时间
15 小时
发表于 2019-11-7 10:52:15 | 显示全部楼层
楼主 想问一下 我这边使用TM7705然后同样的程序同样的板子  换了不同批次的芯片 就会出现 初始化响应不了但是一通道可以使用。但是原先的就使用全部正常。这边你有什么建议么?谢谢
回复

使用道具 举报

11

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
101
金钱
101
注册时间
2019-2-16
在线时间
26 小时
发表于 2019-12-3 16:07:38 | 显示全部楼层
老哥 你的程序真的能跑吗????
我的板子烧入你的程序之后
能通信 但是读数根本就不正常
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-24 04:26

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表