SPI读写Flash的时序

在使用nordic52832的SPI外设对外部Flash进行读写操作时,发现读出来的数据与写进去的数据不一致。

先看一下读写一个字节的错误示范:

static uint8_t spi_tx[256],spi_rx[256],;

static bool gSpiDone = false;//spi传输完成标志

/**

@brief SPI传输完成时的回调函数

*/

static void spiCallbackFunc(nrf_drv_spi_evt_t const *pEvent, void *arg)

{

    gSpiDone = true;

}

static uint8_t SpiReadStatusReg(void)

{

    spi_tx[0] =0x05;//状态寄存器地址

    gSpiDone=false;

//注意这个错误示范中发送和接受的都是1个字节

    nrf_drv_spi_transfer(&spi_flash, spi_tx, 1, spi_rx, 1);

    while(!gSpiDone);//等待传输完成

    return spi_rx[0];

}

通过上面的函数读出来的值总是零,实际上是SPI的时序搞错了,我们来重新补习SPI时序相关的知识。

下面是通过逻辑分析仪捕获的读取外部flash器件ID的正常时序图:

SPI读写Flash的时序_第1张图片

先拉低片选信号CS,再发送命令0XAB,再发送三个字节的dummy。读取第四个字节数据,数据就是device ID。最后拉高CS,结束一次操作。注意时钟信号总共有5个字节周期!

你可能感兴趣的:(蓝牙,物联网,蓝牙,SPI)