Forum: Mikrocontroller und Digitale Elektronik 3D_Hallsensor erfassen,I2C3 STM32F405


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Ma B. (drumstick)


Bewertung
0 lesenswert
nicht lesenswert
Guten Tag

Ich mache erste Schritte mit dem I2C-Bus des STM32F405 (Master) und 
setze die Standartlibary ein. Ich möchte die Werte der X-, Y- und 
Z-Achse des 3D_Hallsensors TLV493D-A1B6 (Slave) von Infineon erfassen. 
Dies funktioniert schon ordentlich.
Nur hängt sich der STM32F405-Prozessor von Zeit zur Zeit auf.
Ich habe einen Thread aufgesetzt der all 50ms auf den Bus bzw. den Slave 
anschreibt
1
void send_3D_Hall(void)
2
{
3
  I2C_start(I2C3, SLAVE_ADDRESS_3D_HALL_WRITE<<1, I2C_Direction_Transmitter);
4
  I2C_write(I2C3, CONFIG_3D_HALL_WRITE_RES1);
5
  I2C_write(I2C3, CONFIG_3D_HALL_WRITE_MOD1);
6
  I2C_write(I2C3, CONFIG_3D_HALL_WRITE_RES2);
7
  I2C_write(I2C3, CONFIG_3D_HALL_WRITE_MOD2);
8
  I2C_stop(I2C3);
9
}

Mittels Interrupt-Routine des I2C3_EV_IRQn - Handlers, starte ich den 
Lesezyklus:
1
void I2C3_EV_IRQHandler(void)
2
{
3
  NVIC_DisableIRQ(I2C3_EV_IRQn);
4
  receive_3D_Hall();
5
  NVIC_EnableIRQ(I2C3_EV_IRQn);
6
}
1
void receive_3D_Hall(void)
2
{
3
    I2C_start(I2C3, SLAVE_ADDRESS_3D_HALL_READ<<1, I2C_Direction_Receiver); 
4
    received_data[0]   = I2C_read_ack(I2C3); 
5
    received_data[1]   = I2C_read_ack(I2C3); 
6
    received_data[2]  = I2C_read_ack(I2C3); 
7
    received_data[3]   = I2C_read_ack(I2C3); 
8
    received_data[4]   = I2C_read_ack(I2C3); 
9
    received_data[5]  = I2C_read_ack(I2C3); 
10
    received_data[6]   = I2C_read_ack(I2C3); 
11
    received_data[7]   = I2C_read_ack(I2C3); 
12
    received_data[8]  = I2C_read_ack(I2C3); 
13
    received_data[9]   = I2C_read_nack(I2C3);
14
    trans_Data_3D_Hall();
15
}

Hier noch die Werte für die Mod1 und Mod2 Register des Sensors
1
#define CONFIG_3D_HALL_WRITE_RES1        0x00
2
#define CONFIG_3D_HALL_WRITE_MOD1        0x07
3
#define CONFIG_3D_HALL_WRITE_RES2        0x00
4
#define CONFIG_3D_HALL_WRITE_MOD2        0x40

Und hier die Init des I2C3:
1
void D3_Hall_i2c_Init(void)
2
{
3
  I2C_InitTypeDef I2C_InitStructure;
4
  
5
  NVIC_InitTypeDef   NVIC_InitStructure;
6
7
  NVIC_InitStructure.NVIC_IRQChannel                     = I2C3_EV_IRQn;
8
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority   = 0x05;
9
  NVIC_InitStructure.NVIC_IRQChannelSubPriority         = 0x01;
10
  NVIC_InitStructure.NVIC_IRQChannelCmd                 = ENABLE;
11
  NVIC_Init(&NVIC_InitStructure);
12
  NVIC_EnableIRQ(I2C3_EV_IRQn);   
13
  
14
  D3_Hall_i2c_Init_LowLewel();
15
  
16
  I2C_InitStructure.I2C_ClockSpeed           = 1000000;
17
  I2C_InitStructure.I2C_Mode                 = I2C_Mode_I2C;
18
  I2C_InitStructure.I2C_DutyCycle            = I2C_DutyCycle_2;
19
  I2C_InitStructure.I2C_OwnAddress1          = 0x00;
20
  I2C_InitStructure.I2C_Ack                  = ENABLE;
21
  I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
22
  I2C_Init(I2C3, &I2C_InitStructure);
23
  I2C_ITConfig(I2C3, I2C_IT_EVT, ENABLE);
24
  I2C_Cmd(I2C3, ENABLE);
25
}

Ich habe keine anderen Interrupts am laufen. Hat jemand eine Idee?
Vielen Dank schon mal!

von Ma B. (drumstick)


Bewertung
0 lesenswert
nicht lesenswert
Mittels debuggen sehe ich, dass die Abstände, in denen sich der 
Prozessor aufhängt sehr unterschiedlich sind. Er bleibt an verschiedenen 
Stellen hängen.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.