Hallo,
ich arbeite mit dem STM8S105K6 und habe hier schon mehrer Beispiele von
ST ausprobiert. SDA und SCL haben einen 4,7K Pull up. Die Leitung ist
aktuell nur mit einem Oszi verbunden.
Manuell kann ich die entsprechenden Pins toggeln lassen aber with I2C
bleiben die Pins bei 3,3V.
Nach längerem Debuggen bemerkte ich dann das bei allen Beispielen das
Busy Bit immer durchgehend gesetzt ist.
Da ich den Fehler nicht finden kann würde ich mich über hilfe sehr
freuen.
Hier ein kleines Beispiel meiner Meinung, müsste ich am Oszi die
gesendete Adresse sehen können.
1
intmain(void){
2
I2C_Init();
3
while(1){
4
I2C_7BitAdresse();
5
}
6
7
voidI2C_Init(){
8
CLK->CKDIVR=0x01;
9
I2C->CR2|=1<<7;
10
I2C->CR2^=1<<7;//Reset periphial clock
11
GPIOB->ODR|=0x30;//define SDA, SCL outputs, HiZ, Open drain, Fast
12
GPIOB->DDR|=0x30;//Bits 4 und 5 als Output,20MHz
13
GPIOB->CR2|=0x30;
14
15
#ifdef FAST_I2C_MODE
16
I2C->FREQR=16;// input clock to I2C - 16MHz
17
I2C->CCRL=15;// 900/62.5= 15, (SCLhi must be at least 600+300=900ns!)
18
I2C->CCRH=0x80;// fast mode, duty 2/1 (bus speed 62.5*3*15~356kHz)
19
I2C->TRISER=5;// 300/62.5 + 1= 5 (maximum 300ns)
20
#else
21
I2C->FREQR=8;// input clock to I2C - 8MHz
22
I2C->CCRL=40;// CCR= 40 - (SCLhi must be at least 4000+1000=5000ns!)
23
I2C->CCRH=0;// standard mode, duty 1/1 bus speed 100kHz
Sorry, nur oberflächlich: Hast du auch alle beteiligten Module
(mindestens aber das I2c-Modul) mit "Takt" versorgt? (Stichwort:
CLK->PCKENR1 oder peripheral clock gating)? In deinem Code fehlt das.
public schrieb:> ST stellt doch massig Bibliotheken zur Verfügung, eine Initialisierung> des I2C sollte doch auch enthalten sein...>> beste grüße
Hallo,
Die init aus meinem ersten Post ist dem Beispiel von ST zum I2C
entnommen und wurde auf meinen µC angepasst.
Natürlich gibt es Bibliotheken von ST. Habe das auch ausprobiert aber
bin auch zu keinem Ergbeniss gekommen.
Hier z.B das Programm mit den Inits aus den i2C lib das läuft zwar glatt
durch aber am Ausgnag passiert nichts. Schaut man sich dann die Register
an sieht man auch hier, dass das Busy Bit durchgehend auf 1 ist.
1
#include"stm8s.h"
2
#include"main.h"
3
#include"stm8s_eval_i2c_ee.h"
4
5
intmain(void){
6
GPIOB->ODR|=0x30;//define SDA, SCL outputs, HiZ, Open drain, Fast
Die Standard Library hilft dir nicht weiter. Schau dir die AN3281 (pdf
und zip) an und verwende die dort beschriebenen Funktionen. Die richtige
Reihenfolge bei der Initialisierung ist z.B. SEHR wichtig.
proethel schrieb:> Die Standard Library hilft dir nicht weiter. Schau dir die AN3281 (pdf> und zip) an und verwende die dort beschriebenen Funktionen. Die richtige> Reihenfolge bei der Initialisierung ist z.B. SEHR wichtig.
Danke für den Tip die habe ich auch schon gefunden und ausprobiert. Mein
erster Versuch ist auch von diesen abgeleitet. Aber auch wenn ich driekt
das Beispiel aus AN3281 verwende und halt den Port entsprechend zu
meinem µC anpasse bleibt er in der Abfrage vom Bussy Bit hängen und
springt letztendlich in einen Fehler.
Dann schau die deine Initialisierung an, besonders die Clock (und in dem
Zusammenhang auch die Option Bytes). Anhand deines Codes gehe ich davon
aus das du den internen Oszillator (HSI) mit 16Mhz verwenden möchtest,
der STM8 startet aber mit stanardmäßig 2MHz.
proethel schrieb:> Dann schau die deine Initialisierung an, besonders die Clock (und in dem> Zusammenhang auch die Option Bytes). Anhand deines Codes gehe ich davon> aus das du den internen Oszillator (HSI) mit 16Mhz verwenden möchtest,> der STM8 startet aber mit stanardmäßig 2MHz.
Ok Ausgehend von dem Code aus Beispiel AN3281.
Ich bin alle Register nochmal durch gegangen und bin der Meinung das
diese passen. Nur bei der Configurierung der Pins SDA/SCL in der Init
bin ich mir nicht sicher (Über Rückmeldung würde ich mich freuen).
Es ist immernoch das gleiche Problem in der erste While schleife von
I2C_WriteRegister bleibt das Programm hängen weil das Busy Bit gesetzt
bleibt.
Ich hab mal die Initialisierungssqequenz und die I2C-Funktionen
angehangen die ich auf einem STM8S-DISCOVERY verwende. Bei dir vermisse
ich die Initialisierung des Clock Controllers (CLK_ClockSwitchConfig())
um von der langsamen Startfrequenz auf die 16MHz zu schalten.
proethel schrieb:> Ich hab mal die Initialisierungssqequenz und die I2C-Funktionen> angehangen die ich auf einem STM8S-DISCOVERY verwende. Bei dir vermisse> ich die Initialisierung des Clock Controllers (CLK_ClockSwitchConfig())> um von der langsamen Startfrequenz auf die 16MHz zu schalten.
Vielen Dank für deine Lösung. Ich habe jetzt außer deine Init alles was
für den I2C wichtig ist raus genommen und in meine Init geschrieben.
Leider tritt auch hier wieder der gleiche Fehler auf, das er in der
Abfrage vom Busy Bit hängen bleibt und dann in den Fehler springt.
Ich verwende den externen Quarz auf dem Discovery-Board (HSE). Wenn du
den internen Takt (HSI) verwendest (ich gehe weiterhin davon aus) ist
die Funktion CLK_ClockSwitchConfig() anzupassen, also mindestens
CLK_SOURCE_HSE wäre dann falsch. Schau dir mal den Abschnitt "9.2 Master
clock switching, Figure 23. Clock switching flowchart (manual mode
example)" im Reference Manual an. Ich habe im Augenblick wenig Zeit,
aber ich werde mich heute abend wieder melden.
proethel schrieb:> Versuch doch einfach mal>> I2C_Init(1000,> 0xA0,> I2C_DUTYCYCLE_2,> I2C_ACK_NEXT,> I2C_ADDMODE_7BIT,> 2);
Hallo,
das habe ich auch schon probiert. Gleicher Fehler Busy Bit bleibt
gesetzt.
Prinzipiell ist es mir ertmal egal ob der µC mit derm Internen oder dem
externen Tackt läuft. Habe jetzt aber auch mal den Teil des Manuals
bezüglich des CLK angeschaut. Meiner Ansicht nach muss man eben nur
CLK_SOURCE_HSE zu CLK_SOURCE_HSI wechseln. Damit er mit dem interenn
Clock läuft dann bleibt er allerdings in der Schleife
1
while((CLK->SWCR&CLK_SWCR_SWIF)==0);
hängen da wohl das "Switch done" bit nicht kommt.
Ich saß gestern auch schon 3h mit meinem µC Proffessor dran aber auch
der konnte mir nicht helfen.
Hallo,
etwas verspätet aber hier die Lösung meines Problems.
Einfach im Programm ST Visual Develop Tools-Programmer und dort die
"Option Bytes" für I2C aktievieren (Siehe Bild1). Anschließend müssen
die OPtion Bytes noch Programmiert werden (Siehe Bild2).