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);
}
-
- GT-HMI Designer用户手册
- GT-HMI Engine用户手册
- 高通字库芯片开发资料
- GTDB-X7ESP高通智匠AI开发板规格书
- GTC-480480TFT40XP模块使用手册
- GTC-480272TFT43XP模块使用手册
- GTC-800480TFT50G模块使用手册
- GTC-800480TFT70GP模块使用手册
- GTC-1024600TFT101GP模块使用手册
- GT-GUI LCD 0.96寸液晶模组数据手册
- GT-GUI LCD 1.9寸液晶模组数据手册
- GT-GUI LCD 3.5寸液晶模组数据手册
- GT-GUI LCD 7.0寸液晶模组数据手册
- GUI-LCD开发板使用手册
- GT5GL128B标准GUI芯片规格书
- GT5GL64芯片产品规格书
高通字库交流群
GT-HMI交流群