Gast
#2909466
Hallo liebe community, ich möchte für ein Drucksensor über I2C auslesen, bis der jedoch da ist möchte ich Testweise den Baustein CS43L22 auf dem Discovery Board auslesen. Nach studenlangem Durchkauen aller Beiträge zum I2C des STM32 in diesem Forum und dutzend anderer im WWW bin ich langsam am Verzweifeln. Mein Problem ist jetzt die while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); In dieser Schleife bleibt er stecken. Ich hatte heute morgen die Möglichkeit mit einem Oszi beide Pins auszulesen. In der Funktion I2C_GenerateSTART(I2Cx, ENABLE); wird die SCL Leitung bei der Funktion I2Cx->CR1 |= I2C_CR1_START; auf Low gezogen. Allerdings ist nachfolgend weder ein Clocksignal noch ein Datensignal vorhanden. Es wäre nett wenn vielleicht jemand der schon den I2C des STM32F4 zum laufen gebracht hat kurz über den Code schauen könnte. Hierzu habe ich folgende Initialisierung und Schreibe/Lesefunktion: void I2C1_Initialisation() { //Modul clock activate RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE); //Modul clock activate RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); // Set alternate function for I2C1 output GPIO_PinAFConfig(GPIOB,GPIO_PinSource6, GPIO_AF_I2C1); GPIO_PinAFConfig(GPIOB,GPIO_PinSource9, GPIO_AF_I2C1); // I2C1 output settings GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; GPIO_Init(GPIOB, &GPIO_InitStructure); //Modul deinitialising I2C_DeInit(I2C1); //I2C1 Modul settings I2C_InitStructure.I2C_Ack = I2C_Ack_Enable; I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; I2C_InitStructure.I2C_ClockSpeed = 100000; I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2; I2C_InitStructure.I2C_Mode = I2C_Mode_I2C; I2C_InitStructure.I2C_OwnAddress1 = 0x33; // Modul on I2C_Cmd(I2C1, ENABLE); I2C_Init(I2C1, &I2C_InitStructure); } void I2C_writeOneByte(I2C_TypeDef* I2Cx, uint8_t slave, uint8_t register_address, uint8_t Data) { while(I2C_GetFlagStatus(I2Cx, I2C_FLAG_BUSY)); /* Send I2C1 START condition */ I2C_GenerateSTART(I2Cx, ENABLE); /* Test on I2C1 EV5 and clear it */ while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_MODE_SELECT)); /* Send slave Address for write */ I2C_Send7bitAddress(I2Cx, slave, I2C_Direction_Transmitter); /* Test on I2C1 EV6 and clear it */ while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); /* Send I2C1 slave register address */ I2C_SendData(I2Cx, register_address); /* Test on I2C1 EV8_2 and clear it */ while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); /* Send I2C1 slave Register data */ I2C_SendData(I2Cx, Data); /* Test on I2C1 EV8_8 and clear it */ while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); /* Send I2C1 STOP Condition */ I2C_GenerateSTOP(I2Cx, ENABLE); } Gruß Jonny