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


von Ma B. (drumstick)


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)


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.

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.