Skocz do zawartości

EEPROM STM32, część komórek na stronach niedostępna -nan(0x7fffff)


DeadGeneratio

Pomocna odpowiedź

Dzień dobry. Przychodzę z następującym kłopotem - podczas zapisu wielu stron na pamięci EEPROM AT24C256 na późniejszych stronach komórki nie są zapisywane ani odczytywane - są po prostu niedostępne. Do zmiennej bufor dane są przekazywane poprawnie, ale wysyłane po linii I2C już nie. Czy ktoś się kiedyś spotkał z takim problemem?

int page;
float buffer [ 15 ];
float read[15];
float volume[135] = {
		0.33497965468761853, -0.6698918138928149, 0.3349121660043874,  //-9,5dB
		-1.9998833845005322, 0.9998833912997229,

		0.3548278429500188, -0.7095841911805776, 0.35475635543261486,  //-9dB
		-1.9998799792664808, 0.9998799864685366,

		0.37585205582238584, -0.7516283807295591, 0.37577633253596465, //-8,5dB
		-1.9998764745978013, 0.9998764822265922,

		0.39812197223041335, -0.7961637263514505, 0.3980417622018483,  //-8dB
		-1.9998728675909494, 0.9998728756717601,

		0.42171139939261837, -0.843337827611774, 0.4216264367787691,   //-7,5dB
		-1.9998691552575971, 0.9998691638172102,

		0.446698517397111, -0.8933070289341434, 0.4466085206038175,    //-7dB
		-1.9998653345221553, 0.9998653435889401,

		0.473166138266847, -0.9462369376785689, 0.4730708090157288,    //-6,5dB
		-1.999861402219226, 0.9998614118232325,

		0.5012019803715327, -1.0023029729099755, 0.5011010027115024,   //-6dB
		-1.9998573550909795, 0.999857365264039,

		0.5308989590951746, -1.061690946674736, 0.5307919983553901,    //-5,5dB
		-1.9998531897844563, 0.9998532005602851,

		0.5623554947220962, -1.1245976797106674, 0.5622421964028834,   //-5dB
		-1.999848902848789, 0.9998489142631014,

		0.5956758385612584, -1.1912316536299605, 0.5955558271593283,   //-4,5dB
		-1.9998444907323427, 0.9998445028229689,

		0.6309704183891114, -1.261813701735281, 0.6308432961531816,    //-4dB
		-1.999839949779772, 0.9998399625867838,

		0.6683562043551746, -1.336577740757202, 0.6682215499678705,    //-3,5dB
		-1.999835276228995, 0.9998352897948383,

		0.7079570965622899, -1.415771545936615, 0.7078144637439604,    //-3dB
		-1.9998304662080741, 0.9998304805777095,

		0.7499043356052604, -1.4996575720192897, 0.7497532516350814,   //-2,5dB
		-1.9998255157320097, 0.999825530953062,

		0.7943369374275937, -1.5885138228817404, 0.7941769015770617,   //-2dB
		-1.999820420699438, 0.9998204368223531,

		0.8414021539365865, -1.6826347726685829, 0.8412326358102095,   //-1,5dB
		-1.9998151768892325, 0.9998151939674457,

		0.8912559609022503, -1.782332341492082, 0.8910763986799437,    //-1dB
		-1.9998097799570087, 0.9998097980471207,

		0.9440635747559143,	-1.887936928925224, 0.943873373331275,     //-0,5dB
		-1.9998042254315227, 0.9998042445934882,

		1, -1.999798508710969, 0.9997985290082942, -1.999798508710969, //0dB
		0.9997985290082942,

		1.059250697452815, -2.118294020557427, 1.0590433434019373,     //0,5dB
		-1.999798508710969, 0.9997985290082942,

		1.1220121310466908, -2.243810832897577, 1.1217987221482113,    //1dB
		-1.999798508710969, 0.9997985290082942,

		1.1884923223947041, -2.37676498394126, 1.1882726818438811,     //1,5dB
		-1.999798508710969, 0.9997985290082942,

		1.2589116190900453, -2.517597163712065, 1.258685564919345,     //2dB
		-1.999798508710969, 0.9997985290082942,

		1.333503425064056, -2.6667741747591274, 1.3332707699923967,    //2,5dB
		-1.999798508710969, 0.9997985290082942,

		1.412514974220637, -2.8247904794215426, 1.4122755254982307,    //3dB
		-1.999798508710969, 0.9997985290082942,

		1.4962081499113082, -2.9921698387739544, 1.4959617091599715,   //3,5dB
		-1.999798508710969, 0.9997985290082942

};

/* USER CODE BEGIN 2 */
	uint8_t temp = 0;
	for(page = 1; page < 28; page++){
		for(int address = 0; address < 15 ; address++){
				buffer[address] = volume[address + temp];
			}
			HAL_I2C_Mem_Write(&hi2c1, 0xA0, page, 0xFF, (uint8_t*)buffer, sizeof(buffer), HAL_MAX_DELAY);
			HAL_Delay(10);
			HAL_I2C_Mem_Read(&hi2c1, 0xA0, page, 0xFF, (uint8_t*)read, sizeof(read), HAL_MAX_DELAY);
			HAL_Delay(2000);
			temp+=15;
	}

Dodatkowo zamiast robić screeny, konfiguracja kodu I2C:

static void MX_I2C1_Init(void) {

	/* USER CODE BEGIN I2C1_Init 0 */

	/* USER CODE END I2C1_Init 0 */

	/* USER CODE BEGIN I2C1_Init 1 */

	/* USER CODE END I2C1_Init 1 */
	hi2c1.Instance = I2C1;
	hi2c1.Init.ClockSpeed = 400000;
	hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
	hi2c1.Init.OwnAddress1 = 0;
	hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
	hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
	hi2c1.Init.OwnAddress2 = 0;
	hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
	hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
	if (HAL_I2C_Init(&hi2c1) != HAL_OK) {
		Error_Handler();
	}
	/* USER CODE BEGIN I2C1_Init 2 */

	/* USER CODE END I2C1_Init 2 */

}

/**
 * @brief GPIO Initialization Function
 * @param None
 * @retval None
 */

I dodatkowo screeny z wartości pokazywanych w debugu:

Screenshot_1.thumb.png.af3317d45cf9f283804968abed3f2832.pngScreenshot_2.thumb.png.64770217720be373f0ce2d44e27cb11e.pngScreenshot_3.thumb.png.9437a12da2937e46cdb6633d63b31992.png

Link do komentarza
Share on other sites

(edytowany)

Problem dzieje się niezależnie od użytego modułu EEPROM - mam takich sześć, każdy ustawiony na adres 0xA0. Na piątej stronie ostatnia komórka nie pokazuje się, na szóstej tak samo, na siódmej już są dwie, na ósmej także dwie. Im wyżej tym gorzej, przykładowo na 20 stronie nie zgadzają się już cztery ostatnie wartości.

Edytowano przez DeadGeneratio
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!

Anonim
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.