Forum: Mikrocontroller und Digitale Elektronik Inbetriebnahme des I2C bei einem STM8 Board


von X-Team (Gast)


Lesenswert?

Hallo,

zusammen ich habe für mein Problem zwar schon andere Beitrage in diesem 
Forum angesehen aber immer noch keine Lösung gefunden.

Ich habe für ein Projekt ein selbst designtes STM8 Borad mit einem 
STM8S105K6 nun versuche ich per I2C ein EEPROM anzusprechen.
SCL und SDA sind jeweils mit einem 4,7 K Pull-up versehen. Die Pins in 
der STM8_128_EVAL_H habe ich entsprechend angepasst. Steuere ich nun die 
Pins direkt an sehe ich am Oszi das toggeln.

Code:
1
 
2
/* Includes ------------------------------------------------------------------*/
3
#include "stm8s.h"
4
#include "stm8s_eval.h"
5
6
#define I2C_DIRECTION_RX1
7
8
void main(){
9
10
  GPIO_DeInit(GPIOB);
11
  GPIO_Init(GPIOB, GPIO_PIN_0,GPIO_MODE_OUT_PP_LOW_SLOW); /LED green
12
  GPIO_Init(GPIOB, GPIO_PIN_2,GPIO_MODE_OUT_PP_LOW_SLOW);  /LED red
13
  GPIO_WriteHigh(GPIOB, GPIO_PIN_0);
14
  GPIO_WriteHigh(GPIOB, GPIO_PIN_2);
15
  
16
  GPIO_Init(sEE_I2C_SCL_GPIO_PORT, sEE_I2C_SCL_PIN, GPIO_MODE_OUT_OD_LOW_SLOW);
17
  GPIO_Init(sEE_I2C_SDA_GPIO_PORT, sEE_I2C_SDA_PIN, GPIO_MODE_OUT_OD_LOW_SLOW);
18
  
19
  TIM3_DeInit();
20
  TIM3_TimeBaseInit(TIM3_PRESCALER_2,20);
21
  TIM3_Cmd(ENABLE);
22
  
23
  while(1){
24
    while(TIM3_GetCounter() < 2) {        
25
        GPIO_WriteLow(sEE_I2C_SCL_GPIO_PORT, sEE_I2C_SCL_PIN);
26
        GPIO_WriteHigh(sEE_I2C_SDA_GPIO_PORT, sEE_I2C_SDA_PIN);
27
        GPIO_WriteLow(GPIOB, GPIO_PIN_0);
28
      } 
29
      while (TIM3_GetCounter() >= 5) {
30
        GPIO_WriteHigh(sEE_I2C_SCL_GPIO_PORT, sEE_I2C_SCL_PIN);
31
        GPIO_WriteLow(sEE_I2C_SDA_GPIO_PORT, sEE_I2C_SDA_PIN);
32
        GPIO_WriteHigh(GPIOB, GPIO_PIN_0);
33
      }      
34
  }
35
}

Versuche ich aber den I2C zu konfigurieren kann ich nichts am Ausgnag 
messen.

Code:
1
/* Includes ------------------------------------------------------------------*/
2
#include "stm8s.h"
3
#include "stm8s_eval.h"
4
5
#define I2C_DIRECTION_TX
6
7
void main(){
8
9
// Hardware I2C konfig.
10
I2C_DeInit();
11
I2C_Init(100000, 0xA0, I2C_DUTYCYCLE_2, I2C_ACK_CURR, I2C_ADDMODE_7BIT, 16);
12
I2C_Cmd  (ENABLE);
13
14
 
15
  while(1){
16
    I2C_GenerateSTART(ENABLE);
17
18
    I2C_Send7bitAddress(0xa0, I2C_DIRECTION_TX);
19
  
20
    I2C_SendData(0x00);                              // set register pointer 00h
21
    I2C_SendData(0x00);                              // write 0x00 to 00h (oscillator enabled)
22
    I2C_GenerateSTOP(ENABLE);                        // stop
23
  }
24
}


Was könnte mein Fehler sein?

Gruß

X-Team

von Arduinoquäler (Gast)


Lesenswert?

X-Team schrieb:

> I2C_Send7bitAddress(0xa0, I2C_DIRECTION_TX);

Was verlangt denn deine Funktion als Übergabeparameter?
Und was übergibst du? Als zweiten Parameter erst mal nix.

von X-Team (Gast)


Lesenswert?

Arduinoquäler schrieb:
> X-Team schrieb:
>
>> I2C_Send7bitAddress(0xa0, I2C_DIRECTION_TX);
>
> Was verlangt denn deine Funktion als Übergabeparameter?
> Und was übergibst du? Als zweiten Parameter erst mal nix.

Ich verwende die Funktion aus der stm8s_i2c.h:

/Transmits the 7-bit address (to select the) slave device.

Parameters:
Address : Specifies the slave address which will be transmitted.
Direction : Specifies whether the I2C device will be a Transmitter or a 
Receiver. This parameter can be any of the I2C_Direction_TypeDef 
enumeration.

Return values:
None/

http://stm32-spl-doc-online.esy.es/STM8S_StdPeriph_Lib_V2.1.0/stm8s-a_stdperiph_lib_um_html/stm8s__i2c_8c.html

Ich übergeb eine Adresse und die Richtung. Das so erstmal keine 
Kommunikation möglich ist ist mir klar. Bis jetzt ist ja auch nur ein 
Oszi angeschlossen.


Theoretisch müsste der µC so ja den I2C initalisieren und dann Starten 
und die Adresse an den EEPROM schicken. Ein Ack bekommt er dann 
natürlich nicht zurück.

von I2C (Gast)


Lesenswert?

X-Team schrieb:
> Ich verwende die Funktion aus der stm8s_i2c.h:
>
> /Transmits the 7-bit address (to select the) slave device.
>
> Parameters:
> Address : Specifies the slave address which will be transmitted.
> Direction : Specifies whether the I2C device will be a Transmitter or a
> Receiver. This parameter can be any of the I2C_Direction_TypeDef
> enumeration.

Eine 7-bit Adresse kann nicht größer als 0x7F werden.
Außerdem mußt Du auch die stm8s_i2c.h includen, wenn Du die Funktionen 
daraus benutzen willst.

von Arduinoquäler (Gast)


Lesenswert?

X-Team schrieb:
> Direction : Specifies whether the I2C device will be a Transmitter or a
> Receiver. This parameter can be any of the I2C_Direction_TypeDef
> enumeration.

... und du definierst oder re-definierst ein Token zur Übergabe
an die Funktion.

Siehe: #define I2C_DIRECTION_TX

Das wird die Funktion nicht verstehen. Im besten Fall wird sie
nichts machen indem sie die Gültigkeit überprüft. Oder sie
macht evtl. was Falsches.

von NE 5. (x-team)


Angehängte Dateien:

Lesenswert?

I2C schrieb:
> X-Team schrieb:
>> Ich verwende die Funktion aus der stm8s_i2c.h:
>>
>> /Transmits the 7-bit address (to select the) slave device.
>>
>> Parameters:
>> Address : Specifies the slave address which will be transmitted.
>> Direction : Specifies whether the I2C device will be a Transmitter or a
>> Receiver. This parameter can be any of the I2C_Direction_TypeDef
>> enumeration.
>
> Eine 7-bit Adresse kann nicht größer als 0x7F werden.
> Außerdem mußt Du auch die stm8s_i2c.h includen, wenn Du die Funktionen
> daraus benutzen willst.

Wenn ich das im datenblatt (siehe Anhang) richtig versthe muss die 
Adresse als 8 bit angegeben und eben das letzte bit mit 0 deklariert 
werden.

Durch die Kontrollinstanz der Funktiion geht das Programm beim Debuggen 
auch glatt durch.
1
void I2C_Send7bitAddress(uint8_t Address, I2C_Direction_TypeDef Direction)
2
{
3
  /* Check function parameters */
4
  assert_param(IS_I2C_ADDRESS_OK(Address));
5
  assert_param(IS_I2C_DIRECTION_OK(Direction));
6
7
  /* Clear bit0 (direction) just in case */
8
  Address &= (uint8_t)0xFE;
9
10
  /* Send the Address + Direction */
11
  I2C->DR = (uint8_t)(Address | (uint8_t)Direction);
12
}

stm8s_i2c.h ist über stm8s.h -> stm8s_conf.h includiert.


Habe aber trotzdem die Adresse auf 0x70 gesetzt. Dies ändert aber leider 
nichts.

von NE 5. (x-team)


Lesenswert?

Arduinoquäler schrieb:
> X-Team schrieb:
>> Direction : Specifies whether the I2C device will be a Transmitter or a
>> Receiver. This parameter can be any of the I2C_Direction_TypeDef
>> enumeration.
>
> ... und du definierst oder re-definierst ein Token zur Übergabe
> an die Funktion.
>
> Siehe: #define I2C_DIRECTION_TX
>
> Das wird die Funktion nicht verstehen. Im besten Fall wird sie
> nichts machen indem sie die Gültigkeit überprüft. Oder sie
> macht evtl. was Falsches.

Du hast recht ich mache eine unnötigee ´Redefinition da I2C_DIRECTION_TX
bereits in der stm8s_i2c.h definiert wurde. Ändert leider aber auch 
nichts.

Code:
1
typedef enum
2
{
3
  I2C_DIRECTION_TX = (uint8_t)0x00,  /*!< Transmission direction */
4
  I2C_DIRECTION_RX = (uint8_t)0x01   /*!< Reception direction */
5
} I2C_Direction_TypeDef;

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.