打印
[程序源码]

ATmega16 以SPI方式控制TM7705

[复制链接]
2908|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
伏尔加的鱼|  楼主 | 2014-3-18 18:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
      最近做毕业设计使用到TM7705,现将AVR SPI的驱动源码发出来共享,程序验证了没什么问题,值得提的是AVR SPI驱动的相位要设置,不然读取的数据有问题,本人使用的晶振是4.9152MHz的
头文件源码(AtmelStudio6.1编译无误):
/*
* 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_Register_8bit( 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(CPHA)|_BV(SPR0)|_BV(SPR1);
        SPSR = 0X00;
}

/******************************************************
*函数名:TM7705_Read_Byte
*参数:Register_number
*返回值:
*说明:从TM7705中指定的寄存器中读取一字节数据
******************************************************/
uint8_t TM7705_Read_Register_8bit( 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=3;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(0X10);//选择设置寄存器,选择通道2
        TM7705_Write(0X46);//设置设置寄存器,增益为1进行自校准模式,开启端口缓冲模式
        Wait_TM7705();                //等待校准结束
       
       
        TM7705_Write(0X11);        //设置通信寄存器,选择通道2
        TM7705_Write(0X46);        //设置设置寄存器,增益为1,进行自校准模式,开启端口缓冲模式
        Wait_TM7705();                //等待校准结束
        TM7705_Disable();
}



相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

23

主题

298

帖子

2

粉丝