9.2 QSPI通信
9.2.1 引脚介绍
图3.2.3是字库芯片连接图,IO0~IO3是QSPI数据线,传输数据用,QSPI是四线并口传输,速度比普通SPI快
图3.2.3
9.2.2 QSPI驱动程序
qspi_cmd_type esmt32m_cmd_config;
/**
* @brief qspi write enable
* @param none
* @retval none
*/
void qspi_write_enable(void)
{
esmt32m_cmd_wren_config(&esmt32m_cmd_config);
qspi_cmd_operation_kick(QSPI1, &esmt32m_cmd_config);
/* wait command completed */
while(qspi_flag_get(QSPI1, QSPI_CMDSTS_FLAG) == RESET);
qspi_flag_clear(QSPI1, QSPI_CMDSTS_FLAG);
}
/**
* @brief esmt32m cmd rdsr config
* @param qspi_cmd_struct: the pointer for qspi_cmd_type parameter
* @retval none
*/
void esmt32m_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_SW_ONCE;
qspi_cmd_struct->read_status_enable = TRUE;
qspi_cmd_struct->write_data_enable = FALSE;
}
/**
* @brief qspi check busy
* @param none
* @retval none
*/
void qspi_busy_check(void)
{
do
{
esmt32m_cmd_rdsr_config(&esmt32m_cmd_config);//结构体配置
qspi_cmd_operation_kick(QSPI1, &esmt32m_cmd_config);
/* wait command completed */
while(qspi_flag_get(QSPI1, QSPI_CMDSTS_FLAG) == RESET);//等待操作完成
qspi_flag_clear(QSPI1, QSPI_CMDSTS_FLAG);
/* check wip status */
}while(QSPI1->rsts & (1 << QSPI_BUSY_OFFSET_0));
}
/**
* @brief esmt32m cmd erase config
* @param qspi_cmd_struct: the pointer for qspi_cmd_type parameter
* @param addr: erase address
* @retval none
*/
void esmt32m_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;
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 read data from flash by qspi
*
* @param pbuff the pointer for data buffer
* @param Addr the address where the data is read
* @param rlen read buffer length
*/
void GT_QSPI_Read(u8* pbuff,u32 Addr,u16 rlen)
{
u16 len = 0, i = 0;
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 = 0xEB; //四线读指令
qspi_cmd_struct.instruction_length = QSPI_CMD_INSLEN_1_BYTE; //命令长度
qspi_cmd_struct.address_code = ((Addr<<8) & 0xFFFFFF00) | 0xFF; // address|0xFF
qspi_cmd_struct.address_length = QSPI_CMD_ADRLEN_4_BYTE; // 地址长度与4
qspi_cmd_struct.data_counter = rlen; //读数据长度
qspi_cmd_struct.second_dummy_cycle_num = 0;
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;
qspi_cmd_operation_kick(QSPI1, &qspi_cmd_struct); //设置命令端口
do
{
if(rlen>=128) //FIFO最大128字节
len=128;
else
len=rlen;
while(qspi_flag_get(QSPI1, QSPI_RXFIFORDY_FLAG) == RESET);
for(i = 0; i < len; i++)
{
*pbuff++ = qspi_byte_read(QSPI1);
}
rlen-=len;
}while(rlen);
while(qspi_flag_get(QSPI1, QSPI_CMDSTS_FLAG) == RESET){}
qspi_flag_clear(QSPI1, QSPI_CMDSTS_FLAG);
}
/**
* @brief qspi erase data
* @param sec_addr: the sector address for erase
* @retval none
*/
void qspi_erase(uint32_t sec_addr)
{
qspi_write_enable();//写使能
esmt32m_cmd_erase_config(&esmt32m_cmd_config, sec_addr);//擦除结构体配置
qspi_cmd_operation_kick(QSPI1, &esmt32m_cmd_config);//执行擦除操作
/* wait command completed */
while(qspi_flag_get(QSPI1, QSPI_CMDSTS_FLAG) == RESET);//等待擦除完成
qspi_flag_clear(QSPI1, QSPI_CMDSTS_FLAG);
qspi_busy_check();
}
/**
* @brief esmt32m cmd write config
* @param qspi_cmd_struct: the pointer for qspi_cmd_type parameter
* @param addr: write start address
* @param counter: write data counter
* @retval none
*/
void esmt32m_cmd_write_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 = 0x32;//写指令
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;
qspi_cmd_struct->data_counter = counter;//写数据长度
qspi_cmd_struct->second_dummy_cycle_num = 0;
qspi_cmd_struct->operation_mode = QSPI_OPERATE_MODE_114;
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 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_data_write(uint32_t addr, uint32_t total_len, uint8_t* buf)
{
uint32_t i, len = total_len;
do{
qspi_write_enable();//写使能·
if(total_len >= FLASH_PAGE_PROGRAM_SIZE){
len = FLASH_PAGE_PROGRAM_SIZE;
}else{
len = total_len;
}
esmt32m_cmd_write_config(&esmt32m_cmd_config, addr, len);//结构体配置
qspi_cmd_operation_kick(QSPI1, &esmt32m_cmd_config);//执行操作
for(i = 0; i < len; ++i){
while(qspi_flag_get(QSPI1, QSPI_TXFIFORDY_FLAG) == RESET);
qspi_byte_write(QSPI1, *buf++);
}
total_len -= len;
addr += len;
/* wait command completed */
while(qspi_flag_get(QSPI1, QSPI_CMDSTS_FLAG) == RESET);
qspi_flag_clear(QSPI1, QSPI_CMDSTS_FLAG);
qspi_busy_check();//等待忙完成
}while(total_len);
}
显示函数可以参考8080通信,这里不再赘述。
-
- 高通字库芯片开发资料
- GT-HMI Designer用户手册
- GT-HMI Engine用户手册
- GTC-480480TFT40XP模块使用手册
- GTC-480272TFT43XP模块使用手册
- GTC-800480TFT50G模块使用手册
- GTC-800480TFT70GP模块使用手册
- GTC-1024600TFT101GP模块使用手册
- GT-GUI LCD 0.96寸液晶模组数据手册
- GT-GUI LCD 1.9寸液晶模组数据手册
- GT-GUI LCD 2.8寸液晶模组数据手册
- GT-GUI LCD 7.0寸液晶模组数据手册
- GUI-LCD开发板使用手册
- GT5GL128B标准GUI芯片规格书
- GT5GL64芯片产品规格书
高通字库交流群
GT-HMI交流群