zynq qspi 发送 1字节 2字节 3字节 4字节 寄存器混合使用,出现的错误,以及解决方法

1、 ZYNQ QSPI  TX FIFO 写入 方式有 4中, 分别是 1字节,2字节,3字节,4字节 ,分别对应 寄存器

XQSPIPS_TXD_01_OFFSET   1字节

XQSPIPS_TXD_10_OFFSET   2字节

XQSPIPS_TXD_11_OFFSET   3字节

XQSPIPS_TXD_00_OFFSET   4字节

  注 : 第4条测试方法,可以解决问题!

 

2、 尝试 发送 5字节, 先发送 4字节, 在发送 一个字节 ,进行测试 ,测试 OK;

 

void test_qspi_fifo_4_1( uint8_t *buff, uint32_t len )
{

    union u_qspi_data
    {
        uint32_t value;
        struct
        {
            uint8_t buff[4];
        };
    };

    // CS 拉低 使能
    QSPI_0_BASE->cfg.pcs = 0;

    union u_qspi_data data;

    data.buff[0] = 0x5A;
    data.buff[1] = 0x00;
    data.buff[2] = 0x00;
    data.buff[3] = 0x00;

    // 将发送数据 填充到 TX FIFO 4 byte
    QSPI_0_BASE->tx_fifo_4_byte.reg = data.value;

    // tx fifo 1 byte
    data.buff[0] = 0xFF;
    QSPI_0_BASE->tx_fifo_byte_array[0].reg = data.value;
   // 配置 tx fifo 阈值
  QSPI_0_BASE->tx_fifo_threshold.reg = 1;

    // 等待 TX FIFO 传输完成
    // 1: FIFO has less than THRESHOLD entries
    // 0: FIFO has more than or equal to THRESHOLD entries
    while( QSPI_0_BASE->interrupt_status.tx_fifo_not_full == 0 );
// CS 拉高
    QSPI_0_BASE->cfg.pcs = 1;
}

 

2、 尝试 发送 9字节, 先发送 4字节, 在发送4字节,在发送 一个字节 ,进行测试 ,测试 失败;

void test_qspi_fifo_4_1( uint8_t *buff, uint32_t len )
{

    union u_qspi_data
    {
        uint32_t value;
        struct
        {
            uint8_t buff[4];
        };
    };

    // CS 拉低 使能
    QSPI_0_BASE->cfg.pcs = 0;

    union u_qspi_data data;

    data.buff[0] = 0x5A;
    data.buff[1] = 0x00;
    data.buff[2] = 0x00;
    data.buff[3] = 0x00;

    // 将发送数据 填充到 TX FIFO 4 byte
    QSPI_0_BASE->tx_fifo_4_byte.reg = data.value;

    data.buff[0] = 0xFF;
    data.buff[1] = 0xFF;
    data.buff[2] = 0xFF;
    data.buff[3] = 0xFF;
    QSPI_0_BASE->tx_fifo_4_byte.reg = data.value;

    // tx fifo 1 byte
    data.buff[0] = 0x12;
    data.buff[1] = 0x34;
    data.buff[2] = 0x56;
    data.buff[3] = 0x78;

    QSPI_0_BASE->tx_fifo_byte_array[0].reg = data.value;

   // 配置 tx fifo 阈值
  QSPI_0_BASE->tx_fifo_threshold.reg = 1;
    // 等待 TX FIFO 传输完成
    // 1: FIFO has less than THRESHOLD entries
    // 0: FIFO has more than or equal to THRESHOLD entries
    while( QSPI_0_BASE->interrupt_status.tx_fifo_not_full == 0 );
  // CS 拉高
    QSPI_0_BASE->cfg.pcs = 1;
}

 

 错误原因: 应该传输9个字节,但是传输了 12个字节;

 3、如果先使用 1字节 传输,再次使用4字节传输 ,则会一直发送数据

void test_qspi_fifo_4_1( uint8_t *buff, uint32_t len )
{

    union u_qspi_data
    {
        uint32_t value;
        struct
        {
            uint8_t buff[4];
        };
    };

    // CS 拉低 使能
    QSPI_0_BASE->cfg.pcs = 0;

    union u_qspi_data data;

    // tx fifo 1 byte
    data.buff[0] = 0x12;
    data.buff[1] = 0x34;
    data.buff[2] = 0x56;
    data.buff[3] = 0x78;
    QSPI_0_BASE->tx_fifo_byte_array[0].reg = data.value;

    // 将发送数据 填充到 TX FIFO 4 byte
    data.buff[0] = 0x5A;
    data.buff[1] = 0x00;
    data.buff[2] = 0x00;
    data.buff[3] = 0x00;
    QSPI_0_BASE->tx_fifo_4_byte.reg = data.value;

    // 将发送数据 填充到 TX FIFO 4 byte
    data.buff[0] = 0xFF;
    data.buff[1] = 0xFF;
    data.buff[2] = 0xFF;
    data.buff[3] = 0xFF;
    QSPI_0_BASE->tx_fifo_4_byte.reg = data.value;
   // 配置 tx fifo 阈值
  QSPI_0_BASE->tx_fifo_threshold.reg = 1;
    // 等待 TX FIFO 传输完成
    // 1: FIFO has less than THRESHOLD entries
    // 0: FIFO has more than or equal to THRESHOLD entries
    while( QSPI_0_BASE->interrupt_status.tx_fifo_not_full == 0 );
// CS 拉高
    QSPI_0_BASE->cfg.pcs = 1;
}

 

 

4、先使用4字节传输,等待4字节传输完成,然后使用 1字节传输,进行测试, 没有问题

 

void test_qspi_fifo_4_1( uint8_t *buff, uint32_t len )
{

    union u_qspi_data
    {
        uint32_t value;
        struct
        {
            uint8_t buff[4];
        };
    };

    // CS 拉低 使能
    QSPI_0_BASE->cfg.pcs = 0;

    union u_qspi_data data;

    // 将发送数据 填充到 TX FIFO 4 byte
    data.buff[0] = 0x5A;
    data.buff[1] = 0x00;
    data.buff[2] = 0x00;
    data.buff[3] = 0x00;
    QSPI_0_BASE->tx_fifo_4_byte.reg = data.value;

    // 将发送数据 填充到 TX FIFO 4 byte
    data.buff[0] = 0xFF;
    data.buff[1] = 0xFF;
    data.buff[2] = 0xFF;
    data.buff[3] = 0xFF;
    QSPI_0_BASE->tx_fifo_4_byte.reg = data.value;
    QSPI_0_BASE->tx_fifo_4_byte.reg = data.value;

    // 配置 tx fifo 阈值
    QSPI_0_BASE->tx_fifo_threshold.reg = 1;

    // 等待 TX FIFO 传输完成
    // 1: FIFO has less than THRESHOLD entries
    // 0: FIFO has more than or equal to THRESHOLD entries
    while( QSPI_0_BASE->interrupt_status.tx_fifo_not_full == 0 );

    // tx fifo 1 byte
    data.buff[0] = 0x12;
    data.buff[1] = 0x34;
    data.buff[2] = 0x56;
    data.buff[3] = 0x78;
    QSPI_0_BASE->tx_fifo_byte_array[0].reg = data.value;

    // 等待 TX FIFO 传输完成
    // 1: FIFO has less than THRESHOLD entries
    // 0: FIFO has more than or equal to THRESHOLD entries
    while( QSPI_0_BASE->interrupt_status.tx_fifo_not_full == 0 );

    // CS 拉高
    QSPI_0_BASE->cfg.pcs = 1;
}

 

 

 

 

使用 2字节寄存器发送:

 

最后使用 3字节寄存器发送:

 

总结:

  TX FIFO 1字节、2字节、3字节、4字节 寄存器 是可以混用的, 但是要注意方法!

 

posted on 2025-07-11 16:38  所长  阅读(40)  评论(0)    收藏  举报

导航