Skocz do zawartości

Arduino i komunikacja z TSA6057


SP9CNN

Pomocna odpowiedź

Dzień dobry wszytkim! Zbudowałem układ syntezy częstotliwości PLL na popularnym układzie scalonym TSA6057 i nie mogę skomunikować się z nim z Arduino za pomocą I2C i używając biblioteki wire.h. Mam zatem pytanie, czy ktoś już może budował podobny projekt i czy wspomniana biblioteka jest odpowiednia do obsługi I2C dla tego układu scalonego?Może ktoś udostępnić jakiś przykładowy szkic? Z góry dziękuję za pomoc i życzę wszystkim odwiedzającym forum Wesołych Świąt i Szczęśliwego Nowego Roku ! 

Link do komentarza
Share on other sites

Bardzo dziękuję Ci za zainteresowanie się tym tematem. Poniżej zamieszczam schemat płytki syntezera i program. Układ został zmontowany i częściowo uruchomiony, tzn VCO umieszczone na dodatkowej płytce działa i przestraja się (pływa) w żadanym zakresie , co oznacza ze układ scalony generuje jakieś napięcia sterujące.Ponadto na wyprowadzeniach SCL i SDA pojawiają się impulsy z Arduino, a generowane z PINów dedykowanych dla I2C, a znajdujących się obok AREF. Moim zdaniem układ powinien dać się zaadresować nawet gdy jest tylko zasilony i podłączony do magistrali, jednak nie otrzymuję odpowiedzi z układu scalonego.Aby wyeliminować wadliwy układ scalony, sprawdziłem go w innym urządzeniu, działa prawidłowo. Na schemacie nie uwzględniono rezystorów podciągających 5.1kOhm. W sieci można znaleźć kilka opisów syntezerów i programów, te jednak są pisane w BASCOMie , tak wiec niewiele mogę podpatrzeć :). Wydaje mi się ze BASCOM używa bardzo podobnych funkcji obsługi I2C jak  biblioteka write.h. Program oparłem na zamieszczonym przez Ingo Gerlacha tu: https://github.com/gitpan/i2c/blob/master/tsa6057/tsa6057.c

Ponadto testowałem I2C programem znalezionym tu: https://create.arduino.cc/projecthub/abdularbi17/how-to-scan-i2c-address-in-arduino-eaadda#widget-comments , również bez rezultatu.  Prawdopodobnie układ TSA6057 jednak nie działa z typowymi funkcjami wire.h .

Poniżej zamieszczam schemat syntezera i używany przeze mnie program. Z podziękowaniami ,Grzegorz SP9CNN

//------------------TSA6057.h------------------------------------------------------------------
#ifndef _TSA6057_h
#define _TSA6057_h 
#pragma once
#include "Arduino.h"

#define TSA6057_ADR	0xC4		// Adress default 196 , (198) rejestr 1 module adress
#define TSA6057_SUB 0       //sub adres rejestr 2 subadresu
#define TSA6057_CP 1        // prąd pompy H/L 1/0 rejestr 3 DB0
                            // DB1 obliczany
#define TSA6057_REF1  // DB2
#define TSA6057_REF2  // DB2
#define TSA6057_FMAM  // DB2
#define TSA6057_OPAMP 0 // DB2
#define TSA6057_BS  0 // band swich prąd floating /sink ? // DB2
#define TSA6057_DB3  0 // DB3

//--------------------------------------------------------
#define TSA6057_AM	16		// AM 
#define TSA6057_FM	32		// FM
#define TSA6057_R01	0		// Raster 1 KHz
#define TSA6057_R10	64		// Raster 10 KHz
#define TSA6057_R25	128		// Raster 25 KHz
#define TSA6057_4MHz	100		// XTAL 4MHz
#define TSA6057_5MHz	80		// XTAL 5MHz
#define TSA6057_DEFF  145300000   // Default f z kwarcem 5 MHz - 145 MHz ->145.300




//#define TSA6057_DEFF  135000000   // Default f z kwarcem 5 MHz - 145 MHz

 struct tsa6057 {
  
 int adr;        // Adress = 196                     -- I2cwbyte 196
 int sadr;				// Sub-Adress = 0                  -- I2cwbyte 0
 int raster;				// Raster 1 / 10  /25 KHz       
 int db0;				// Teiler und ChargePump             -- I2cwbyte Db0
 int db1;				// Teiler                            -- I2cwbyte Db1
 int db2;				// Raster  /FM/AM / Teiler          -- I2cwbyte Db2
 int db3;				// TestByte = 0                       --  I2cwbyte 0
};

void tsa6057_init(struct tsa6057 *sp,int Raster,int Mode); 	// Raster & Mode
void tsa6057_calc(tsa6057 *sp,long Freq,int Xtal);		// Berechnet die Teilerfaktoren in *sp , Ruckgabe Teiler 
void tsa6057_send(tsa6057 *sp);		// Sendet die Daten an die PLL , Adress Offset 0 | 2
#endif
//------------------TSA6057.c------------------------------------------------------------------
  #include "Arduino.h"
#include <Wire.h>
#include "tsa6057.h"

void tsa6057_init(struct tsa6057 *sp,int Raster,int Mode)   // Raster & Mode
{
  memset(sp,0,sizeof(tsa6057));		// Struckt.  0 settings
  sp->adr=TSA6057_ADR; // adres
  sp->sadr=0;				   //subadres
  sp->db2=Raster+Mode+TSA6057_BS;	// Raster / Mode / BS on 
  sp->db3=0;
  switch(Raster)
  {
    case 0: 	sp->raster = 1000;
    		break;
    case 64: 	sp->raster = 10000;
    		break;
    case 128: 	sp->raster = 25000;
    		break;
    default:	sp->raster = 10000;		
   }  		
 
}
//--------------------------------------------------------------------------------------------------------
void tsa6057_calc(struct tsa6057 *sp,long Freq,int Xtal)// Calculate divide factor in *sp , 
{
 int n;
  //Freq = (Freq*Xtal)/100;//Xtal 5MHz , raster 12.5kHz
  n = (Freq / sp->raster); // Berechnet wird ein ganzzahliger Teiler.
  sp->db0 = ((n & 127) << 1)+1;			// 1. 6 Bits 
  sp->db1 = (n & 32640) >> 7;			// Oberes Nibble holen n0-n7
  sp->db2 = sp->db2 +((n & 98304) >> 15);	// n14-n8
}				         	
//------------------------------------------------------------------------------------------------------
void tsa6057_send(struct tsa6057 *sp) 	        // Send data to PLL
{
delay(1);
Wire.beginTransmission(sp->adr);
Wire.write(sp->adr);
Wire.write(sp->sadr);
Wire.write(sp->db0);
Wire.write(sp->db1);
Wire.write(sp->db2); 
Wire.write(sp->db3);
Wire.endTransmission();
delay(1);
}  
//------------------Program test------------------------------------------------------------------
#include <Wire.h>
#include "TSA6057.h"

long f = TSA6057_DEFF;
tsa6057 tsa; //  utworzenie struktury danych TSA6057 
 
void setup() {
 
  Wire.begin(TSA6057_ADR); 
  Serial.begin(9600);
  tsa6057_init(&tsa,TSA6057_R10,TSA6057_FM); // Daten initialisieren Datenstruktur
  
}

void loop() {
  //----------------------------------------------
 tsa6057_calc(&tsa,TSA6057_DEFF,TSA6057_5MHz);
 tsa6057_send(&tsa);
  //----------------------------------------------
 
  delay(5000);

}

263550767_schematPLL.thumb.jpg.05609c4775e13410430c623e62fdcd19.jpg

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.