搜索
bottom↓
回复: 9

请用过TLV5616的达人帮帮忙!

[复制链接]

出0入0汤圆

发表于 2009-5-30 22:13:50 | 显示全部楼层 |阅读模式
#include <iom16v.h>
#include <macros.h>

//********************************端口初始化*************************************
void port_init(void)
{
PORTA = 0x00;
DDRA = 0x00;
PORTB = 0x00;
DDRB = 0x00;
PORTC = 0x00; //m103 output only
DDRC = 0x00;
PORTD = 0x00;
DDRD = 0x00;
}

//********************************SPI初始化*************************************
// clock rate: 62500hz
void spi_init(void)
{
PORTB |= (1<<PB4) | (1<<PB5) | (1<<PB6) | (1<<PB7);
DDRB |= (1<<DDB5) | (1<<DDB7) | (1<<DDB4);     //Set MOSI, SCK AND SS as outputs
SPCR = 0x51; //使能SPI,MSB首发,主机模式,64分频
SPSR = 0x00; //setup SPI
}

//********************************设备初始化************************************
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
spi_init();

MCUCR = 0x00;
GICR = 0x00;
TIMSK = 0x00; //timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialized
}

//********************************SPI发数据函数*********************************
void SPI_MasterTransmit(unsigned int cData)
{
PORTB &=~ (1<<PB4); //强制接收方进入从模式
SPCR |= (1<<MSTR); // MSTR有时会被清零,这里强制进入主机模式
SPDR = cData>>8;   //传输控制码的高8位
/* 等待传输结束 */
while(!(SPSR & (1<<SPIF)))
;
/* 启动数据传输 */
SPDR = cData;          //传输控制码的低8位
/* 等待传输结束 */
while(!(SPSR & (1<<SPIF)))
;
PORTB |= (1<<PB4);
}

//********************************粗略延时函数**********************************
void Delay(void)
{
unsigned int i,j;
for(i=1000;i>0;i--)
{
  for(j=2000;j>0;j--)
;
}
}

//********************************测试函数**************************************
void main(void)
{
init_devices();
SPI_MasterTransmit(0x0fff);          //发送控制码
Delay();
while(1);
}

参考电压是2.48V,但是发送0x0fff后测得的输出电压却是2.61~2.65V,不但不准,而且有跳动,让我很是郁闷!
硬件上基本是照DATASHEET接的,不过OUT端与AGND端的电阻Rload没有接,会是由于这个原因而造成的问题吗?
先谢过大家了,急用!

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2009-5-31 08:32:10 | 显示全部楼层
应该还有CS和FS引脚的
/**********************************************
宏(结构体)定义
**********************************************/
#define DIN_H        PORTC|=BIT(5)
#define DIN_L        PORTC&=~BIT(5)
#define SCLK_H        PORTC|=BIT(4)
#define SCLK_L        PORTC&=~BIT(4)
#define CS0_H        PORTC|=BIT(3)
#define CS0_L        PORTC&=~BIT(3)
#define FS_H        PORTC|=BIT(2)
#define FS_L        PORTC&=~BIT(2)
#define CS1_H        PORTC|=BIT(1)
#define CS1_L        PORTC&=~BIT(1)

//--------------------------------------------
//写DAC
//--------------------------------------------
void Dac_Write(uint d)//高位在前,下降沿发送
{
char i;

CS_L;
FS_L;  
for(i=0;i<16;i++)
{
  if(d&0x8000)
          DIN_H;
  else
          DIN_L;
  SCLK_L;
  SCLK_H;
  d<<=1;
}
FS_H;
CS_H;
}

出0入0汤圆

 楼主| 发表于 2009-5-31 14:16:14 | 显示全部楼层
谢谢楼上的帮助,我的CS是直接接地的。模拟的SPI我试过了,仍然会出类似的问题。

出0入0汤圆

发表于 2009-5-31 15:36:38 | 显示全部楼层
发个原理图看看。

出0入0汤圆

发表于 2009-5-31 15:45:19 | 显示全部楼层
设置CPOL=0 CPHA=1 试试看

出0入0汤圆

 楼主| 发表于 2009-6-3 22:44:01 | 显示全部楼层
谢谢楼上各位的解答,我马上试试!

出0入0汤圆

发表于 2009-7-17 11:07:48 | 显示全部楼层
楼主调好了吗?是CPOL=0 CPHA=1 设置的原因吗?

出0入0汤圆

发表于 2010-8-24 08:36:25 | 显示全部楼层
不是应该移十二位吗

出0入0汤圆

发表于 2013-10-27 01:10:29 | 显示全部楼层
你可尝试MSB数据传送与改成模式1。

出0入0汤圆

发表于 2015-7-14 16:34:16 | 显示全部楼层
请问楼主是怎么解决的?是不是因为OUT端没接负载引起的波动?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 00:38

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表