TLV5614的AVRGCC程序与调试心得

简介:

之所以采用TLV5614是因为项目中需要用到4通道DA,TLV5614价格适中,资料也很多,SPI的接口操作起来也很简单。

调试过程中需要注意以下几点:

1、TLV5614是双电源供电,区分数字电源和模拟电源,因此为了通信方便数字电源最好和使用的控制器使用同一电源,这样就不存在电平转换问题,我的设计中就设计到AVR和STM32两种,AVR是5V,STM32是3.3V,虽然也兼容5V电平,但是在设计的时候需要注意一下。

2、注意LOAD引脚,低电平的时候才会刷新DA数据

3、PD引脚,低电平时是掉电模式,这两个引脚电平要连接正确。

4、参考电压选择,四个通道使用两个参考电压,参考电压时满量程的二分之一,因此需要输出5V满量程的话就需要使用2.5V参考电压,这一点和普通的单端ADDA不同,需要注意。便宜又好买的基准源推荐TL431,接起来方便还超级准。

5、FS,这个是帧同步信号,和片选CS一样,片子必须检测到一个下降沿才开始第一帧的数据同步,这个信号在通用的SPI接口中是没有的,需要软件产生。

6、最后就是为了增强输出驱动能力,可以输出加电压跟随,注意运放需要使用双电源,如LM324.

 

好了,下面就是程序,使用GCC写的,模拟SPI的方式实现,需要的拿去改改。

 

 

 

  1. /***************TLV5614的相关引脚定义********************/  
  2. #define TLV5614_Port PORTC      //设置使用的端口  
  3. #define TLV5614_DDR DDRC  
  4. #define TLV5614_PIN PINC  
  5. #define TLV5614_CS 3            //设置每个信号对应的引脚  
  6. #define TLV5614_MOSI 7  
  7. #define TLV5614_FS 1  
  8. #define TLV5614_CLK 5  
  9. #define TLV5614_CS_H (TLV5614_Port|=(1<<TLV5614_CS))  
  10. #define TLV5614_CS_L (TLV5614_Port&=~(1<<TLV5614_CS))  
  11. #define TLV5614_MOSI_H (TLV5614_Port|=(1<<TLV5614_MOSI))  
  12. #define TLV5614_MOSI_L (TLV5614_Port&=~(1<<TLV5614_MOSI))  
  13. #define TLV5614_FS_H (TLV5614_Port|=(1<<TLV5614_FS))  
  14. #define TLV5614_FS_L (TLV5614_Port&=~(1<<TLV5614_FS))  
  15. #define TLV5614_CLK_H (TLV5614_Port|=(1<<TLV5614_CLK))  
  16. #define TLV5614_CLK_L (TLV5614_Port&=~(1<<TLV5614_CLK))  
  17. unsigned char DA_delay; //设置信号的持续时间,相当于设置SPI的速度  
  18. /******************************************************************************* 
  19. 名称:void TLV5614_Init() 
  20. 功能:模拟SPI时序的端口初始化工作 
  21. 参数:无 
  22. 时间:2011.1.17 
  23. 版本:1.0 
  24. 注意:无 
  25. *******************************************************************************/  
  26. void TLV5614_Init()  
  27. {  
  28.     TLV5614_Port|=((1<<TLV5614_CS)|(1<<TLV5614_FS)|(1<<TLV5614_MOSI)|(1<<TLV5614_CLK));  
  29.     TLV5614_DDR|=((1<<TLV5614_CS)|(1<<TLV5614_FS)|(1<<TLV5614_MOSI)|(1<<TLV5614_CLK));  
  30.     TLV5614_CS_H;  
  31.     TLV5614_CLK_L;  
  32.     TLV5614_FS_L;   //初始设为低电平  
  33.     DA_delay=20;  
  34. }  
  35. /******************************************************************************* 
  36. 名称:TLV5614_Send(unsigned int data) 
  37. 功能:发送SPI数据 
  38. 参数:unsigned int data 
  39. 时间:2011.1.17 
  40. 版本:1.0 
  41. 注意:一次发送16位数据,从高位开始传输 
  42. *******************************************************************************/  
  43. void TLV5614_Send(unsigned int data)  
  44. {  
  45.     unsigned char i;  
  46.     TLV5614_FS_H;       //拉高帧同步信号  
  47.     TLV5614_CLK_H;  
  48.     TLV5614_CS_L;       //拉低片选信号,开始启动一次数据传输   
  49.     TLV5614_MOSI_L;  
  50.     _delay_us(DA_delay);  
  51.     TLV5614_FS_L;       //FS产生下降沿,表示串行数据帧开始传送  
  52.     for(i=0;i<16;i++)  
  53.     {  
  54.         if(data&(0x8000>>i))//高位在前,低位在前改为(0x01<<i)  
  55.             TLV5614_MOSI_H;  
  56.         else  
  57.             TLV5614_MOSI_L;  
  58.         _delay_us(DA_delay);  
  59.         TLV5614_CLK_L;      //在下降沿更新数据  
  60.         _delay_us(DA_delay);  
  61.         TLV5614_CLK_H;  
  62.     }  
  63.     TLV5614_FS_H;           //帧同步信号拉高,更新DA数据  
  64.     _delay_us(DA_delay);  
  65.     TLV5614_CS_H;       //拉高片选,完成一次数据传输   
  66. }  
  67. /******************************************************************************* 
  68. 名称:Write_DA(unsigned char chan,unsigned int data) 
  69. 功能:向指定DA通道写入数据 
  70. 参数:chan 写入的通道,取值0-3,chan>=4时设置为掉电方式 
  71.       data写入的数据 取值 0x0000-0x0FFF 
  72. 时间:2011.1.17 
  73. 版本:1.0 
  74. 注意:无 
  75. *******************************************************************************/  
  76. void Write_DA(unsigned int chan,unsigned int data)  
  77. {  
  78.     unsigned int Send_data=0x1000;  //具体参照TLV5614数据手册,SPD位设置为1,设置为快速方式  
  79.     if(chan>=4)  
  80.         TLV5614_Send(0x2000);  
  81.     else  
  82.         Send_data|=(chan<<14);  
  83.     data&=0x0FFF;  
  84.     Send_data|=data;  
  85.     TLV5614_Send(Send_data);  
  86. }  
 

本文转自emouse博客园博客,原文链接:http://www.cnblogs.com/emouse/archive/2011/01/17/2198181.html,如需转载请自行联系原作者
相关文章
|
4月前
|
C语言 索引
C语言编译环境中的 调试功能及常见错误提示
这篇文章介绍了C语言编译环境中的调试功能,包括快捷键操作、块操作、查找替换等,并详细分析了编译中常见的错误类型及其解决方法,同时提供了常见错误信息的索引供参考。
|
7月前
|
Windows
86/88汇编代码的运行调试
86/88汇编代码的运行调试
43 0
|
7月前
|
NoSQL Linux Android开发
OPENJTAG调试学习(三):使用 gdb 命令行进行调试
OPENJTAG调试学习(三):使用 gdb 命令行进行调试
115 0
|
编译器 程序员 C++
VS编译器实用调试技巧
VS编译器实用调试技巧
|
监控 程序员 编译器
代码的调试技巧
代码的调试技巧
|
编译器 C语言
C程序调试过程常见的错误
在C语言编程,一般需要借助C相关的编译软件,例如,在Keil uVision5编程环境下,如果提示工具连接错误,则表示MDK安装程序有问题,重新卸载,并全部删除后重新再进行安装后即可。
|
Linux Go C语言
Linux那些事(2)-Linux编译并运行C语言程序
本文目录 1. 前言 2. 进入命令行建立文件 3. 编辑C代码 4. 编译代码 5. 运行程序
183 0
|
C语言
一文解决C程序的编译问题
对于C源码编译,大部分人都停留在./configure --prefix=XXX && make && make install这一步,大部分的程序都能顺利走完这一步,然后被安装到指定的文件下,小部分的程序会因为xxx不全而出错,然后你把这个问题放到搜索引擎上,就会找到一篇博客说用sudo apt-get/yum install xxx 后可以解决问题,然后问题解决了。
958 0
|
NoSQL Linux C语言
Linux环境下段错误的产生原因及调试方法小结
最近在Linux环境下做C语言项目,由于是在一个原有项目基础之上进行二次开发,而且项目工程庞大复杂,出现了不少问题,其中遇到最多、花费时间最长的问题就是著名的“段错误”(Segmentation Fault)。
1104 0