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

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • 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.