Skocz do zawartości

Problem z szyną I2C w procesorze STM32F103VBT6


mieszko11b

Pomocna odpowiedź

Witam wszystkich forumowiczów

Mam problem z poprawnym skonfigurowaniem szyny I2C w procesorze STM32F103VBT6. Kiedy uruchamiam na nim poniższy kod:

#include "stm32f10x.h"

void RCC_Conf(void);
void GPIO_Conf(void);


int main(void)
{
#ifdef DEBUG
 		debug();
#endif

 	RCC_Conf();
 	GPIO_Conf();

 	I2C_InitTypeDef I2C_InitStructure;
 	int RxIndex = 0;
 	int TxIndex = 0;
 	char I2C1_TxBuf[8] = {'a', 'l', 'a', 'm', 'a', 'k', 'o', 't'};
 	char I2C2_RxBuf[8];

 	I2C_Cmd(I2C1, ENABLE);
 	I2C_Cmd(I2C2, ENABLE);

 	// Konfiguracja I2C1
 	I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
 	I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
 	I2C_InitStructure.I2C_OwnAddress1 = 0x03;
 	I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
 	I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
 	// Czestotliwosc zegara
 	I2C_InitStructure.I2C_ClockSpeed = 100000;
 	I2C_Init(I2C1, &I2C_InitStructure);

 	// Konfiguracja I2C2
	I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
 	I2C_InitStructure.I2C_OwnAddress1 = 0x05;
 	I2C_Init(I2C2, &I2C_InitStructure);

 	// START
 	I2C_GenerateSTART(I2C1, ENABLE);
 	// Czekamy na cfg
 	while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
 	// Adres
 	I2C_Send7bitAddress(I2C1, 0x05, I2C_Direction_Transmitter);
 	// Czekamy na adres
 	while(!I2C_CheckEvent(I2C2, I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED));
 	// Czekamy na gotowosc do nadawania
 	while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));

 	// Petla transmisji danych
 	while(RxIndex < 8) {
 		// Wyslij bajt
 		I2C_SendData(I2C1, I2C1_TxBuf[TxIndex++]);
 		// Czekaj na odbiór
 		while(!I2C_CheckEvent(I2C2, I2C_EVENT_SLAVE_BYTE_RECEIVED));
 		// Odczytaj bajt
 		I2C2_RxBuf[RxIndex++] = I2C_ReceiveData(I2C2);
 		// Czekaj na potw. wysłania
 		while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
 	}

 	// STOP
 	I2C_GenerateSTOP(I2C1, ENABLE);
 	// Czekamy na STOP
 	while(!I2C_CheckEvent(I2C2, I2C_EVENT_SLAVE_STOP_DETECTED));

 	// Koniec
 	I2C_GetFlagStatus(I2C2, I2C_FLAG_STOPF);
 	I2C_Cmd(I2C2, ENABLE);
}

void RCC_Conf(void)
{
 	ErrorStatus HSEStartUpStatus;

 	// Reset ustawien RCC
 	RCC_DeInit();

 	// Wlacz HSE
 	RCC_HSEConfig(RCC_HSE_ON);

 	// Czekaj za HSE bedzie gotowy
 	HSEStartUpStatus = RCC_WaitForHSEStartUp();

 	if(HSEStartUpStatus == SUCCESS)
 		{
   	FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

   	// zwloka dla pamieci Flash
   	FLASH_SetLatency(FLASH_Latency_2);

  	// HCLK = SYSCLK
   	RCC_HCLKConfig(RCC_SYSCLK_Div1);

   	// PCLK2 = HCLK
   	RCC_PCLK2Config(RCC_HCLK_Div1);

   	// PCLK1 = HCLK/4
   	RCC_PCLK1Config(RCC_HCLK_Div2);

   	// PLLCLK = 8MHz * 9 = 72 MHz
   	RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

   	// Wlacz PLL
   	RCC_PLLCmd(ENABLE);

   	// Czekaj az PLL poprawnie sie uruchomi
   	while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);

   	// PLL bedzie zrodlem sygnalu zegarowego
   	RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

   	// Czekaj az PLL bedzie sygnalem zegarowym systemu
   	while(RCC_GetSYSCLKSource() != 0x08);

 		// Wlacz taktowanie
 		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
 		RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1 | RCC_APB1Periph_I2C2, ENABLE);
 	}
}

void GPIO_Conf(void)
{
// Konfiguracja GPIO do I2C
GPIO_InitTypeDef GPIO_InitStructure;

GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_10 | GPIO_Pin_11;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}

Program zawiesza się w linijce:

// Czekamy na cfg
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));

Wiem, że powyższy program nie ma sensu, przesyłam dane do samego siebie, ale nie posiadam urządzenia z którym można komunikować się za pomocą szyny I2C, a chcę poprawnie ją skonfigurować. Co może być nie tak?

Pozdrawiam, Mieszko Grodzicki

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Gość
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.