Forum: Mikrocontroller und Digitale Elektronik STM32 I2C Slave Transmitter Modus


von Vual (Gast)


Lesenswert?

Hi Leute,
zu erst ein mal: ich habe das ganze Internet danach durchsucht. Entweder 
das Problem wurde nicht weiter behandelt (keine Lösung) oder die Lösung 
wurde ganz einfach nicht mehr im Forum veröffentlicht.

Es geht um den STM32-Discovery Board im I2C-Slave (Transmitter) Modus. 
Ich möchte ihn mit meinem Arduino mega (Master) per I2C ansprechen, doch 
leider gibt es kein ACK. Ich sniffe mit einem Saleae LA mit. Ich habe 
versucht zu debuggen bzw. wenn die Adresse erkannt wurde, soll LED 
aufleuchten etc.. alles ohne Erfolg!

Es soll später mal eine Matrixtastatur einlesen und an den Arduino per 
i2c senden. (Schulprojekt)

Ich muss ehrlich zugeben, ich habe nirgends ein i2c Beispiel im Slave 
Modus gefunden.

Könnt Ihr einen Fehler finden, oder ein Tipp geben was man machen 
könnte?

Der ganze Code (aus tutorials) befindet sich in der main.c:
1
#include "stm32f10x_conf.h"
2
3
I2C_TypeDef * I2C_Module;
4
volatile uint8_t deviceAddress;
5
volatile uint8_t i2cBusyFlag;
6
7
void I2C1_EV_IRQHandler(void);
8
void I2C1_ER_IRQHandler(void);
9
10
11
#define I2C_OWN_ADRESS 44
12
13
// default: PB6 - I2C1_SCL; PB7 - I2C1_SDA
14
15
int main(void)
16
{
17
  GPIO_InitTypeDef GPIO_InitStructure;
18
  NVIC_InitTypeDef NVIC_InitStructure;
19
  I2C_InitTypeDef I2C_InitStructure;
20
21
  SystemInit();
22
23
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
24
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
25
26
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
27
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
28
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
29
  GPIO_Init(GPIOB, &GPIO_InitStructure);
30
31
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
32
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
33
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
34
  GPIO_Init(GPIOC, &GPIO_InitStructure);
35
36
  NVIC_InitStructure.NVIC_IRQChannel = I2C1_EV_IRQn;
37
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
38
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
39
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
40
  NVIC_Init(&NVIC_InitStructure);
41
42
  NVIC_InitStructure.NVIC_IRQChannel = I2C1_ER_IRQn;
43
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
44
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
45
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
46
  NVIC_Init(&NVIC_InitStructure);
47
48
  I2C_DeInit(I2C1);
49
50
  I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
51
  I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
52
  I2C_InitStructure.I2C_ClockSpeed = 100000;
53
  I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
54
  I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
55
  I2C_InitStructure.I2C_OwnAddress1 = I2C_OWN_ADRESS;
56
  I2C_Init(I2C1, &I2C_InitStructure);
57
58
  I2C_ITConfig(I2C1, I2C_IT_EVT, ENABLE);
59
  I2C_ITConfig(I2C1, I2C_IT_BUF, ENABLE);
60
  I2C_ITConfig(I2C1, I2C_IT_ERR, ENABLE);
61
62
  I2C_Cmd(I2C1, ENABLE);
63
64
  while(1)
65
  {
66
67
  }
68
}
69
70
void I2C3_EV_IRQHandler()
71
 {
72
     switch (I2C_GetLastEvent(I2C1))
73
     {
74
75
    case I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED:
76
      GPIO_WriteBit(GPIOC, GPIO_Pin_9, Bit_SET);
77
        break;
78
79
    case I2C_EVENT_SLAVE_BYTE_RECEIVED:
80
      GPIO_WriteBit(GPIOC, GPIO_Pin_9, Bit_SET);
81
        break;
82
83
    case I2C_EVENT_SLAVE_STOP_DETECTED:
84
      GPIO_WriteBit(GPIOC, GPIO_Pin_9, Bit_SET);
85
        break;
86
    }
87
88
    I2C_CleanADDRandSTOPF();
89
}
90
91
inline void I2C_CleanADDRandSTOPF()
92
{
93
  while ((I2C1->SR1 & I2C_SR1_ADDR) == I2C_SR1_ADDR)
94
  {
95
    volatile uint32_t temp;
96
    temp=I2C1->SR1;
97
    temp=I2C1->SR2;
98
  }
99
  while ((I2C1->SR1&I2C_SR1_STOPF) == I2C_SR1_STOPF)
100
  {
101
    volatile uint32_t temp;
102
    temp=I2C1->SR1;
103
    I2C1->CR1 |= 0x1;
104
  }
105
}
106
107
void I2C1_ER_IRQHandler(void){
108
109
}

von Vual (Gast)


Lesenswert?

hier der Arduino code:
1
// Wire Master Writer
2
// by Nicholas Zambetti <http://www.zambetti.com>
3
4
// Demonstrates use of the Wire library
5
// Writes data to an I2C/TWI slave device
6
// Refer to the "Wire Slave Receiver" example for use with this
7
8
// Created 29 March 2006
9
10
// This example code is in the public domain.
11
12
13
#include <Wire.h>
14
void setup()
15
{
16
  Wire.begin(); // join i2c bus (address optional for master)
17
}
18
19
byte x = 1;
20
21
void loop()
22
{
23
  Wire.beginTransmission(44); // transmit to device
24
  Wire.write(x);        // sends five bytes
25
  Wire.endTransmission();    // stop transmitting
26
 
27
  delay(5);
28
}

von Vual (Gast)


Angehängte Dateien:

Lesenswert?

und hier Bild vom LA (sorry für die 3 Beiträge, irgendwie finde ich kein 
Bearbeiten-Button)

von Vual (Gast)


Lesenswert?

Hat den niemand ein Beispielcode für den Slave-Betrieb? Ich wäre sehr 
dankbar!
Als Master bekomme ich den zum laufen, aber als slave nicht.

von Vual (Gast)


Lesenswert?

ok, habs hinbekommen. hat sich erledigt

von Daniel (Gast)


Lesenswert?

Hallo Vual,

ich suche auch hän­de­rin­gend nach einer funktionierenden Slave Routine 
für den STM32, könntest du bitte deine Lösung posten?

von Themroc (Gast)


Lesenswert?

Hallo,

kannst du vielleicht deine Lösung posten.
Ich versuche auch seit Tagen einen Arduino als Master (Receive) und 
STM32 Slave (Transmitt) zu konfigurieren. Leider bis jetzt ohne Erfolg.

Danke im Voraus.
Grüße
Themroc

von Uwe B. (derexponent)


Lesenswert?

@Themroc,

hier gibt es ein fertiges I2C-Slave Demo
(für STM32F4 und CooCox)

kopier dir das notwendige raus

http://mikrocontroller.bplaced.net/wordpress/?page_id=2565

Gruss Uwe

von Themroc (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Uwe,

vielen Dank für den Tipp!

Die von die Empfohlene Slave-Routine sieht sehr potent aus.
Ich habs auf dem STM32F100 umgeschrieben aber die Kommunikation zwischen 
Arduino (Master, Write) und STM32 (Slave, Read) funktioniert leider noch 
nicht.

Bin momentan mit meinem Latein am Ende, warum es immer noch nicht geht.

Im Anhang befindetn sich die aktuellen Datein des Arduino-Sketch + 
STM32-Coocox-Projekt für diejenigen, die auch daran basteln wollen.

Gruß
Themroc

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.