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!