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)
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á.