我编的程序始终无法启动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();
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
有监视的,不然没法判断何时读数据,再就是使用过程中失步太严重,后来修改的程序使用每次转换前都发送复位通信时钟信号(不是通过复位引脚复位,因为这样复位导致初始化后的寄存器也复位了)在转换读出数据很少出错,再就是TM7705不知道为什么开启了内部基准但还是不行,所以我就使用外部基准了
一周热门 更多>