微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > ATmega16 以SPI方式控制TM7705

ATmega16 以SPI方式控制TM7705

时间:10-02 整理:3721RD 点击:
最近做毕业设计,使用到TM7705,在使用时虽然是简单的SPI接口但是也花费了不少时间来调试,关键在于SPI的相位配置处(如下图片处已经圈为红色),TM7705是高有效位先发送

  1. <font size="4">/*
  2. * TM7705.h
  3. * 伏尔加的鱼
  4. * Created: 2014/3/11 0:03:28
  5. *  Author: 000
  6. */


  7. #ifndef TM7705_H_
  8. #define TM7705_H_

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

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

  17. #define TM7705_Enable() (PORTB &=~_BV(SS))//使能TM7705
  18. #define TM7705_Disable() (PORTB |=_BV(SS))//失能TM7705
  19. #define Wait_TM7705() while(PINB&0X08)//监视转换

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

  22. void SPI_Port_Init( void );
  23. void SPI_Init( void );
  24. uint8_t TM7705_Write( uint8_t Data );
  25. void TM7705_Init( void );
  26. uint8_t TM7705_Read_Register_8bit( uint8_t Register_number );
  27. uint16_t TM7705_Read_16bit( uint8_t Channel );


  28. #endif /* TM7705_H_ */</font>

复制代码


以下是C文件:

  1. <font size="4">/*
  2. * TM7705.c
  3. * 伏尔加的鱼
  4. * Created: 2014/3/11 0:01:07
  5. *  Author: 000
  6. */
  7. #include "TM7705.h"
  8. /*-------------------ATmage16 SPI端口控制TM7705--------------------*/
  9. /*-------------------------端口接线示意图--------------------------*/
  10. /*ATmage16 SPI端口                                                                TM7705端口
  11. *PB4(SS)        从机控制端口--------------------------Pin4(CS)
  12. *PB5(MOSI)        主机数据输出--------------------------Pin14(DIN)
  13. *PB6(MOSO)        主机数据输入--------------------------Pin13(DOUT)
  14. *PB7(SCK)        主机时钟输出--------------------------Pin1(SCLK)
  15. *PB3             监视TM7705---------------------------Pin12(DRDY)
  16. */


  17. /******************************************************
  18. *函数名:SPI_Port_Init
  19. *参数:
  20. *返回值:PB3检测TM7705_DRDY
  21. *说明:SPI端口初始化
  22. ******************************************************/
  23. void SPI_Port_Init( void )
  24. {
  25.         /*设置PB4(SS),PB5(MOSI),PB7(SCK)为输出*/
  26.         DDRB |= _BV(SCK)|_BV(SS)|_BV(MOSI);
  27.        
  28.         /*PB6(MOSO)为输入,PB3—TM7705转换完成信号*/
  29.         DDRB &= ~(_BV(MOSO)|_BV(DRDY));
  30.        
  31.         /*输入端口的上拉电阻使能*/
  32.         PORTB |=  _BV(DRDY)|_BV(MOSO)|_BV(SS)|_BV(SCK);
  33. }

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

  47. /******************************************************
  48. *函数名:TM7705_Read_Byte
  49. *参数:Register_number
  50. *返回值:
  51. *说明:从TM7705中指定的寄存器中读取一字节数据
  52. ******************************************************/
  53. uint8_t TM7705_Read_Register_8bit( uint8_t Register_number )
  54. {
  55.         uint8_t SPI_Data=0;
  56.         TM7705_Enable();
  57.         TM7705_Write(0X08|(Register_number<<4));
  58.         SPI_Data = TM7705_Write(0XFF);                //通过发送数据来读取一个字节的数据
  59.         TM7705_Disable();
  60.         return SPI_Data;
  61. }

  62. /******************************************************
  63. *函数名:TM7705_Reset
  64. *参数:无
  65. *返回值:无
  66. *说明:复位TM7705
  67. ******************************************************/
  68. void TM7705_Reset( void )
  69. {
  70.         uint8_t num;
  71.         for( num=3;num>0;num-- )
  72.         {
  73.                 TM7705_Write(0XFF);
  74.         }
  75. }

  76. /******************************************************
  77. *函数名:TM7705_Read_16bit
  78. *参数:Channel可以是CH1,CH2
  79. *返回值:
  80. *说明:读取一次TM7705的通道Channel转换数据
  81. ******************************************************/
  82. uint16_t TM7705_Read_16bit( uint8_t Channel )
  83. {
  84.         uint16_t Read_Data=0;
  85.         TM7705_Enable();
  86.         TM7705_Write(0X38|Channel);                //读取当前通道数据       
  87.         Wait_TM7705();                                        //等待转换结束
  88.        
  89.         Read_Data = TM7705_Write(0XFF);        //读取当前通道数据高八位
  90.         Read_Data <<= 8;
  91.         Read_Data |= TM7705_Write(0XFF);//读取当前通道数据低八位
  92.        
  93.         TM7705_Disable();
  94.         return Read_Data;
  95. }

  96. /******************************************************
  97. *函数名:TM7705_Write
  98. *参数:Data,要发送的参数
  99. *返回值:从机中返回的数据
  100. *说明:SPI接口完成一次数据交换
  101. ******************************************************/
  102. uint8_t TM7705_Write( uint8_t Data )
  103. {
  104.         SPDR = Data;
  105.         while(!(SPSR>>SPIF));//等待发送完成
  106.         return SPDR;
  107. }

  108. /******************************************************
  109. *函数名:TM7705_Init
  110. *参数:无
  111. *返回值:
  112. *说明:TM7705初始化
  113. ******************************************************/
  114. void TM7705_Init( void )
  115. {
  116.         SPI_Port_Init();        //SPI端口初始化
  117.         SPI_Init();                        //初始化SPI为主机模式
  118.         TM7705_Enable();
  119.         TM7705_Reset();                //复位TM7705
  120.        
  121.         TM7705_Write(0X20);//选择时钟寄存器
  122.         TM7705_Write(0X0E);//设置时钟寄存器,主频4.9125MHz进行二分频,250Hz转换
  123.        
  124.         TM7705_Write(0X10);//选择设置寄存器,选择通道2
  125.         TM7705_Write(0X46);//设置设置寄存器,增益为1进行自校准模式,开启端口缓冲模式
  126.         Wait_TM7705();                //等待校准结束
  127.        
  128.        
  129.         TM7705_Write(0X11);        //设置通信寄存器,选择通道2
  130.         TM7705_Write(0X46);        //设置设置寄存器,增益为1,进行自校准模式,开启端口缓冲模式
  131.         Wait_TM7705();                //等待校准结束
  132.         TM7705_Disable();
  133. }</font>

复制代码




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


我自己再补充一下,上面的程序中spi接口通过发送0XFF来读取一个字节的数据更改为发送0X80比较好

使用时又发现了问题,就是转换速率太快就会使得转换的数据出问题,应该是在读数据的同事又一次新的转换完成导致的,我又将速率更改为60Hz就没问题了,正在测试,有问题继续补充

还是有问题,读数据程序没问题,但是发现读取设置寄存器时的数值有时候会变,读取的转换结果也不对,复位一次配置一下再度数据就对了(配置寄存器还是会变化,尤其是测试寄存器的数值变化最厉害),但是这样读取效率太低了。

感谢大牛分享!
正在参考ing

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top