8.2 QSPI通信

8.2.1 引脚介绍

图3.2.3是字库芯片连接图,IO0~IO3是QSPI数据线,传输数据用,QSPI是四线并口传输,速度比普通SPI快

图3.2.3

 

8.2.2 QSPI驱动程序

qspi_cmd_type qspi_flash_cmd_config;

#define QSPI_FLASH_FIFO_DEPTH (32*4)

#define QSPI_FLASH_PAGE_SIZE 256

#define QSPI_FLASH_QSPIx QSPI1

/**

* @brief qspi flash write enable

* @param none

* @retval none

*/

void qspi_flash_write_enable(void)

{

qspi_flash_cmd_wren_config(&qspi_flash_cmd_config);//写使能配置

qspi_cmd_operation_kick(QSPI_FLASH_QSPIx, &qspi_flash_cmd_config);

 

/* wait command completed */

while(qspi_flag_get(QSPI_FLASH_QSPIx, QSPI_CMDSTS_FLAG) == RESET);

qspi_flag_clear(QSPI_FLASH_QSPIx, QSPI_CMDSTS_FLAG);

}

/**

* @brief qspi_flash cmd erase config

* @param qspi_cmd_struct: the pointer for qspi_cmd_type parameter

* @param addr: erase address

* @retval none

*/

void qspi_flash_cmd_erase_config(qspi_cmd_type *qspi_cmd_struct, uint32_t addr)

{

qspi_cmd_struct->pe_mode_enable = FALSE;//性能增强模式关闭

qspi_cmd_struct->pe_mode_operate_code = 0;

qspi_cmd_struct->instruction_code = 0x20;//擦除指令

qspi_cmd_struct->instruction_length = QSPI_CMD_INSLEN_1_BYTE;//命令长度

qspi_cmd_struct->address_code = addr;//擦除地址

qspi_cmd_struct->address_length = QSPI_CMD_ADRLEN_3_BYTE;//地址长度3字节

qspi_cmd_struct->data_counter = 0;

qspi_cmd_struct->second_dummy_cycle_num = 0;

qspi_cmd_struct->operation_mode = QSPI_OPERATE_MODE_111;

qspi_cmd_struct->read_status_config = QSPI_RSTSC_HW_AUTO;

qspi_cmd_struct->read_status_enable = FALSE;

qspi_cmd_struct->write_data_enable = TRUE;

}

/**

* @brief qspi_flash cmd rdsr config

* @param qspi_cmd_struct: the pointer for qspi_cmd_type parameter

* @retval none

*/

void qspi_flash_cmd_rdsr_config(qspi_cmd_type *qspi_cmd_struct)

{

qspi_cmd_struct->pe_mode_enable = FALSE;

qspi_cmd_struct->pe_mode_operate_code = 0;

qspi_cmd_struct->instruction_code = 0x05;//读状态寄存器指令

qspi_cmd_struct->instruction_length = QSPI_CMD_INSLEN_1_BYTE;//命令长度

qspi_cmd_struct->address_code = 0;

qspi_cmd_struct->address_length = QSPI_CMD_ADRLEN_0_BYTE;

qspi_cmd_struct->data_counter = 0;

qspi_cmd_struct->second_dummy_cycle_num = 0;

qspi_cmd_struct->operation_mode = QSPI_OPERATE_MODE_111;

qspi_cmd_struct->read_status_config = QSPI_RSTSC_HW_AUTO;

qspi_cmd_struct->read_status_enable = TRUE;

qspi_cmd_struct->write_data_enable = FALSE;

}

/**

* @brief qspi flash check busy

* @param none

* @retval none

*/

void qspi_flash_busy_check(void)

{

qspi_flash_cmd_rdsr_config(&qspi_flash_cmd_config);

qspi_cmd_operation_kick(QSPI_FLASH_QSPIx, &qspi_flash_cmd_config);

 

/* wait command completed */

while(qspi_flag_get(QSPI_FLASH_QSPIx, QSPI_CMDSTS_FLAG) == RESET);

qspi_flag_clear(QSPI_FLASH_QSPIx, QSPI_CMDSTS_FLAG);

}

/**

* @brief qspi flash erase data

* @param sec_addr: the sector address for erase

* @retval none

*/

void qspi_flash_erase(uint32_t sec_addr)

{

qspi_flash_write_enable();//写使能

 

qspi_flash_cmd_erase_config(&qspi_flash_cmd_config, sec_addr);//擦除结构体配置

qspi_cmd_operation_kick(QSPI_FLASH_QSPIx, &qspi_flash_cmd_config);//执行擦除操作

 

/* wait command completed */

while(qspi_flag_get(QSPI_FLASH_QSPIx, QSPI_CMDSTS_FLAG) == RESET);

qspi_flag_clear(QSPI_FLASH_QSPIx, QSPI_CMDSTS_FLAG);

 

qspi_flash_busy_check();//判忙

}

 

/**

* @brief qspi_flash cmd read config

* @param qspi_cmd_struct: the pointer for qspi_cmd_type parameter

* @param addr: read start address

* @param counter: read data counter

* @retval none

*/

void qspi_flash_cmd_read_config(qspi_cmd_type *qspi_cmd_struct, uint32_t addr, uint32_t counter)

{

qspi_cmd_struct->pe_mode_enable = FALSE;//性能增强模式关闭

qspi_cmd_struct->pe_mode_operate_code = 0;

qspi_cmd_struct->instruction_code = 0xEB;//四线读指令

qspi_cmd_struct->instruction_length = QSPI_CMD_INSLEN_1_BYTE;//命令长度

qspi_cmd_struct->address_code = addr;//读取地址

qspi_cmd_struct->address_length = QSPI_CMD_ADRLEN_3_BYTE;//地址长度3字节

qspi_cmd_struct->data_counter = counter;//读取数据长度

qspi_cmd_struct->second_dummy_cycle_num = 6;//第二个虚拟状态周期数6

qspi_cmd_struct->operation_mode = QSPI_OPERATE_MODE_144;//四线输入输出模式

qspi_cmd_struct->read_status_config = QSPI_RSTSC_HW_AUTO;//硬件读取

qspi_cmd_struct->read_status_enable = FALSE;

qspi_cmd_struct->write_data_enable = FALSE;

}

/**

* @brief qspi flash read data

* @param addr: the address for read

* @param total_len: the length for read

* @param buf: the pointer for read data

* @retval none

*/

void qspi_flash_data_read(uint32_t addr, uint8_t* buf, uint32_t total_len)

{

uint32_t i, len = total_len;

 

qspi_flash_cmd_read_config(&qspi_flash_cmd_config, addr, total_len);

qspi_cmd_operation_kick(QSPI_FLASH_QSPIx, &qspi_flash_cmd_config);

 

/* read data */

do{

if(total_len >= QSPI_FLASH_FIFO_DEPTH)

{

len = QSPI_FLASH_FIFO_DEPTH;

}else{

len = total_len;

}

while(qspi_flag_get(QSPI_FLASH_QSPIx, QSPI_RXFIFORDY_FLAG) == RESET);

for(i = 0; i < len; ++i)

{

*buf++ = qspi_byte_read(QSPI_FLASH_QSPIx);

}

total_len -= len;

}while(total_len);

/* wait command completed */

while(qspi_flag_get(QSPI_FLASH_QSPIx, QSPI_CMDSTS_FLAG) == RESET);

qspi_flag_clear(QSPI_FLASH_QSPIx, QSPI_CMDSTS_FLAG);

}

/**

* @brief qspi flash write data

* @param addr: the address for write

* @param total_len: the length for write

* @param buf: the pointer for write data

* @retval none

*/

void qspi_flash_data_write(uint32_t addr, uint8_t* buf, uint32_t total_len)

{

uint32_t i, len;

 

do{

qspi_flash_write_enable();

/* send up to 256 bytes at one time, and only one page */

len = (addr / QSPI_FLASH_PAGE_SIZE + 1) * QSPI_FLASH_PAGE_SIZE - addr;

if(total_len < len)

len = total_len;

 

qspi_flash_cmd_write_config(&qspi_flash_cmd_config, addr, len);

qspi_cmd_operation_kick(QSPI_FLASH_QSPIx, &qspi_flash_cmd_config);

 

for(i = 0; i < len; ++i)

{

while(qspi_flag_get(QSPI_FLASH_QSPIx, QSPI_TXFIFORDY_FLAG) == RESET);

qspi_byte_write(QSPI_FLASH_QSPIx, *buf++);

}

total_len -= len;

addr += len;

 

/* wait command completed */

while(qspi_flag_get(QSPI_FLASH_QSPIx, QSPI_CMDSTS_FLAG) == RESET);

qspi_flag_clear(QSPI_FLASH_QSPIx, QSPI_CMDSTS_FLAG);

 

qspi_flash_busy_check();

 

}while(total_len);

}

下一页
上一页
    • 联系电话

    • 0755—83453881
    • 服务时间

    • 周一至周五 9:00-18:00
    • 高通GT-HMI交流群