i2c-interrupt-handler, stm32
Ich habe einige Probleme mit I2C2-interrupts, ich habe aktiviert die Unterbrechung, aber der handler interrupt nie ausgeführt wird.
Hier ist die i2c2 Initialisierung:
void i2c2InitSlave(void)
{
I2C_DeInit(I2C2);
GPIO_InitTypeDef GPIO_InitStructure;
I2C_InitTypeDef I2C_InitStructure;
/*I2C2 Peripheral clock enable */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2, ENABLE);
/* Enable GPIO clock */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOH, ENABLE);
//I2C2 SCL and SDA Pin configuration
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOH, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOH, GPIO_PinSource4, GPIO_AF_I2C2);
GPIO_PinAFConfig(GPIOH, GPIO_PinSource5, GPIO_AF_I2C2);
/* Initialize I2C peripheral */
/* I2C Init */
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
I2C_InitStructure.I2C_OwnAddress1 = SLAVE_ADDRESS;
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
I2C_InitStructure.I2C_ClockSpeed = 100000;
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
/* Enable I2C2 */
I2C_Cmd(I2C2, ENABLE);
I2C_Init(I2C2, &I2C_InitStructure);
Tx_Index = 0;
Rx_Index = 0;
}
Hier ist die interrupt-Konfiguration:
NVIC_InitTypeDef NVIC_InitStructure;
/* Configure the I2C event priority */
NVIC_InitStructure.NVIC_IRQChannel = I2C2_EV_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
Und hier ist der interrupt-handler:
/**
* @brief Interrupt handler for i2c interface.
* @param None
* @retval None
*/
void I2C2_EV_IRQHandler(void)
{
switch(I2C_GetLastEvent(I2C2))
{
case I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED :
break;
case I2C_EVENT_SLAVE_BYTE_RECEIVED:
i2c_read_packet[Rx_Index] = I2C_ReceiveData(I2C2); //Store the packet in i2c_read_packet.
Rx_Index++;
break;
case I2C_EVENT_SLAVE_STOP_DETECTED :
Rx_Index = 0;
packets_recv_i2c++;
i2cProcessPacket();
break;
case I2C_EVENT_SLAVE_TRANSMITTER_ADDRESS_MATCHED:
I2C_SendData(I2C2, i2c_packet_to_send[0]);
Tx_Index++;
break;
case I2C_EVENT_SLAVE_BYTE_TRANSMITTED:
I2C_SendData(I2C2, i2c_packet_to_send[Tx_Index]);
Tx_Index++;
break;
case I2C_EVENT_SLAVE_ACK_FAILURE:
Tx_Index = 0;
packets_sent_i2c++;
break;
default:
break;
}
}
Irgendeine Idee?
BR,
Edgar.
InformationsquelleAutor edgar.epi | 2013-08-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Okay, so dass Sie aufgeführt habe, die interrupt config und Hundeführer, aber was ist mit deiner I2C-Initialisierung im Allgemeinen?
Werden Sie nicht erzeugen alle unterbricht, wenn der I2C ist nicht initialisiert.
Sollten Sie erkennen, dieser block (oder einem analog davon):
Wo I2C_Config könnte wie folgt definiert:
Und die I2C_InitTypeDef ist wie folgt definiert:
Hinweis: die Verwendung einer Reihe von
#define
's (vielleicht in einer Kopf -) während der Konfiguration macht das Leben leichter. Zum Beispiel:...Und die MEISTEN wichtiger ist, werfen Sie einen Blick auf "stm32f4xx_i2c.c" verfügbar hier. Lesen Sie die "Verwendung Dieses Treibers" Kommentar am Anfang.
Wenn Sie bereits alle diese in Ihrem Projekt, poste es, damit wir sehen können, was Sie getan haben dort.
Ich hatte bereits initilization code. Ich habe gewechselt von i2c3 zu i2c2, aber funktioniert immer noch nicht.
Müssen Sie rufen Sie I2C_ITConfig(I2C2, ENABLE). Ich sehe, dass Sie Ihren Beitrag bearbeitet Ihre init-code, aber nicht aufgeführt. Probieren Sie es aus.
Ich werde versuchen Sie es so bald wie möglich. Ich werde Sie wissen lassen. Danke!
InformationsquelleAutor bunkerdive