求救!!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的输出口始终没有电平。
请问是怎么回事呢?
谢谢! 我用过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置高
} 先用软件模拟spi dyptnt,这位大哥,照您说的做了后,输出端口有电平,但明显不对,我怀疑硬件是否接对,还有您的程序我有一个问题:为什么要倍速SPI? 能跟您QQ联系吗?谢谢,我的QQ:83254823。急切盼望! 谢谢! 我时钟给的是16M, 倍速SPI,能达到8M,TLV5618的最大时钟是20M {
SPI_Init();
PORTB&=0xFE; //CS置低,使能
SPI_Send(0x85);//发送高八位
SPI_Send(0x50);//发送低八位
SPI_Send(0x00);//清空
SPI_Send(0x00);//清空
PORTB|=0xFF; //CS置高
}
发了高八,和低八!
后面为什么还要再发两次SPI作清空啊?? /////////////////////////////////////////////////////////////////
//模出芯片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();
} SPI_Send(0x00);//清空
SPI_Send(0x00);//清空
为什么要两次清空?我也没看懂 问一下,参考电压芯片用什么好? 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;
} mark 回复【6楼】ba_wang_mao
/////////////////////////////////////////////////////////////////
//模出芯片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);
}
cpol = 1,cpha=1; mark 路过,正在调TLV5618 mark,5615正在调试,
页:
[1]