chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

RA MCU眾測(cè)寶典 | 在瑞薩CPKCOR-RA8D1B核心板上實(shí)現(xiàn)QSPI讀取外部Flash

RA生態(tài)工作室 ? 2026-02-06 18:02 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

RA MCU眾測(cè)寶典”中I2C/SPI通信與顯示驅(qū)動(dòng)專題更新了。這次我們聚焦瑞薩CPKCOR-RA8D1B核心板】開發(fā)板,一步步實(shí)現(xiàn)QSPI讀取外部Flash。


開啟寶典

QSPI是Queued SPI的簡(jiǎn)寫,是Motorola公司推出的SPI接口的擴(kuò)展,比SPI應(yīng)用更加廣泛。在SPI協(xié)議的基礎(chǔ)上,Motorola公司對(duì)其功能進(jìn)行了增強(qiáng),增加了隊(duì)列傳輸機(jī)制,推出了隊(duì)列串行外圍接口協(xié)議(即QSPI協(xié)議)。


QSPI是一種專用的通信接口,連接單、雙或四(條數(shù)據(jù)線)SPI Flash存儲(chǔ)介質(zhì)。QSPI是一個(gè)內(nèi)存控制器,用于連接具有SPI兼容接口的串行ROM(非易失性存儲(chǔ)器)。


我們看一下核心板上的外擴(kuò)Flash:


e5af7e36-0342-11f1-96ea-92fbcf53809c.png

外擴(kuò)的Flash的型號(hào)是AT25SF128B。


QSPI使用6個(gè)信號(hào)連接Flash,分別是四個(gè)數(shù)據(jù)線QIO0~QIO3,一個(gè)時(shí)鐘輸出CLK,一個(gè)片選輸出(低電平有效)QSSL,它們的作用介紹如下:

QSSL:片選輸出(低電平有效),適用于FLASH 1。如果QSPI始終在雙閃存模式下工作,則其也可用于FLASH 2從設(shè)備選擇信號(hào)線。QSPI通訊以QSSL線置低電平為開始信號(hào),以QSSL線被拉高作為結(jié)束信號(hào)。

CLK:時(shí)鐘輸出,適用于兩個(gè)存儲(chǔ)器,用于通訊數(shù)據(jù)同步。它由通訊主機(jī)產(chǎn)生,決定了通訊的速率,不同的設(shè)備支持的最高時(shí)鐘頻率不一樣,兩個(gè)設(shè)備之間通訊時(shí),通訊速率受限于低速設(shè)備。

QIO0QIO0~QIO3:四線模式中為雙向IO。


接下來進(jìn)行軟件配置:


添加OSPI功能模塊:

e5bffe28-0342-11f1-96ea-92fbcf53809c.png


接下來我們配置一下引腳:

e5d42b5a-0342-11f1-96ea-92fbcf53809c.png


一共是6個(gè)引腳,接下來配置模塊信息:

e5e6d1d8-0342-11f1-96ea-92fbcf53809c.png


下面是部分Flash的命令,我們可以初始化這些內(nèi)容:

e5fe48ae-0342-11f1-96ea-92fbcf53809c.png


接下來我們代碼測(cè)試一下QSPI的功能。


我們定義了一些基礎(chǔ)功能測(cè)試:

左右滑動(dòng)查看完整內(nèi)容

uint8_tg_read_data [OSPI_B_APP_DATA_SIZE] = {RESET_VALUE};
uint8_tg_write_data [OSPI_B_APP_DATA_SIZE] = {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F,};spi_flash_direct_transfer_tg_ospi_b_direct_transfer [OSPI_B_TRANSFER_MAX] ={/* Transfer structure for SPI mode */ [OSPI_B_TRANSFER_WRITE_ENABLE_SPI] = { .command = OSPI_B_COMMAND_WRITE_ENABLE_SPI, .address = OSPI_B_ADDRESS_DUMMY, .data = OSPI_B_DATA_DUMMY, .command_length = OSPI_B_COMMAND_LENGTH_SPI, .address_length = OSPI_B_ADDRESS_LENGTH_ZERO, .data_length = OSPI_B_DATA_LENGTH_ZERO, .dummy_cycles = OSPI_B_DUMMY_CYCLE_WRITE_SPI }, [OSPI_B_TRANSFER_READ_STATUS_SPI] = { .command = OSPI_B_COMMAND_READ_STATUS_SPI, .address = OSPI_B_ADDRESS_DUMMY, .data = OSPI_B_DATA_DUMMY, .command_length = OSPI_B_COMMAND_LENGTH_SPI, .address_length = OSPI_B_ADDRESS_LENGTH_ZERO, .data_length = OSPI_B_DATA_LENGTH_ONE, .dummy_cycles = OSPI_B_DUMMY_CYCLE_READ_STATUS_SPI }, [OSPI_B_TRANSFER_READ_DEVICE_ID_SPI] = { .command = OSPI_B_COMMAND_READ_DEVICE_ID_SPI, //0x9f .address = OSPI_B_ADDRESS_DUMMY, //0 .data = OSPI_B_DATA_DUMMY, //0 .command_length = OSPI_B_COMMAND_LENGTH_SPI, //1 .address_length = OSPI_B_ADDRESS_LENGTH_ZERO, //0 .data_length = OSPI_B_DATA_LENGTH_FOUR, //4 .dummy_cycles = OSPI_B_DUMMY_CYCLE_READ_STATUS_SPI //0 }};fsp_err_tospi_b_read_device_id(uint32_t*constp_id){fsp_err_t err = FSP_SUCCESS;spi_flash_direct_transfer_ttransfer = {RESET_VALUE};/* Read and check flash device ID */ transfer = g_ospi_b_direct_transfer[OSPI_B_TRANSFER_READ_DEVICE_ID_SPI]; err =R_OSPI_B_DirectTransfer(&g_qspi0_flash_ctrl, &transfer, SPI_FLASH_DIRECT_TRANSFER_DIR_READ);if(err!=FSP_SUCCESS) {printf("R_OSPI_B_DirectTransfer API FAILED \r\n"); }/* Get flash device ID */ *p_id = transfer.data;returnerr;}staticfsp_err_tospi_b_write_enable(void){fsp_err_t err = FSP_SUCCESS;spi_flash_direct_transfer_ttransfer = {RESET_VALUE};/* Transfer write enable command */ transfer = g_ospi_b_direct_transfer[OSPI_B_TRANSFER_WRITE_ENABLE_SPI]; err =R_OSPI_B_DirectTransfer(&g_qspi0_flash_ctrl, &transfer, SPI_FLASH_DIRECT_TRANSFER_DIR_WRITE); assert(FSP_SUCCESS == err);/* Read Status Register */ transfer = g_ospi_b_direct_transfer[OSPI_B_TRANSFER_READ_STATUS_SPI]; err =R_OSPI_B_DirectTransfer(&g_qspi0_flash_ctrl, &transfer, SPI_FLASH_DIRECT_TRANSFER_DIR_READ); assert(FSP_SUCCESS == err);/* Check Write Enable bit in Status Register */if(OSPI_B_WEN_BIT_MASK != (transfer.data & OSPI_B_WEN_BIT_MASK)) {printf("Write enable FAILED\r\n"); }returnerr;}staticfsp_err_tospi_b_wait_operation(uint32_ttimeout){fsp_err_t err = FSP_SUCCESS;spi_flash_status_tstatus = {RESET_VALUE}; status.write_in_progress =true;while(status.write_in_progress) {/* Get device status */ R_OSPI_B_StatusGet(&g_qspi0_flash_ctrl, &status);if(RESET_VALUE == timeout) {printf("OSPI time out occurred\r\n"); } R_BSP_SoftwareDelay(1, OSPI_B_TIME_UNIT); timeout --; }returnerr;}staticfsp_err_tospi_b_erase_operation(uint8_t*constp_address){fsp_err_t err = FSP_SUCCESS;uint32_t sector_size = RESET_VALUE;uint32_t erase_timeout = RESET_VALUE;/* Check sector size according to input address pointer, described in S28HS512T data sheet */if(OSPI_B_SECTOR_4K_END_ADDRESS < (uint32_t)p_address)? ? {? ? ? ? sector_size = OSPI_B_SECTOR_SIZE_256K;? ? ? ? erase_timeout = OSPI_B_TIME_ERASE_256K;? ? }else? ? {? ? ? ? sector_size = OSPI_B_SECTOR_SIZE_4K;? ? ? ? erase_timeout = OSPI_B_TIME_ERASE_4K;? ? }/* Performs erase sector */? ? err =?R_OSPI_B_Erase(&g_qspi0_flash_ctrl, p_address, sector_size);/* Wait till operation completes */? ? err =?ospi_b_wait_operation(erase_timeout);return?err;}staticfsp_err_tospi_b_write_operation(uint8_t?*?const?p_address,uint8_t?*pdata,?uint16_t?len){fsp_err_t? ?err ? ? ? ? = FSP_SUCCESS;/* Erase sector before write data to flash device */? ? err =?ospi_b_erase_operation(p_address);/* Write data to flash device */? ? err =?R_OSPI_B_Write(&g_qspi0_flash_ctrl, pdata, p_address, len);/* Wait until write operation completes */? ? err =?ospi_b_wait_operation(OSPI_B_TIME_WRITE);return?err;}staticfsp_err_tospi_b_read_operation(uint8_t?*?const?p_address,uint8_t?*pdata,?uint16_t?len){fsp_err_t?err = FSP_SUCCESS;/* Clean read buffer */memset(pdata, RESET_VALUE, len);/* Read data from flash device */memcpy(pdata, p_address, len);return?err;
}


在main中我們需要先初始化:

左右滑動(dòng)查看完整內(nèi)容

voidqspi_FlashInit(void){
/* Open the OSPI instance. */ fsp_err_terr=R_OSPI_B_Open(&g_qspi0_flash_ctrl, &g_qspi0_flash_cfg); assert(FSP_SUCCESS == err); /* Switch OSPI module to 1S-1S-1S mode to configure flash device */ err = R_OSPI_B_SpiProtocolSet(&g_qspi0_flash_ctrl, SPI_FLASH_PROTOCOL_EXTENDED_SPI); assert(FSP_SUCCESS == err); /* Reset flash device by driving OM_RESET pin */ R_XSPI->LIOCTL_b.RSTCS0 =0; R_BSP_SoftwareDelay(OSPI_B_TIME_RESET_PULSE, OSPI_B_TIME_UNIT); R_XSPI->LIOCTL_b.RSTCS1 =1; R_BSP_SoftwareDelay(OSPI_B_TIME_RESET_SETUP, OSPI_B_TIME_UNIT); ospi_b_write_enable();
}


然后直接初始化階段測(cè)試QSPI,我們寫入一頁(yè)數(shù)據(jù),但是之讀取其中的16個(gè),并通過串口打印:

左右滑動(dòng)查看完整內(nèi)容

fsp_err_tospi_b_Testoperation(uint8_t*p_address){
fsp_err_t err =FSP_SUCCESS; uint16_t i=0; err=ospi_b_erase_operation(p_address); err=ospi_b_write_operation (p_address,g_write_data,OSPI_B_APP_DATA_SIZE); if(err==FSP_SUCCESS) { /* Print execution time */ printf("Write %d bytes completed successfully\r\n", (int)(OSPI_B_APP_DATA_SIZE)); } else { printf("Write operation failure\r\n"); } printf("Write Data:\r\n"); for(i=0;i<=OSPI_B_APP_DATA_SIZE-1;i++)? ? {? ? ? ? printf("%d ",g_write_data[i]);? ? }? ? err?=?ospi_b_read_operation (p_address,g_read_data,16);? ? if(err==FSP_SUCCESS)? ? {? ? ? ? /* Print execution time */? ? ? ? printf("\r\nRead %d bytes completed successfully\r\n", (int)(OSPI_B_APP_DATA_SIZE));? ? }? ? else? ? {? ? ? ? printf("\r\nRead operation failure\r\n");? ? }? ? printf("Read Data:\r\n");? ? for(i=0;i<=sizeof(g_read_data)-1;i++)? ? {? ? ? ? printf("%d ",g_read_data[i]);? ? }? ? /* Compare data read and date written */? ? if(RESET_VALUE?==?memcmp(&g_read_data,?&g_write_data, (size_t)16))? ? {? ? ? ? printf("\r\nData read matched data written\r\n");? ? ? ? printf("flash讀寫數(shù)據(jù)成功\r\n");? ? }? ? else? ? {? ? ? ? printf("\r\nData read does not match data written\r\n");? ? ? ? printf("flash讀寫數(shù)據(jù)失敗\r\n");? ? }? ? /* Performs OSPI erase operation */? ? err?=?ospi_b_erase_operation(p_address);? ? if(err==FSP_SUCCESS)? ? {? ? ? ? /* Print execution time */? ? ? ? printf("Erase sector completed successfully\r\n");? ? }? ? else? ? {? ? ? ? printf("erase operation failure\r\n");? ? }? ? return?err;
}


串口打印結(jié)果如下:

e615251a-0342-11f1-96ea-92fbcf53809c.png


從QSPI的六引腳配置、OSPI功能模塊添加,到命令集定義、Flash讀寫擦除的代碼實(shí)現(xiàn),再到串口打印驗(yàn)證數(shù)據(jù)匹配。我們不僅掌握了不同通信協(xié)議的配置邏輯,還摸清了它們?cè)诖鎯?chǔ)外設(shè)交互中的核心應(yīng)用——這次通過QSPI實(shí)現(xiàn)Flash的讀寫擦除與數(shù)據(jù)驗(yàn)證,正是高速通信在存儲(chǔ)場(chǎng)景的典型落地。

I2C/SPI通信與顯示驅(qū)動(dòng)專題的技能專題還在持續(xù)拓展!如果你在實(shí)操中對(duì)QSPI的協(xié)議時(shí)序、Flash命令配置有新的感悟,或是想分享更多通信驅(qū)動(dòng)的實(shí)戰(zhàn)場(chǎng)景,歡迎在評(píng)論區(qū)交流。


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • mcu
    mcu
    +關(guān)注

    關(guān)注

    147

    文章

    18914

    瀏覽量

    397775
  • RA
    RA
    +關(guān)注

    關(guān)注

    0

    文章

    32

    瀏覽量

    25300
  • 瑞薩電子
    +關(guān)注

    關(guān)注

    38

    文章

    2973

    瀏覽量

    74351
  • 核心板
    +關(guān)注

    關(guān)注

    6

    文章

    1396

    瀏覽量

    31994
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    CPKCOR-RA8D1B核心板實(shí)現(xiàn)QSPI讀取外部Flash

    QSPI是Queued SPI的簡(jiǎn)寫,是Motorola公司推出的SPI接口的擴(kuò)展,比SPI應(yīng)用更加廣泛。SPI協(xié)議的基礎(chǔ),Motorola公司對(duì)其功能進(jìn)行了增強(qiáng),增加了隊(duì)列傳輸機(jī)制,推出了隊(duì)列串行外圍接口協(xié)議(即
    的頭像 發(fā)表于 01-28 17:27 ?3921次閱讀
    <b class='flag-5'>在</b><b class='flag-5'>瑞</b><b class='flag-5'>薩</b><b class='flag-5'>CPKCOR-RA8D1B</b><b class='flag-5'>核心板</b><b class='flag-5'>上</b><b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>QSPI</b><b class='flag-5'>讀取</b><b class='flag-5'>外部</b><b class='flag-5'>Flash</b>

    FPB-RA0E2開發(fā)的批量加載例程

    RA MCU測(cè)寶典”環(huán)境搭建專題再添實(shí)用干貨!
    的頭像 發(fā)表于 01-29 17:52 ?6820次閱讀
    <b class='flag-5'>瑞</b><b class='flag-5'>薩</b>FPB-<b class='flag-5'>RA</b>0E2開發(fā)<b class='flag-5'>板</b>的批量加載例程

    RA8D1單片機(jī)IO中斷配置實(shí)現(xiàn)方法

    本文為結(jié)合e2 studio工具,以及CPKCOR_RA8D1B評(píng)估,給大家講述
    的頭像 發(fā)表于 04-09 15:05 ?1830次閱讀
    <b class='flag-5'>瑞</b><b class='flag-5'>薩</b><b class='flag-5'>RA8D1</b>單片機(jī)IO中斷配置<b class='flag-5'>實(shí)現(xiàn)</b>方法

    RA MCU測(cè)寶典 | I2C讀取EEPROM

    “RAMCU測(cè)寶典”IIC專題繼續(xù)深耕!一期我們用【RA-Eco-RA2E1】開發(fā)板實(shí)現(xiàn)了IIC通信的OLED顯示。這次我們把目光轉(zhuǎn)向?qū)?/div>
    的頭像 發(fā)表于 01-13 18:05 ?6599次閱讀
    <b class='flag-5'>RA</b> <b class='flag-5'>MCU</b><b class='flag-5'>眾</b>測(cè)<b class='flag-5'>寶典</b> | I2C<b class='flag-5'>讀取</b>EEPROM

    RA8D1 CPK開發(fā)RA8D1移植ThreadX操作系統(tǒng)

    CPKCOR-RA8D1B核心板電子為中國(guó)市場(chǎng)設(shè)計(jì)的模塊化開發(fā), 使用
    發(fā)表于 10-20 20:22

    CPKCOR-RA8D1】+ 1.RA8D1開箱點(diǎn)燈

    很榮幸收到了電子發(fā)放的CPKCOR-RA8D1B開發(fā),之前的直播間講過這款板子,但是沒
    發(fā)表于 09-24 18:55

    CPKCOR-RA8D1RA8D1開箱測(cè)試報(bào)告

    。 1.RA8D1核心板 CPKCOR-RA8D1B使用224BGA封裝的RA8D1
    發(fā)表于 10-02 17:25

    CPKCOR-RA8D1】介紹、環(huán)境搭建、工程測(cè)試

    官方 Demo 例程,實(shí)現(xiàn)核心板、底板、攝像頭模塊、顯示屏模塊的工程測(cè)試 介紹 RA8D1 套件包括
    發(fā)表于 10-06 19:35

    CPKCOR-RA8D11、VSCODE+CMAKE開發(fā)環(huán)境搭建

    /cpk_examples.git 其中提供了2個(gè)pack: 【核心板cpkcor_ra8d1b\\\\docs\\\\Renesas.RA_board_ra8d1_cpkcor.5.1.0.pack 【擴(kuò)展
    發(fā)表于 10-09 16:17

    CPKCOR-RA8D1】+ 3.RA8D1 測(cè)試MCU跑分性能 coremark

    首先,來個(gè)美女鎮(zhèn)樓吧,最近在健身中?。。? 很榮幸收到了電子發(fā)放的CPKCOR-RA8D1B開發(fā), RA8D1
    發(fā)表于 10-12 17:49

    CPKCOR-RA8D1】開發(fā)套件全攻略:從硬件解析到攝像頭顯示Demo實(shí)戰(zhàn)

    本文將全面解析電子高性能的CPKCOR-RA8D1開發(fā)套件。內(nèi)容涵蓋核心板與擴(kuò)展板的硬件資源詳解、原理圖分析、Flexible Software Package (FSP)開發(fā)環(huán)境
    發(fā)表于 10-30 09:34

    CPKCOR-RA8D1】開發(fā)套件全攻略:從硬件解析到攝像頭顯示Demo實(shí)戰(zhàn)

    | 本文將全面解析電子高性能的CPKCOR-RA8D1開發(fā)套件。內(nèi)容涵蓋核心板與擴(kuò)展板的硬件資源詳解、原理圖分析、Flexible Software Package (FSP)開發(fā)
    發(fā)表于 10-30 15:13

    CPKCOR-RA8D1】基于G.729A算法研究

    Renesas RA8D1 核心板CPKCOR-RA8D1B; CPKEXP-EKRA8X1 擴(kuò)展板; 軟件 開發(fā)環(huán)境搭建:包括 FSP軟件包和 e2 studio 工具鏈的安裝和
    發(fā)表于 10-31 00:50

    電子宣布推出RA8D1微控制器(MCU)產(chǎn)品群

    2023年12月12日,電子宣布推出RA8D1微控制器(MCU)產(chǎn)品群。RA8D1產(chǎn)品群作為
    的頭像 發(fā)表于 12-15 15:58 ?2109次閱讀
    <b class='flag-5'>瑞</b><b class='flag-5'>薩</b>電子宣布推出<b class='flag-5'>RA8D1</b>微控制器(<b class='flag-5'>MCU</b>)產(chǎn)品群

    RA8D1試用活動(dòng)】RA8D1B-CPKCOR開發(fā)移植linux

    RA8D1試用活動(dòng)】RA8D1B-CPKCOR開發(fā)移植linux
    的頭像 發(fā)表于 11-16 01:02 ?1706次閱讀
    【<b class='flag-5'>RA8D1</b>試用活動(dòng)】<b class='flag-5'>RA8D1B-CPKCOR</b>開發(fā)<b class='flag-5'>板</b>移植linux