Ich habe wieder etwas Zeit gefunden und das Projekt weiter verfolgt.
Meiner Meinung nach ist der I2C1 richtig initialisiert und der
Event-Interrupt sollte auch korrekt eingestellt werden. Wenn ich aber
über den Raspi ein I2C-Device-Detect sende reagiert der Handler nicht.
Eigentlich müsste er aber reagieren sobald der Bus angesprochen wird?
(I2C-Device-Detect listet alle im Bus vorhandenen Devices auf, ich denke
also das es alle Slaves auf Präsenz prüft, also auch anspricht)
Hier der Code:
I2C- und NVIC-Init:
1 | GPIO_InitTypeDef GPIO_InitStructure;
|
2 | I2C_InitTypeDef I2C_InitStructure;
|
3 |
|
4 | RCC_APB1PeriphClockCmd(RCC_APB1ENR_I2C1EN, ENABLE);
|
5 | RCC_APB2PeriphClockCmd(RCC_APB2ENR_IOPBEN, ENABLE);
|
6 | RCC_APB2PeriphClockCmd(RCC_APB2ENR_AFIOEN, ENABLE);
|
7 |
|
8 | GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
|
9 | GPIO_InitStructure.GPIO_Pin = SCL_Pin | SDA_Pin;
|
10 | GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
|
11 | GPIO_Init(I2C_Port, &GPIO_InitStructure);
|
12 |
|
13 | I2C_StructInit(&I2C_InitStructure);
|
14 | I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
|
15 | I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
|
16 | I2C_InitStructure.I2C_OwnAddress1 = I2C_Adress;
|
17 | I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
|
18 | I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
|
19 | I2C_InitStructure.I2C_ClockSpeed = 100000;
|
20 | I2C_Init(I2C1, &I2C_InitStructure);
|
21 | NVIC_InitTypeDef NVIC_InitStructure;
|
22 |
|
23 | /* Configure the I2C event priority */
|
24 | NVIC_InitStructure.NVIC_IRQChannel = I2C1_EV_IRQn;
|
25 | NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
|
26 | NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
|
27 | NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
|
28 | NVIC_Init(&NVIC_InitStructure);
|
29 | NVIC_InitStructure.NVIC_IRQChannel = I2C1_ER_IRQn;
|
30 | NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
|
31 | NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
|
32 | NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
|
33 | NVIC_Init(&NVIC_InitStructure);
|
34 |
|
35 | I2C_ITConfig(I2C1, I2C_IT_BUF | I2C_IT_EVT | I2C_IT_ERR, ENABLE);
|
36 | I2C_Cmd(I2C1, ENABLE);
|
Die Interrupts habe ich einfach mit einem Delay versehen und einen
Breakpoint gesetzt um zu sehen, ob sie überhaupt greifen. Wie gesagt tun
sie das nicht.
1 | void I2C1_ER_IRQHandler(void){
|
2 | Delay_Ms(1000);
|
3 | }
|
4 |
|
5 | void I2C1_EV_IRQHandler(void){
|
6 | Delay_Ms(1000);
|
7 | }
|
Ist meine Annahme korrekt, dass die Breakpoints der Interrupt-Handler
anschlagen müssten? Habe ich in der Initialisierung doch einen Fehler
drin den ich nur nicht sehe?