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字节 寄存器 是可以混用的, 但是要注意方法!