ATmega16 以SPI方式控制TM7705
时间:10-02
整理:3721RD
点击:
最近做毕业设计,使用到TM7705,在使用时虽然是简单的SPI接口但是也花费了不少时间来调试,关键在于SPI的相位配置处(如下图片处已经圈为红色),TM7705是高有效位先发送
以下是C文件:
- <font size="4">/*
- * 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_ */</font>
以下是C文件:
- <font size="4">/*
- * 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();
- }</font>

通信时应当配置为红色圈的内容

我自己再补充一下,上面的程序中spi接口通过发送0XFF来读取一个字节的数据更改为发送0X80比较好
使用时又发现了问题,就是转换速率太快就会使得转换的数据出问题,应该是在读数据的同事又一次新的转换完成导致的,我又将速率更改为60Hz就没问题了,正在测试,有问题继续补充
还是有问题,读数据程序没问题,但是发现读取设置寄存器时的数值有时候会变,读取的转换结果也不对,复位一次配置一下再度数据就对了(配置寄存器还是会变化,尤其是测试寄存器的数值变化最厉害),但是这样读取效率太低了。
感谢大牛分享!
正在参考ing
