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通信,这里不再赘述。

下一页
上一页
    • 联系电话

    • 0755—83453881
    • 服务时间

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