Benutzer Diskussion:Dualcorez80

Aus der Mikrocontroller.net Artikelsammlung, mit Beiträgen verschiedener Autoren (siehe Versionsgeschichte)

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)