Zápis do externí paměti IS25LP128

Všetko čo sa týka mikropočítačov + Sekcia Arduino

Moderátori: psichac, Moderátori

Používateľov profilový obrázok
jirka.jirka.
Ultimate člen
Ultimate člen
Príspevky: 1537
Dátum registrácie: 17 Okt 2008, 00:00
Bydlisko: Uherské Hradiště
Kontaktovať používateľa:

Zápis do externí paměti IS25LP128

Príspevok od používateľa jirka.jirka. » 23 Feb 2018, 07:06

Zdravím pánové,

Pracuji s externí pamětí IS25LP128 -->Datashit<--. A mám nějaký problém, který se mi nějak nedaří eliminovat.

Přes příkaz:

Kód: Vybrať všetko

Input Page Program 0x02
Zapíšu do paměti blok dat, dlouhý N bytes. Zápis ukončím.

Kód: Vybrať všetko

Status register a function registr se nastaví do 0
Ale když chci potom znova zapsat do paměti, tak už to nejde. nějak nevím proč se tak děje a v DS nic nevidím.

Příklad:
zapíšu do paměti od adresy 0x00 data až po adresu 0xFF. A potom chci přepsat data na adrese 0x00.

Ona je toto moje první externí paměť, takže jestli někdo, někdy řešil externí paměť, tak se s tím možná setkal a poradí mi. Díky moc
0

Používateľov profilový obrázok
roboulbricht
Stály člen
Stály člen
Príspevky: 156
Dátum registrácie: 07 Jan 2015, 12:01
Bydlisko: Banská Bystrica
Vek: 54
Kontaktovať používateľa:

Re: Zápis do externí paměti IS25LP128

Príspevok od používateľa roboulbricht » 23 Feb 2018, 07:24

Možno sa snažíš robiť s tou Flash ako s EEPROM. Na opätovné prepisovanie je potrebné urobiť erase operáciu. Máš tam aj poznámku v datasheete k tomu.
Note:
A program operation can alter “1”s into “0”s, but an erase operation is required to change “0”s back to “1”s.
A byte cannot be reprogrammed without first erasing the whole sector or block.
0

Používateľov profilový obrázok
jirka.jirka.
Ultimate člen
Ultimate člen
Príspevky: 1537
Dátum registrácie: 17 Okt 2008, 00:00
Bydlisko: Uherské Hradiště
Kontaktovať používateľa:

Re: Zápis do externí paměti IS25LP128

Príspevok od používateľa jirka.jirka. » 23 Feb 2018, 07:52

Ojda, že já vždycky na něco zapomenu. :-D

Enable Operace je provedena. :thumbup:
0

Používateľov profilový obrázok
jirka.jirka.
Ultimate člen
Ultimate člen
Príspevky: 1537
Dátum registrácie: 17 Okt 2008, 00:00
Bydlisko: Uherské Hradiště
Kontaktovať používateľa:

Re: Zápis do externí paměti IS25LP128

Príspevok od používateľa jirka.jirka. » 24 Feb 2018, 13:12

No tak už na to jdu aj logickým analyzátorem. A všiml jsem si tohoto. Jendou za čas (teda spíše pravidelně) mi na dotaz 0x05 okamžitě vrací 1. Ale na špatné pozici (viz. screen). A ne a ne přijít na to, kde je chyba. Tak třeba někdo poradí. Tohoto problému jsem si vůbec nevšiml na osciloskopu (protože mi utekl) :-D

A děje se tak jenom tehdy, když se jednou zeptám na STATUS_REGISTER 0x05 a FUNCTION_REGISTER 0x48, viz. kód.

V nekonečné smyčce se pouze ptám na ty dva registry a výstup šupu na uart, abych viděl výstup:

Kód: Vybrať všetko

LL_mDelay(1);

		cas++;
		if (cas == 375)
		{
			if (upgrade_dat == 0)
			{
				LL_GPIO_TogglePin(GPIOB, BLUE);
				usart_puts("Function: ");
				test = IS25LP128_read_function_register();
				itoa(test, buffer, 16);
				usart_puts(buffer);
				usart_puts("hex\r\n");
			}
		}
		if(cas == 750)
		{
			if (upgrade_dat == 0)
			{
				LL_GPIO_TogglePin(GPIOB, BLUE);
				usart_puts("Status: ");
				test = IS25LP128_read_status_register();
				itoa(test, buffer, 16);
				usart_puts(buffer);
				usart_puts("hex\r\n");
			}
			cas = 0;
		}
A funkce IS25LP128_read_function_register zaštiťuje toto:

Kód: Vybrať všetko

uint8_t IS25LP128_read_function_register(void)
{
	return QSPI_memory_read(READ_FUNCTION_REGISTER_CMD, 0x00, RECEIVE_ONE_BYTE, NO_DUMMY_CYCLE, DISABLE_ADDRESS);
}
A funkce IS25LP128_read_status_register zaštiťuje toto:

Kód: Vybrať všetko

uint8_t IS25LP128_read_status_register(void)
{
	return QSPI_memory_read(READ_STATUS_REG_CMD, 0x00, RECEIVE_ONE_BYTE, NO_DUMMY_CYCLE, DISABLE_ADDRESS);
}
A teď k té funkci QSPI_memory_read

Kód: Vybrať všetko

uint32_t QSPI_memory_read(uint8_t instruction, uint32_t addr, uint32_t count, uint8_t dummy_cycle, uint8_t address_enable)
{
	uint32_t tmpreg = 0;

	/* Write the DLR Register */
	if (!(QUADSPI->SR & QUADSPI_SR_BUSY))
	{
		/* Write the DLR Register */
		if (count <= 0)
			QUADSPI->DLR = 0;
		else
			QUADSPI->DLR = count - 1;
	}

	tmpreg = QUADSPI->CCR;
	tmpreg &= 0x90800000;
	tmpreg |=
			(0x00 << QUADSPI_CCR_DDRM_Pos) 		|  // Disable DDR mode
			(0x00 << QUADSPI_CCR_DHHC_Pos) 		|  // Delay the data output using analog delay
			(0x00 << QUADSPI_CCR_SIOO_Pos) 		|  // Send instruction on every transaction
			(0x01 << QUADSPI_CCR_FMODE_Pos) 	|  // function QSPI (0-indirect write); (1-indirect read)
			(0x01 << QUADSPI_CCR_DMODE_Pos) 	|  // Data mode (0-nodata); (1-data on single line); .....
			(dummy_cycle << QUADSPI_CCR_DCYC_Pos)| // Dummy cycle
			(0x00 << QUADSPI_CCR_ABSIZE_Pos)	|  // size of alternate bytes (0-8bit); (1-16bit); (2-24bit); (3-32bit)
			(0x00 << QUADSPI_CCR_ABMODE_Pos)	|  // Alternate mode (0-no alternate); (1-alternate on single line)
			(0x02 << QUADSPI_CCR_ADSIZE_Pos)	|  // size of address bytes (0-8bit); (1-16bit); (2-24bit); (3-32bit)
			(address_enable << QUADSPI_CCR_ADMODE_Pos)	|  // Address mode (0-no address); (1-address on a single line)
			(0x01 << QUADSPI_CCR_IMODE_Pos )	|  // Instruction mode (0-no instruction); (1-instruction on signel line)
			(instruction << QUADSPI_CCR_INSTRUCTION_Pos); // Instruction send on SPI
	 QUADSPI->CCR = tmpreg;

	 if(address_enable == 0x01)
	 		QUADSPI->AR = addr;		//write to address register, when ADMODE != 0 and FMODE = 1.

	 QUADSPI->FCR = 0x1F; // clear all flags

	 return QUADSPI->DR;
}
Nuž a proměnné:
  • READ_STATUS_REG_CMD = 0x05
    READ_FUNCTION_REGISTER_CMD = 0x48
    RECEIVE_ONE_BYTE = 0x01
    NO_DUMMY_CYCLE = 0x00
    DISABLE_ADDRESS = 0x00
Takže otázka, neví někdo, proč se tak děje?? Ať do toho čumím sebe víc, nic mě nenapadá.
Prílohy
problemek.PNG
0

Používateľov profilový obrázok
jirka.jirka.
Ultimate člen
Ultimate člen
Príspevky: 1537
Dátum registrácie: 17 Okt 2008, 00:00
Bydlisko: Uherské Hradiště
Kontaktovať používateľa:

Re: Zápis do externí paměti IS25LP128

Príspevok od používateľa jirka.jirka. » 24 Feb 2018, 14:15

Nuž sleduju tu komunikaci a až na ten jeden bitík to je dobré.

Takže spíš bych to viděl na nějaký bitík v paměti, než chybu v komunikaci. Teď ho jenom najít.

Protože jakmile pošlu příkaz na erase, nebo erase sector, tak po smazání už jde zapsat znova.
0

Používateľov profilový obrázok
jirka.jirka.
Ultimate člen
Ultimate člen
Príspevky: 1537
Dátum registrácie: 17 Okt 2008, 00:00
Bydlisko: Uherské Hradiště
Kontaktovať používateľa:

Re: Zápis do externí paměti IS25LP128

Príspevok od používateľa jirka.jirka. » 24 Feb 2018, 16:03

Takže registr jsem žádný nenašel.

Asi to budu muset provést přes erase.

Akorát že, mám možnost pouze:
  • 1. Erase Sector (erase 4 KByte)
    2. Erase Block 32 Kbyte
    3. Erase Block 64 Kbyte
    4. Chip erase
Takže to znamená, že nemůžu zapsat např. 4 bajty a potom je přepisovat. Takže přijdu o to, že jsem chtěl mít třeba jednu buňku, která by značila jestli se má upgradovat systém, ...... (Teda můžu, přečtu sektor, smažu sektor, upravím hodnotu a zapíšu). Ale není to ono. Je tam riziko ztráty dat.
0

Používateľov profilový obrázok
Tribec Zacks
Pokročilý člen
Pokročilý člen
Príspevky: 709
Dátum registrácie: 26 Jún 2010, 00:00
Bydlisko: Levice / Cork IRL
Vek: 41
Kontaktovať používateľa:

Re: Zápis do externí paměti IS25LP128

Príspevok od používateľa Tribec Zacks » 24 Feb 2018, 17:11

Jirka, u flash pamati nemas velmi na vyber, ked chces zapisovat, tak musis vymazat cely sektor najskor, pak ho prepisat novymi datami.
0
Kreativita a motivacia je to, co prinasa originalne napady a myslienky, disciplina je to, co ich dokaze zrealizovat.

Používateľov profilový obrázok
jirka.jirka.
Ultimate člen
Ultimate člen
Príspevky: 1537
Dátum registrácie: 17 Okt 2008, 00:00
Bydlisko: Uherské Hradiště
Kontaktovať používateľa:

Re: Zápis do externí paměti IS25LP128

Príspevok od používateľa jirka.jirka. » 24 Feb 2018, 17:14

S tím se nějak poperu. :-D

Spíš mě se****re, že jsem na to přišel až teď. :-D

EDIT: Aspoň jednu pozitivní věc to mělo, pohrál jsem si s logickým analyzátorem. :) A zároveň pomocí něj ověřil, že komunikace je OK, podle datasheetu. :thumbup:
0

Napísať odpoveď
  • Podobné témy
    Odpovedí
    Zobrazení
    Posledný príspevok