Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

SPI blocked when using StandardSPIFlash API #15

Open
tsunyi opened this issue Dec 27, 2019 · 0 comments
Open

SPI blocked when using StandardSPIFlash API #15

tsunyi opened this issue Dec 27, 2019 · 0 comments

Comments

@tsunyi
Copy link

tsunyi commented Dec 27, 2019

(gdb) backtrace
#0 codal::ZSPI::startTransfer (this=0x2000050c <xn+692>, txBuffer=0x0, txSize=0, rxBuffer=0x0, rxSize=0,
doneHandler=0x0, arg=0x0)
at /mnt/c/Users/dare-/Documents/Workspace/xtron/codal/libraries/codal-stm32/src/ZSPI.cpp:357
#1 0x0801842a in codal::ZSPI::transfer (this=<optimized out>, txBuffer=0x0, txSize=0, rxBuffer=0x0, rxSize=0)
at /mnt/c/Users/dare-/Documents/Workspace/xtron/codal/libraries/codal-stm32/src/ZSPI.cpp:313
#2 0x08016380 in codal::StandardSPIFlash::sendCommand (this=this@entry=0x200008ec <storage>,
command=command@entry=6 '\006', addr=addr@entry=-1, resp=resp@entry=0x0, respSize=respSize@entry=0)
at /mnt/c/Users/dare-/Documents/Workspace/xtron/codal/libraries/codal-core/source/drivers/StandardSPIFlash.cpp:55 
#3 0x0801647e in codal::StandardSPIFlash::writeEnable (this=0x200008ec <storage>)
at /mnt/c/Users/dare-/Documents/Workspace/xtron/codal/libraries/codal-core/source/drivers/StandardSPIFlash.cpp:63 
#4 codal::StandardSPIFlash::writeBytes (this=0x200008ec <storage>, addr=1703948, buffer=0x20017f4c, len=4)
at /mnt/c/Users/dare-/Documents/Workspace/xtron/codal/libraries/codal-core/source/drivers/StandardSPIFlash.cpp:98 
#5 0x08010776 in codal::snorfs::FS::swapRow (this=this@entry=0x20000904 <storage+24>, row=28)
at /mnt/c/Users/dare-/Documents/Workspace/xtron/codal/source/SNORFS.cpp:295
#6 0x08010b42 in codal::snorfs::FS::gcCore (this=0x20000904 <storage+24>, force=<optimized out>,
isData=<optimized out>) at /mnt/c/Users/dare-/Documents/Workspace/xtron/codal/source/SNORFS.cpp:257
#7 0x08010e5e in codal::snorfs::FS::mount (this=0x20000904 <storage+24>)
at /mnt/c/Users/dare-/Documents/Workspace/xtron/codal/source/SNORFS.cpp:614
#8 codal::snorfs::FS::lock (this=this@entry=0x20000904 <storage+24>)
at /mnt/c/Users/dare-/Documents/Workspace/xtron/codal/source/SNORFS.cpp:613
#9 0x0801101e in codal::snorfs::FS::exists (this=this@entry=0x20000904 <storage+24>,
filename=filename@entry=0x801d86c "foobar")
at /mnt/c/Users/dare-/Documents/Workspace/xtron/codal/source/SNORFS.cpp:602
#10 0x08012bc4 in codal::WStorage::mountedStorage (this=this@entry=0x200008ec <storage>)
at /mnt/c/Users/dare-/Documents/Workspace/xtron/codal/source/storage.cpp:20
#11 0x0801286c in main () at /mnt/c/Users/dare-/Documents/Workspace/xtron/codal/source/main.cpp:74

When I try to mount storage, SPI was blocked because of invoke follow api with both txSize and rxSize equal to 0,so it can't receice transferCompleteEventCode event.

int ZSPI::startTransfer(const uint8_t *txBuffer, uint32_t txSize, uint8_t *rxBuffer,
                        uint32_t rxSize, PVoidCallback doneHandler, void *arg)
{
    int res;

    init_internal();

    LOG("SPI start %p/%d %p/%d D=%p", txBuffer, txSize, rxBuffer, rxSize, doneHandler);

    this->doneHandler = doneHandler;
    this->doneHandlerArg = arg;

    // disable IRQ or else risk a race in HAL, between starting DMA request
    // and getting the DMA-done IRQ
    if (doneHandler)
        target_disable_irq();

    if (txSize && rxSize)
    {
        CODAL_ASSERT(txSize == rxSize, DEVICE_SPI_ERROR); // we could support this if needed
        res = HAL_SPI_TransmitReceive_DMA(&spi, (uint8_t *)txBuffer, rxBuffer, txSize);
    }
    else if (txSize)
    {
        res = HAL_SPI_Transmit_DMA(&spi, (uint8_t *)txBuffer, txSize);
    }
    else if (rxSize)
    {
        res = HAL_SPI_Receive_DMA(&spi, rxBuffer, rxSize);
    }
    else
    {
        res = HAL_OK;
    }

    if (doneHandler)
        target_enable_irq();

    CODAL_ASSERT(res == HAL_OK, DEVICE_SPI_ERROR);
    return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant