关于AVR SPI驱动TM7705

2019-07-15 20:34发布

我编的程序始终无法启动TM7705转换,通过SPI写入的数据从寄存器中读出都是错误的,希望有用过的人帮忙看看我的程序!
头文件:
/*
* TM7705.h
*
* Created: 2014/3/11 0:03:28
*  Author: 000
*/
#ifndef TM7705_H_
#define TM7705_H_

#include <avr/io.h>
#include <util/delay.h>
#include "User_LED.h"

#define DRDY 3        //从机就绪输入
#define SS 4        //从机片选输出
#define MOSI 5        //主机数据输出
#define MOSO 6        //主机数据输入
#define SCK 7        //主机时钟输出

#define TM7705_Enable() (PORTB &=~_BV(SS))//使能TM7705
#define TM7705_Disable() (PORTB |=_BV(SS))//失能TM7705

#define Wait_TM7705() while(PINB&0X08)//监视转换

#define CH1 0X00 //通道1
#define CH2 0X01 //通道2

void SPI_Port_Init( void );
void SPI_Init( void );
uint8_t TM7705_Write( uint8_t Data );
void TM7705_Init( void );
uint8_t TM7705_Read_Byte( uint8_t Register_number );
uint16_t TM7705_Read_16bit( uint8_t Channel );
#endif /* TM7705_H_ */


C文件:
/*
* TM7705.c
*
* Created: 2014/3/11 0:01:07
*  Author: 000
*/
#include "TM7705.h"
/*-------------------ATmage16 SPI端口控制TM7705--------------------*/
/*-------------------------端口接线示意图--------------------------*/
/*ATmage16 SPI端口                                                                TM7705端口
*PB4(SS)        从机控制端口--------------------------Pin4(CS)
*PB5(MOSI)        主机数据输出--------------------------Pin14(DIN)
*PB6(MOSO)        主机数据输入--------------------------Pin13(DOUT)
*PB7(SCK)        主机时钟输出--------------------------Pin1(SCLK)
*PB3             监视TM7705---------------------------Pin12(DRDY)
*/


/******************************************************
*函数名:SPI_Port_Init
*参数:
*返回值:PB3检测TM7705_DRDY
*说明:SPI端口初始化
******************************************************/
void SPI_Port_Init( void )
{
        /*设置PB4(SS),PB5(MOSI),PB7(SCK)为输出*/
        DDRB |= _BV(SCK)|_BV(SS)|_BV(MOSI);
       
        /*PB6(MOSO)为输入,PB3—TM7705转换完成信号*/
        DDRB &= ~(_BV(MOSO)|_BV(DRDY));
       
        /*输入端口的上拉电阻使能*/
        PORTB |=  _BV(DRDY)|_BV(MOSO)|_BV(SS)|_BV(SCK);
}

/******************************************************
*函数名:SPI_Init
*参数:无
*返回值:无
*说明:SPI初始化为主机模式
******************************************************/
void SPI_Init( void )
{
        /*使能SPI,MSB先收发,选择主机模式,时钟空闲时为高电平*/
        /*系统时钟128分频*/
        SPCR |= _BV(SPE)|_BV(MSTR)|_BV(CPOL)|_BV(SPR0)|_BV(SPR1);
        SPSR = 0X00;
}

/******************************************************
*函数名:TM7705_Read_Byte
*参数:Register_number
*返回值:
*说明:从TM7705中指定的寄存器中读取一字节数据
******************************************************/
uint8_t TM7705_Read_Byte( uint8_t Register_number )
{
        uint8_t SPI_Data=0;
        TM7705_Enable();
        TM7705_Write(0X08|(Register_number<<4));
        SPI_Data = TM7705_Write(0XFF);                //通过发送数据来读取一个字节的数据
        TM7705_Disable();
        return SPI_Data;
}

/******************************************************
*函数名:TM7705_Reset
*参数:
*返回值:
*说明:复位TM7705
******************************************************/
void TM7705_Reset( void )
{
        uint8_t num;
        for ( num=10;num>0;num-- )
        {
                TM7705_Write(0XFF);
        }
}

/******************************************************
*函数名:TM7705_Read_16bit
*参数:Channel可以是CH1,CH2
*返回值:
*说明:读取一次TM7705的通道Channel转换数据
******************************************************/
uint16_t TM7705_Read_16bit( uint8_t Channel )
{
        uint16_t Read_Data=0;
        TM7705_Enable();
        TM7705_Write(0X38|Channel);                //读取当前通道数据       
        Wait_TM7705();                                        //等待转换结束
        //为何总是等待不到结束
        Read_Data = TM7705_Write(0XFF);        //读取当前通道数据高八位
        Read_Data <<= 8;
        Read_Data |= TM7705_Write(0XFF);//读取当前通道数据低八位
       
        TM7705_Disable();
        return Read_Data;
}

/******************************************************
*函数名:TM7705_Write
*参数:Data,要发送的参数
*返回值:从机中返回的数据
*说明:SPI接口完成一次数据交换
******************************************************/
uint8_t TM7705_Write( uint8_t Data )
{
        SPDR = Data;
        while(!(SPSR>>SPIF));//等待发送完成
        return SPDR;
}

/******************************************************
*函数名:TM7705_Init
*参数:无
*返回值:
*说明:TM7705初始化
******************************************************/
void TM7705_Init( void )
{
        SPI_Port_Init();        //SPI端口初始化
        SPI_Init();                        //初始化SPI为主机模式
        TM7705_Enable();
        TM7705_Reset();                //复位TM7705
       
        TM7705_Write(0X20);//选择时钟寄存器
        TM7705_Write(0X0E);//设置时钟寄存器,主频4.9125MHz进行二分频,250Hz转换
       
        TM7705_Write(0X40);//选择测试寄存器
        TM7705_Write(0X01);//设置测试寄存器,使用内部基准
       
        TM7705_Write(0X00);//选择通信寄存器并且设置为通道一
       
        TM7705_Write(0X10);//选择设置寄存器
        TM7705_Write(0X47);//设置设置寄存器,增益为1进行自校准模式
        Wait_TM7705();                //等待校准结束
        //为何等待总是不能完成
       
        //TM7705_Write_Byte(0,0X01);        //设置通信寄存器,选择通道2
        //TM7705_Write_Byte(1,0X47);        //设置设置寄存器,增益为1,进行自校准模式
        //Wait_TM7705();                //等待校准结束
        TM7705_Disable();
}


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
依然落叶飘零
1楼-- · 2019-07-16 01:33
问题你自己都解决啦,相位设置问题。用到while最好就控制一下运行时间,防止程序死在那里。
youzizhile
2楼-- · 2019-07-16 02:46
逻辑输出。这个输出端上的逻辑低电平表示可从 TM7705 的数据寄存器获取新的输出字。完成对一个完全的输出字的读操作后,DRDY 引脚立即回到高电平。如果在两次输出更新之间,不发生数据读出,DRDY 将在下一次输出更新前 500 ×tCLKIN 时间返回高电平。当 DRDY 处于高电平时,不能进行读操作,以免数据寄存器中的数据正在被更新时进行读操作。当数据被更新后,DRDY  又将返回低电平。DRDY  也用来指示何时TM7705 已经完成片内的校准序列
程序好像没有监控这个引脚的状态?
伏尔加的鱼
3楼-- · 2019-07-16 08:27
youzizhile 发表于 2014-4-13 21:24
逻辑输出。这个输出端上的逻辑低电平表示可从 TM7705 的数据寄存器获取新的输出字。完成对一个完全的输出字 ...

有监视的,不然没法判断何时读数据,再就是使用过程中失步太严重,后来修改的程序使用每次转换前都发送复位通信时钟信号(不是通过复位引脚复位,因为这样复位导致初始化后的寄存器也复位了)在转换读出数据很少出错,再就是TM7705不知道为什么开启了内部基准但还是不行,所以我就使用外部基准了

一周热门 更多>