[程序源码] ATmega16 以SPI方式控制TM7705

[复制链接]
3151|0
 楼主| 伏尔加的鱼 发表于 2014-3-18 18:22 | 显示全部楼层 |阅读模式
      最近做毕业设计使用到TM7705,现将AVR SPI的驱动源码发出来共享,程序验证了没什么问题,值得提的是AVR SPI驱动的相位要设置,不然读取的数据有问题,本人使用的晶振是4.9152MHz的
头文件源码(AtmelStudio6.1编译无误):
  1. /*
  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_ */
c源码:
  1. /*
  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. }



您需要登录后才可以回帖 登录 | 注册

本版积分规则

23

主题

302

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部