Hallo zusammen,
möchte gerne einen STM32F407 als SMBus-Slave nutzen.
Nutze dazu die StdPeriph Driver.
Aus irgendeinem Grund funktioniert meine ISR nicht so wie sie sollte.
Auf der Leitung sieht alles richtig aus.
Sende mit einem Arduino Mirco(Master) die Addresse, 0xFF, 0x33,0XAA
Ich Emfange nur die ersten beiden Bytes (0xFF, 0x33) und RxNE wird nicht
reseted. Außerdem findet das Stop Event nicht statt, da im Status
Register 0x00000050 steht.
1 | void I2C3_EV_IRQHandler(void)
|
2 | {
|
3 | uint32_t dwLastEvent;
|
4 | dwLastEvent = I2C_GetLastEvent(I2C3);
|
5 |
|
6 | #ifdef DEBUG_STMSTUDIO
|
7 | CR1_DEBUG = I2C_ReadRegister(I2C3, I2C_Register_CR1);
|
8 | CR2_DEBUG = I2C_ReadRegister(I2C3, I2C_Register_CR2);
|
9 | Event_DEBUG = dwLastEvent;
|
10 | #endif
|
11 | switch(dwLastEvent)
|
12 | {
|
13 | /* Slave Receive ******************************************************/
|
14 | case I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED: //EV1
|
15 | GPIO_WriteBit(GPIOD,LEDBlue_Pin,Bit_SET);
|
16 |
|
17 |
|
18 | break;
|
19 |
|
20 | case (I2C_EVENT_SLAVE_BYTE_RECEIVED | 0x0004) : //EV2 + BTF
|
21 | //GPIO_WriteBit(GPIOD,LEDRed_Pin,Bit_SET);
|
22 | RxBuffer[ixRxBuffer] = I2C_ReceiveData(I2C3);
|
23 | ixRxBuffer++;
|
24 |
|
25 |
|
26 | break;
|
27 |
|
28 | case I2C_EVENT_SLAVE_STOP_DETECTED : //EV4
|
29 |
|
30 | I2C3->CR1 &= (uint16_t)~((uint16_t)I2C_CR1_STOP);
|
31 | ixRxBuffer=0;
|
32 | ixTxBuffer=0;
|
33 |
|
34 | break;
|
35 |
|
36 | default:
|
37 | DefaultEvent_DEBUG = I2C_GetLastEvent(I2C3);
|
38 | break;
|
39 |
|
40 | }
|