shawnws 发表于 2007-8-25 17:49:05

求救!!TLC5618无法实现DA转换,不知问题出在哪儿??

用mega64L的SPI口,将数据发送到TLC5618的DIN口, SPI使能,高位在先,主机模式,CPOL为1,CPHA为0。

TLC5618的3线串行接口要一次接收16位数据,而SPI一次只能发送8位,所以我分2次发送,自己控制CS线的电平。

下面是程序,第一句是把CS置低,接着发送前8位,把寄存器清空,再发后8位,把寄存器清空,最后一句把CS置高。

PORT_SPI&=~(1<<BIT_SS);



SPDR=highdin;

while(!(SPSR&0x80))

;

clear=SPSR;

clear=SPDR;



SPDR=lowdin;

while(!(SPSR&0x80))

;

clear=SPSR;

clear=SPDR;



PORT_SPI|=(1<<BIT_SS);



基准电压是5V,前面的程序没有问题,可是TLC5618的输出口始终没有电平。

请问是怎么回事呢?

谢谢!

dyptnt 发表于 2007-8-25 18:11:04

我用过TLC5618,挺好用的,基准要接2.5V,输出能到2倍的Vref



void SPI_Init(void)

{

DDRB=0x0BF;//MISO:INPUTOTHER:OUTPUT

PORTB=0x0BF;

SPCR=0x54;

SPSR=0x01;//SPI2X Enable

}

void SPI_Send(uchar u)

{

SPDR=u;

while(!(SPSR&0x80));

}

void main(void)

{

SPI_Init();

PORTB&=0xFE;   //CS置低,使能

SPI_Send(0x85);//发送高八位

SPI_Send(0x50);//发送低八位

SPI_Send(0x00);//清空

SPI_Send(0x00);//清空

PORTB|=0xFF;   //CS置高

}

ilan2003 发表于 2007-8-25 18:20:34

先用软件模拟spi

shawnws 发表于 2007-8-25 19:15:12

dyptnt,这位大哥,照您说的做了后,输出端口有电平,但明显不对,我怀疑硬件是否接对,还有您的程序我有一个问题:为什么要倍速SPI?   能跟您QQ联系吗?谢谢,我的QQ:83254823。急切盼望! 谢谢!

dyptnt 发表于 2007-8-25 20:05:08

我时钟给的是16M, 倍速SPI,能达到8M,TLV5618的最大时钟是20M

wga520 发表于 2007-8-31 10:34:51

{

SPI_Init();

PORTB&=0xFE;   //CS置低,使能

SPI_Send(0x85);//发送高八位

SPI_Send(0x50);//发送低八位

SPI_Send(0x00);//清空

SPI_Send(0x00);//清空

PORTB|=0xFF;   //CS置高

}

发了高八,和低八!

后面为什么还要再发两次SPI作清空啊??

ba_wang_mao 发表于 2007-8-31 14:39:56

/////////////////////////////////////////////////////////////////

//模出芯片TLC5618,SCK在闲置时是高电平(时序图上有一根SCK为高时持平的线),由于模出芯片在下降沿锁存数据,

//由于CPOL=1,因此CPHA=0

/////////////////////////////////////////////////////////////////

void TLC5618_SPI_Init(void)

{

        SPCR = (1<<SPE) | (1<<MSTR) | (1<<CPOL) | (0<<CPHA) | (0 <<SPR1) | (1<<SPR0);

        SPSR = (1<<SPI2X);

}





//////////////////////////////////////////////////////////////////////////////

//操作步骤:

//        1.写重叠缓冲区锁存器

//        2.把串行接口寄存器的数据写入锁存器A并用缓冲区锁存数据更新锁存器B

//////////////////////////////////////////////////////////////////////////////

void SPI_TLC5618(unsigned int cha_data,unsigned int chb_data)

{

        unsigned char i;

        unsigned char SPI_Lo;

        unsigned char SPI_Hi;

        unsigned int cha_COMMAND = cha_data | 0x8000;

        unsigned int chb_COMMAND = chb_data | 0x1000;



        TLC5618_SPI_Init();

        TLC_CS0_1();                                                        //        选择模出芯片

        TLC_CS1_0();

        SPI_Lo = chb_COMMAND & 0xff;

        SPI_Hi = chb_COMMAND >> 8;

        SPDR = SPI_Hi;

        for (i = 0 ; i < 200 ; i++)        if (SPSR & 0x80) break;

        SPDR = SPI_Lo;

        for (i = 0 ; i < 200 ; i++)        if (SPSR & 0x80) break;

        TLC_CS0_1();

        TLC_CS1_1();

       

        TLC_CS0_1();                                                        //        选择模出芯片

        TLC_CS1_0();

        SPI_Lo = cha_COMMAND & 0xff;

        SPI_Hi = cha_COMMAND >> 8;

        SPDR = SPI_Hi;

        for (i = 0 ; i < 200 ; i++)        if (SPSR & 0x80) break;

        SPDR = SPI_Lo;

        for (i = 0 ; i < 200 ; i++)        if (SPSR & 0x80) break;

        TLC_CS0_1();

        TLC_CS1_1();

}

gaowenqin 发表于 2008-4-15 17:56:22

SPI_Send(0x00);//清空
SPI_Send(0x00);//清空

为什么要两次清空?我也没看懂

ylei12 发表于 2008-8-19 11:18:31

问一下,参考电压芯片用什么好?

wisebaby 发表于 2008-8-19 13:37:15

sbit TLC5618_DIN=P1^4;
sbit TLC5618_CLK=P1^5;
sbit TLC5618_cs =P1^6;
//------------------------------------------------------------------------------
void DA_TLC5618(unsigned int data)
{               

unsigned int nc;
unsigned char i;

nc=0x8000|data;           //如果用没有|就DACB输出

TLC5618_CLK=1;
TLC5618_cs=0;
for(i=0;i<16;i++)
{TLC5618_CLK=1;
   if(nc&0x8000)TLC5618_DIN=1;
   else TLC5618_DIN=0;
   TLC5618_CLK=0;
   nc<<=1;
}
TLC5618_cs=1;
TLC5618_CLK=1;
}

wenpeijun 发表于 2010-3-17 14:43:31

mark

sxbgfz 发表于 2011-8-22 20:23:27

回复【6楼】ba_wang_mao

/////////////////////////////////////////////////////////////////
//模出芯片tlc5618,sck在闲置时是高电平(时序图上有一根sck为高时持平的线),由于模出芯片在下降沿锁存数据,
//由于cpol=1,因此cpha=0
/////////////////////////////////////////////////////////////////
void tlc5618_spi_init(void)
{
        spcr = (1&lt;&lt;spe) | (1&lt;&lt;mstr) | (1&lt;&lt;cpol) | (0&lt;&lt;cpha) | (0 &lt;&lt;spr1) | (1&lt;&lt;spr0);
        spsr = (1&lt;&lt;spi2x);
}
cpol = 1,cpha=1;

king000 发表于 2011-12-31 11:34:24

mark

so_so_so 发表于 2012-11-8 21:07:40

路过,正在调TLV5618

cclgxuanshao 发表于 2013-12-17 17:04:43

mark,5615正在调试,
页: [1]
查看完整版本: 求救!!TLC5618无法实现DA转换,不知问题出在哪儿??