มีใครเคยเขียนเชื่อต่อกับ TDA1543 บ้างไหมครับ

  • 5 Replies
  • 2562 Views
สวัสดีครับ วันนี้ผมลองเอา dsPIC ส่งข้อมูลให้กับ TDA1543 ดูครับมันคือชิพ DAC 16 Bit  ในส่วนตัวแล้วผมเข้าใจจากภาพที่ 6 ในดาต้าชีท เรื่องการส่งข้อมูลผมจึงลองเขียนฟังชั่นขึ้นเพื่อทดลองเองก่อน แต่ก็ยังไม่ได้ผลอย่างที่เข้าใจครับ มีปัญหาหลายส่วนจึงอยากขอคำแนะนำครับ อย่างใน Data sheet เค้าบอกให้ส่งแบบ I2S

I2S กับ SPI ต่างกันยังไงครับ
และ อย่างวงจร Vref บอกให้ต่อ R ลงกราว ผมลองต่อแล้วค่า V ที่ขา Vref ไม่ถึง 2.1 V ครับ (ตรงนี้ผมแก้โดยต่อเป็น R แบ่งแรงดันกับ Vdd ก็ปรับให้ถึง 2.1 V ดูแล้วก็เหมือนชิพจะตอบสนองตรงแรงดันที่ขา Vref  แต่การรับข้อมูลยังไม่ตอบสนองครับ)

Quote
void SPI_to_TDA1543( unsigned int data ,unsigned int data2 )
{
 

  unsigned char j;
  unsigned int  Buf;




 
   WS_HI;     
 
      for( j=0 ;j<16;j++){

      Buf = data & 0x8000;

      if(Buf == 0 ){        // serial data in
     Data_LO;
      }else{
      Data_HI;
      }
    delay();
    Clk_HI;     // clock pulse
    delay();
    Clk_LO;


    data>>=1;    // rotate


      }
   WS_LO;

   for( j=0 ;j<16;j++){

      Buf = data2 & 0x8000;

      if(Buf == 0 ){        // serial data in
     Data_LO;
      }else{
      Data_HI;
      }
     delay();
    Clk_HI;     // clock pulse
    delay();
    Clk_LO;


    data2>>=1;    // rotate


      }
   
}

เคยใช้แบบต่อกับ ic cs8412 โดยตรง  (เคยคิดจะทำแบบคุณอยู่เหมือนกัน แต่ไม่ได้ฤกษ์ซักที )  ขอแจมกระทู้ด้วยเลยละกัน
1.TDA1543  ขา Rout Lout ได้ต่อ R ลง gnd หรือเปล่า (เพื่อเป็น i to v converter)  dac ตัวนี้ output ออกเป็นกระแสนะ ค่อนข้างต่ำด้วย  จาก  datasheet   Ifs (full scale output current)  2.3 ma เท่านั้น
ถ้าไฟเลี้ยงของ TDA1543  =5 V
ที่ขา Rout Lout ลองใช้ R 870 ohm ต่อลง gnd  (ตัวเลขนี้มาจากโปรแกรมคำนวณ ตอนต่อจริงก็เอาให้ใกล้เคียงก็โอเคครับ  ไม่ถึงกับต้องเป๊ะ)
ที่ขา ref ลองใช้ R 1 kohm ต่อลง gnd
 R 3ตัวนี้ถ้าไม่เหมาะสม เสียงมันจะแตกๆ
 
2.ได้ลองวัดดูรูป i2s signal ที่คุณสร้างออกมาบ้างหรือยัง

3. เรื่อง i2s format  มันมีรายละเอียดอยู่  ผมก็จำไมค่อย่ได้  ลองดูรูปสัญญาณที่ด้านล่างของเพจนี้
http://sounddac.wordpress.com/2009/02/14/%E0%B9%80%E0%B8%82%E0%B9%89%E0%B8%B2%E0%B8%AA%E0%B8%B9%E0%B9%88-digital-audio-%E0%B8%81%E0%B8%B1%E0%B8%9A-spdif/
ในโปรแกรมคุณลองเพิ่ม 1clock ก่อน MSB  และ 1clock หลัง LSB ดูครับ

ขอบคุณครับผม
ผมใช้ไฟ 3.04 V จ่ายจาก PICkit ต่อ R 22k ให้ Vref ได้ 2.16 V ครับ (ตอนนี้คิดว่าอยู่ในย่าน 2.1 - 2.3 V ที่กำหนดแล้ว)

ผมลองต่อ R 820(เท่าที่หาได้ตอนนี้) กับ Rout Lout ลงกราวแล้วครับ   เป็นว่า Rout ได้  1 V  Lout ได้ 1 V อยู่ตอนนี้ ตอนนี้เหลือไล่ดูการส่งข้อมูล

ผมคิดว่าจะให้ Data เป็น 1 หมดด้านนึง และ 0 หมดด้านนึง เพื่อดูค่าที่เปลี่ยนแปลงก่อนนะครับ แต่ ตอนนี้ Rout Lout ยังไม่ขยับเลย

วันนี้ลองเอา chip ที่ซื้อจาก wt     TDA7052 มาใส่ในวงจร ซื้อมา 14 ตัว ตอนแรก เสียงไม่ออก งงว่าวงจรเราต่อผิดรึเปล่า เอาชิพเก่ามาใส่ เสียงออกปกติ  เลยนั่งไล่ไปทีละตัว สรุปใช้ได้ 2 ตัว จาก  14 ตัว สังเกตุเลขตัวถัง น่าจะเป็นเลขล๊อตที่ผลิต กลุ่มที่ใช้ไม่ได้ มีเลขผลิตเดียวกัน ส่วนที่ใช้ได้ก็คนละเลขกัน

คราวนี้กลับมามอง TDA1543 ว่า ไอ้ที่เราต่อไม่ออกนี่ เพราะว่าชิพหรือว่า เรากันแน่  แต่ผมต่อแล้วไม่ทำงานเลยซักตัว  วันนี้เลยว่าจะถามว่าใครเคยต่อแล้วใช้ได้บ้างไหมครับ

ต่อกับชิพตระกูลอะไร แล้วมันเป็นยังไงบ้างครับ ขอคำแนะนำหน่อย ผมใช้กับ dsPIC  ยังไม่รอดนับแต่วันนั้นจนถึงวันนี้  ขอบคุณครับ

วันนี้ได้มีโอกาสลองเล่นดู  ก็พอสั่งงานได้โดยส่งเพิ่มอีก 2 clock ให้เป็นรูปแบบ i2s format (ใน function send1)   แต่รูปแบบของ data word ของไอซีตัวนี้ยังไม่ค่อยเข้าใจเท่าไร



ch1 คือ Rout  ch2 คือ LRCLK  ลองส่งข้อมูลแบบ set 2



ch1 คือ data  ch2 คือ LRCLK


ch1 คือ Rout  ch2 คือ LRCLK  ลองส่งข้อมูลแบบ set 3  ผลที่ได้ค่อนข้างแปลก

Code: [Select]
/*
experiment to interface TDA1543 legacy 16bit dac with pic 18F4520
compiler:ccsc
connection
sdo to TDA1543 data
sck to TDA1543 bclk
rc2 to TDA1543 LRclk or ws
*/

#define mcu 4520
#define set 2

#if mcu==4520
#include <18f4520.H>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=PIN_C6,rcv=PIN_C7, parity=N) 
#define trisaval 11111110

#define LRpin pin_c2

#use fast_io(c)
#use fast_io(b)
#BIT cke=0xfc7.6
#BIT ckp=0xfc6.4
#BIT sspen=0xfc6.5  //sspcon1 reg
#endif

int8 cnt,i,j, value, min, max,
j1,
tmp1,tmp;
signed int8 bright1;

int1 direc;


void nop1() {
delay_cycles( 1 );
delay_cycles( 1 );
}
void blink() {
}
void init_spi() {
byte i,j;
#if sim==1
return;
#endif

    setup_spi(SPI_MASTER | SPI_L_TO_H |SPI_XMIT_L_TO_H| SPI_CLK_DIV_64);

set_tris_c(0x90);

}

void send2(){
//send additional clk ,for i2s format
#define k1 8
output_low(PIN_C3);
   delay_us(k1);
output_high(PIN_C3);
delay_us(k1);
}

void send1(int8 by1,by2,by3,by4) {
#if sim==1
return;
#endif
output_low(LRpin);
send2();
sspen=1;
spi_write(by1);
spi_write(by2);
sspen=0;
send2();
output_high(LRpin);
send2();
sspen=1;
spi_write(by3);
spi_write(by4);
sspen=0;
send2();
delay_us(10);
}
void main() {

   byte value,cmd;

   init_spi();
set_tris_a(0);
output_d(0);
sspen=0;

while(1) {

#if set==2
send1(0x7f,0xff,0x7f,0xff);
send1(0x3f,0xff,0x3f,0xff);
send1(0x00,0x00,0x00,0x00);
send1(0xbf,0xff,0xbf,0xff);
send1(0xff,0xff,0xff,0xff);
#endif
#if set==3
send1(0x00,0x00,0x00,0x00);
send1(0x00,0xff,0x00,0xff);
send1(0x03,0xff,0x03,0xff);
send1(0x7f,0xff,0x7f,0xff);
send1(0xff,0xff,0xff,0xff);
#endif
delay_ms(10);

}


}


ใช้ dsPIC ทำไมไม่ใช้ I2S ล่ะครับ?

ถ้าใช้ IO ต้องดู Timing ดีๆครับ

จากโค๊ด ตรง Rotate ผิดครับ

data>>=1;    // rotate

ต้องเป็น data <<= 1;    // rotate

ต้อง Shift Left ครับ เพื่อส่ง MSB ก่อน