Forum: Compiler & IDEs LTC6802 Projekt


von Peter P. (jre)


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.

von Peter P. (jre)


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.
1
void SPI_MasterInit()
2
{
3
  //USART_send_Byte(0x22);
4
  // Set MOSI,CS and SCK output, all others input
5
  DDR_SPI = (1<<DD_MOSI)|(1<<DD_SCK)|(1<<DD_CS);
6
  LTC6802_set_cs();
7
  //Enable SPI, Master, set clock rate fck/16
8
  SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0)|(1<<CPHA)|(1<<CPOL);
9
  _delay_ms(10);
10
}
11
12
void LTC6802_set_cs()
13
{
14
  PORT_SPI |= (1<<DD_CS);
15
}
16
17
void LTC6802_clear_cs()
18
{
19
  PORT_SPI &= ~(1<<DD_CS);
20
}
21
22
void LTC6802_transmit(uint8_t cData)
23
{
24
  // Start transmission 
25
  SPDR = cData;
26
  // Wait for transmission complete 
27
  while(!(SPSR & (1<<SPIF)));
28
}
29
30
void LTC_init(uint8_t cellcount)
31
{  
32
  uint8_t ConfigReg0;
33
  uint8_t ConfigReg1;
34
  uint8_t ConfigReg2;
35
  uint8_t ConfigReg3;
36
  uint8_t ConfigReg4;
37
  uint8_t ConfigReg5;
38
39
40
  //CFGR0
41
  //kein WD, GPIOX 0, toogle polling, 12 cells, UV and OV Off
42
  ConfigReg0=0b01100000;
43
44
  //CFGR1
45
  //discharge off
46
  ConfigReg1=0b00000000;
47
48
  //CFGR2
49
  //eable Interrupts cell1-4, discharge off cell 9-12
50
  ConfigReg2=0b00000000;
51
52
  //CFGR3
53
  //enable Interrupts Cell5-12
54
  ConfigReg3=0b00000000;
55
56
  //CFGR4
57
  //Voltage LOW
58
  ConfigReg4=0b00000000;
59
60
  //CFGR5
61
  //Voltage High
62
  ConfigReg5=0b01100000;
63
64
  LTC6802_clear_cs();
65
  SPDR = 0x01;
66
  // Wait for transmission complete 
67
  while(!(SPSR & (1<<SPIF)));
68
  SPDR = ConfigReg0;
69
  // Wait for transmission complete 
70
  while(!(SPSR & (1<<SPIF)))
71
  SPDR = ConfigReg1;
72
  // Wait for transmission complete 
73
  while(!(SPSR & (1<<SPIF)))
74
  SPDR = ConfigReg2;
75
  // Wait for transmission complete 
76
  while(!(SPSR & (1<<SPIF)))
77
  SPDR = ConfigReg3;
78
  // Wait for transmission complete 
79
  while(!(SPSR & (1<<SPIF)))
80
  SPDR = ConfigReg4;
81
  // Wait for transmission complete 
82
  while(!(SPSR & (1<<SPIF)))
83
  SPDR = ConfigReg5;
84
  // Wait for transmission complete 
85
  while(!(SPSR & (1<<SPIF)))
86
  LTC6802_set_cs();
87
}
88
89
void read_Config_reg()
90
{
91
  uint8_t  Adress = 0b10000000;
92
  
93
  LTC6802_clear_cs();
94
  LTC6802_transmit(Adress);  //Aufgeteilt in 2 Byte??
95
  LTC6802_transmit(0x02);    //Command read Config reg
96
    
97
  //LTC6802_transmit(0xFF);  
98
99
  //LTC6802_transmit(0b00000001);
100
  
101
  for (uint8_t i=0; i < 6;i++)
102
  {
103
    LTC6802_transmit(0xFF);
104
    //USART_send_Byte(SPDR);
105
  }
106
  LTC6802_set_cs();
107
}

von Peter P. (jre)


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).

von Manuel S. (Gast)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.