Benutzer Diskussion:Dualcorez80
Hi Leute! Ich bin als aktiver Schreiber neu in diesem Forum dabei ;) Ich habe auch schon die meisten Beiträge durchforstet, doch keiner konnte mir helfen...
Folgendes Problem: Ich verwende den STM32F107VC um mit einem ADXL345 Beschleunigungssensor und einem ITG3200 Gyrosensor zu kommunizieren. Beide mit I2C Schnittstelle. Diese möchte ich mit der I2C1 Schnittstelle des Cortex auslesen. Doch genau da liegt das Problem. Ich kann keine Startbedingung erzeugen.
[c]int main( void ) { char zahl[3]; GPIO_InitTypeDef GPIO_InitStructure; I2C_InitTypeDef I2C_InitStructure;
u8 address=0xA6;
int i=0;
SystemInit(); // Taktet Cortex auf 72MHz
gdm_Init(DSP_VERTICAL); // Initialisiert Touchscreen (DSP_VERTICAL -> richtige Drehung für Touchscreen sprintf(zahl, "%d", data1); gdmgraphics_print(zahl, 10, 10, BLACK, WHITE, FONT_7x11);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE); //Takt für I2C1 Schnittstelle aktivieren RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
GPIO_StructInit(&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; //Konfigurieren der Ausgabepins, haben aber anscheinend nix mit der I2C Schnittstelle zu tun, weil das ganz andere Pins sind
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //Taktgeschwindigkeit festliegen
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD; //Output open Drain konfigurieren
GPIO_Init(GPIOB, &GPIO_InitStructure);
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable; //Sendet nach erhalt eines Datenbytes oder der eigenen Adresse ein ACK
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; //legt die Bitlänge der eigenen Adresse im Slave-Mode fest
I2C_InitStructure.I2C_ClockSpeed = 100000;
I2C_InitStructure.I2C_OwnAddress1 = 0x00; //Festlegen der Taktgeschwindigkeit in Hz
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2; //legt das Verhältnis von low zu high ab 100kHz fest (=2/1)
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
I2C_Init(I2C1, &I2C_InitStructure);
I2C_Cmd(I2C1, ENABLE);
gdmgraphics_print("Generate Start", 10, 40, BLACK, WHITE, FONT_7x11);
I2C_GenerateSTART(I2C1, ENABLE); //Startbedingung erzeugen bei senden while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY));
gdmgraphics_print("After Start", 10, 50, BLACK, WHITE, FONT_7x11); //Diese Zeile wird noch ausgegeben
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); //in dieser Schleife bleibt das Programm haengen
gdmgraphics_print("After Checkevent", 10, 60, BLACK, WHITE, FONT_7x11);
I2C_Send7bitAddress(I2C1, 0xA6, I2C_Direction_Transmitter); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); gdmgraphics_print(zahl, 10, 70, BLACK, WHITE, FONT_7x11); I2C_SendData(I2C1,DATAX0); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); gdmgraphics_print(zahl, 10, 80, BLACK, WHITE, FONT_7x11); I2C_GenerateSTART(I2C1,ENABLE); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); I2C_Send7bitAddress(I2C1, ACC_R, I2C_Direction_Receiver); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));[/c]
Kann mir von euch bitte irgendjemand sagen ob in dem Code ein Fehler ist?
der Befehl gdmgraphics_print(...) gibt mir nur etwas auf meinem Display aus und auch wenn ich die weglasse funktioniert es nicht. Wenn ich allerdings das Timing selbst programmiere (mit Warteschleifen und ohne die I2C-Register) funktioniert alles tadellos
PS sollte irgendwas von der Formatierung nicht passen bitte entschuldigt, ich werde versuchen mich beim nächsten mal zu bessern ;)
hier ists falsch...
Das hier ist eine Benutzerdiskussionsseite aus der Artikelsammlung. Fragen gehören ins Forum: http://www.mikrocontroller.net/forum/all
77.198.181.110 20:45, 3. Okt. 2012 (UTC)