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.
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 | }
|
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).
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.