之所以采用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的方式实现,需要的拿去改改。
-   
- #define TLV5614_Port PORTC      //设置使用的端口  
- #define TLV5614_DDR DDRC  
- #define TLV5614_PIN PINC  
- #define TLV5614_CS 3            //设置每个信号对应的引脚  
- #define TLV5614_MOSI 7  
- #define TLV5614_FS 1  
- #define TLV5614_CLK 5  
- #define TLV5614_CS_H (TLV5614_Port|=(1<<TLV5614_CS))  
- #define TLV5614_CS_L (TLV5614_Port&=~(1<<TLV5614_CS))  
- #define TLV5614_MOSI_H (TLV5614_Port|=(1<<TLV5614_MOSI))  
- #define TLV5614_MOSI_L (TLV5614_Port&=~(1<<TLV5614_MOSI))  
- #define TLV5614_FS_H (TLV5614_Port|=(1<<TLV5614_FS))  
- #define TLV5614_FS_L (TLV5614_Port&=~(1<<TLV5614_FS))  
- #define TLV5614_CLK_H (TLV5614_Port|=(1<<TLV5614_CLK))  
- #define TLV5614_CLK_L (TLV5614_Port&=~(1<<TLV5614_CLK))  
- unsigned char DA_delay;   
-  
-  
-  
-  
-  
-  
-  
-   
- void TLV5614_Init()  
- {  
-     TLV5614_Port|=((1<<TLV5614_CS)|(1<<TLV5614_FS)|(1<<TLV5614_MOSI)|(1<<TLV5614_CLK));  
-     TLV5614_DDR|=((1<<TLV5614_CS)|(1<<TLV5614_FS)|(1<<TLV5614_MOSI)|(1<<TLV5614_CLK));  
-     TLV5614_CS_H;  
-     TLV5614_CLK_L;  
-     TLV5614_FS_L;     
-     DA_delay=20;  
- }  
-  
-  
-  
-  
-  
-  
-  
-   
- void TLV5614_Send(unsigned int data)  
- {  
-     unsigned char i;  
-     TLV5614_FS_H;         
-     TLV5614_CLK_H;  
-     TLV5614_CS_L;         
-     TLV5614_MOSI_L;  
-     _delay_us(DA_delay);  
-     TLV5614_FS_L;         
-     for(i=0;i<16;i++)  
-     {  
-         if(data&(0x8000>>i))  
-             TLV5614_MOSI_H;  
-         else  
-             TLV5614_MOSI_L;  
-         _delay_us(DA_delay);  
-         TLV5614_CLK_L;        
-         _delay_us(DA_delay);  
-         TLV5614_CLK_H;  
-     }  
-     TLV5614_FS_H;             
-     _delay_us(DA_delay);  
-     TLV5614_CS_H;         
- }  
-  
-  
-  
-  
-  
-  
-  
-  
-   
- void Write_DA(unsigned int chan,unsigned int data)  
- {  
-     unsigned int Send_data=0x1000;    
-     if(chan>=4)  
-         TLV5614_Send(0x2000);  
-     else  
-         Send_data|=(chan<<14);  
-     data&=0x0FFF;  
-     Send_data|=data;  
-     TLV5614_Send(Send_data);  
- }