mikrocontroller.net

Forum: Compiler & IDEs LTC6802 Projekt


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Peter P. (jre)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Ich versuche im Moment ein Batterie Mangemant System mit hilfe eines 
LTC6802 zu realisieren.

Nachdem ich anfangs Probleme hatte die Signale auf dem SPI bus 
ordendlich zu erzeugen, habe ich nun wirklich super saubere Signale, die 
auch zu den richtigen Zeiten kommen.

Das Problem: Der LTC6802 läuft nicht. Auf SDO (MISO) ist durchgehend ein 
heigh Pegel. Alle Signale kommen am LTC sauber an.

Hat vieleicht jemand schon eine fertige Komunikation mit dem LTC fertig 
und kann mir das mal Zeigen? Das wäre super. Sonst kann ich demnächst 
noch Programmcodes und Schaltplänen dienen.

Autor: Peter P. (jre)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe noch einmal alles mit dem Oczi durchgemessen und folgendes 
Ergebnis.

Zum Test möchte ich ein Read_Config_reg machen (0x02)

zuerst cleare ich den cs(sieht man auf dem Ozci).
Dann sende ich die Adresse mit der vorangestellten 1000 (0b10000000)
-> SDO / MISO bleibt high. Takt ist zu sehen

Dann sende ich 0x02
-> SDO / MISO bleibt heigh. Takt ist zu sehen

Nun wird direkt nachdem der Takt zuende ist die SDO / MISO Leitung auf 
0V gezogen. Jedoch bevor der nächste Takt beginnt ist diese wieder 
heigh.

In einer For-Schleife sende ich 6 dummy Bytes (0xFF) um die Daten zu 
empgangen.

->SDO / MISO bleibt heigh. Takte sind alle zu erkennen.

Der uController erkennt auch (zurecht) 0xFF am SPDR.

Der CS belibt wärend des ganzen Ablaufes 0 und wird danach 1 (wie 
gewollt)

In einer vorherigen Schleife habe ich bei der initialisierung bereits 
versucht die Register so zu Schreiben, dass eine LED am GPIO2 zu 
leuchten beginnt. Auch dies ist nicht gelungen.
void SPI_MasterInit()
{
  //USART_send_Byte(0x22);
  // Set MOSI,CS and SCK output, all others input
  DDR_SPI = (1<<DD_MOSI)|(1<<DD_SCK)|(1<<DD_CS);
  LTC6802_set_cs();
  //Enable SPI, Master, set clock rate fck/16
  SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0)|(1<<CPHA)|(1<<CPOL);
  _delay_ms(10);
}

void LTC6802_set_cs()
{
  PORT_SPI |= (1<<DD_CS);
}

void LTC6802_clear_cs()
{
  PORT_SPI &= ~(1<<DD_CS);
}

void LTC6802_transmit(uint8_t cData)
{
  // Start transmission 
  SPDR = cData;
  // Wait for transmission complete 
  while(!(SPSR & (1<<SPIF)));
}

void LTC_init(uint8_t cellcount)
{  
  uint8_t ConfigReg0;
  uint8_t ConfigReg1;
  uint8_t ConfigReg2;
  uint8_t ConfigReg3;
  uint8_t ConfigReg4;
  uint8_t ConfigReg5;


  //CFGR0
  //kein WD, GPIOX 0, toogle polling, 12 cells, UV and OV Off
  ConfigReg0=0b01100000;

  //CFGR1
  //discharge off
  ConfigReg1=0b00000000;

  //CFGR2
  //eable Interrupts cell1-4, discharge off cell 9-12
  ConfigReg2=0b00000000;

  //CFGR3
  //enable Interrupts Cell5-12
  ConfigReg3=0b00000000;

  //CFGR4
  //Voltage LOW
  ConfigReg4=0b00000000;

  //CFGR5
  //Voltage High
  ConfigReg5=0b01100000;

  LTC6802_clear_cs();
  SPDR = 0x01;
  // Wait for transmission complete 
  while(!(SPSR & (1<<SPIF)));
  SPDR = ConfigReg0;
  // Wait for transmission complete 
  while(!(SPSR & (1<<SPIF)))
  SPDR = ConfigReg1;
  // Wait for transmission complete 
  while(!(SPSR & (1<<SPIF)))
  SPDR = ConfigReg2;
  // Wait for transmission complete 
  while(!(SPSR & (1<<SPIF)))
  SPDR = ConfigReg3;
  // Wait for transmission complete 
  while(!(SPSR & (1<<SPIF)))
  SPDR = ConfigReg4;
  // Wait for transmission complete 
  while(!(SPSR & (1<<SPIF)))
  SPDR = ConfigReg5;
  // Wait for transmission complete 
  while(!(SPSR & (1<<SPIF)))
  LTC6802_set_cs();
}

void read_Config_reg()
{
  uint8_t  Adress = 0b10000000;
  
  LTC6802_clear_cs();
  LTC6802_transmit(Adress);  //Aufgeteilt in 2 Byte??
  LTC6802_transmit(0x02);    //Command read Config reg
    
  //LTC6802_transmit(0xFF);  

  //LTC6802_transmit(0b00000001);
  
  for (uint8_t i=0; i < 6;i++)
  {
    LTC6802_transmit(0xFF);
    //USART_send_Byte(SPDR);
  }
  LTC6802_set_cs();
}

Autor: Peter P. (jre)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Als kurzes Zwischenergibnis für alle, die ein ähnliches Projekt haben 
und auf diess Thema stoßen:

Die Komunikation klappt jetzt. Das Problem war, dass nach dem übertragen 
der Config Bytes noch eine weile gewartet werden muss, bevor das CS 
wieder auf heigh gesetzt wird. (Bei uns grad 10ms).

Autor: Manuel S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Peter

Kannst du evtl. noch den Schaltplan und deine geänderten Code Posten?
Wäre dir unendlich dankbar.

Peter P. schrieb:

> Sonst kann ich demnächst
> noch Programmcodes und Schaltplänen dienen.

PS: ich habe wie du geschrieben hast die CS Zeit erhöht jedoch kein 
Kommunikation zustande bekommen. Hast du eventuell eine Tipp wie ich die 
Funktionalität des Chips von außen (ohne Kommunikation) testen kann?
Beste grüße
Manuel

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.