最近做毕业设计使用到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();
}
|