91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

在瑞薩CPKCOR-RA8D1B核心板上實現(xiàn)QSPI讀取外部Flash

瑞薩嵌入式小百科 ? 來源:瑞薩嵌入式小百科 ? 2026-01-28 17:27 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

開啟寶典

QSPI是Queued SPI的簡寫,是Motorola公司推出的SPI接口的擴展,比SPI應用更加廣泛。在SPI協(xié)議的基礎上,Motorola公司對其功能進行了增強,增加了隊列傳輸機制,推出了隊列串行外圍接口協(xié)議(即QSPI協(xié)議)。

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

我們看一下核心板上的外擴Flash:

a51e96ec-f035-11f0-92de-92fbcf53809c.png

外擴的Flash的型號是AT25SF128B。

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

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

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

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

接下來進行軟件配置:

添加OSPI功能模塊:

a5768a3c-f035-11f0-92de-92fbcf53809c.png

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

a5e5580e-f035-11f0-92de-92fbcf53809c.png

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

a647284a-f035-11f0-92de-92fbcf53809c.png

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

a6b59e9c-f035-11f0-92de-92fbcf53809c.png

接下來我們代碼測試一下QSPI的功能。

我們定義了一些基礎功能測試:

左右滑動查看完整內容

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 
");
    }
/* 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
");
  }
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_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中我們需要先初始化:

左右滑動查看完整內容

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();


}

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

左右滑動查看完整內容

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
", (int)(OSPI_B_APP_DATA_SIZE));
  }
 else
  {
    printf("Write operation failure
");
  }
  printf("Write Data:
");
 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("
Read %d bytes completed successfully
", (int)(OSPI_B_APP_DATA_SIZE));
? ? }
? ??else
? ? {
? ? ? ? printf("
Read operation failure
");
? ? }
? ? printf("Read Data:
");
? ??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("
Data read matched data written
");
? ? ? ? printf("flash讀寫數(shù)據(jù)成功
");
? ? }
? ??else
? ? {
? ? ? ? printf("
Data read does not match data written
");
? ? ? ? printf("flash讀寫數(shù)據(jù)失敗
");
? ? }
? ??/* Performs OSPI erase operation */
? ? err?=?ospi_b_erase_operation(p_address);
? ??if(err==FSP_SUCCESS)
? ? {
? ? ? ??/* Print execution time */
? ? ? ? printf("Erase sector completed successfully
");
? ? }
? ??else
? ? {
? ? ? ? printf("erase operation failure
");
? ? }
? ??return?err;


}

串口打印結果如下:

a7345250-f035-11f0-92de-92fbcf53809c.png

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

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

瑞薩樣品/開發(fā)板申請入口如下,可掃描二維碼或復制鏈接到瀏覽器獲得

申請入口

瑞薩樣品/開發(fā)板申請入口:

https://jsj.top/f/AgUyYVa89a2804-f035-11f0-92de-92fbcf53809c.png

需要技術支持?

如您在使用瑞薩MCU/MPU產品中有任何問題,可識別下方二維碼或復制網(wǎng)址到瀏覽器中打開,進入瑞薩技術論壇尋找答案或獲取在線技術支持。

https://community-ja.renesas.com/zh/forums-groups/mcu-mpu/

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

    關注

    10

    文章

    1747

    瀏覽量

    155487
  • 瑞薩
    +關注

    關注

    37

    文章

    22481

    瀏覽量

    90828
  • 開發(fā)板
    +關注

    關注

    26

    文章

    6288

    瀏覽量

    117992
  • QSPI
    +關注

    關注

    0

    文章

    55

    瀏覽量

    13355
  • 核心板
    +關注

    關注

    6

    文章

    1396

    瀏覽量

    31994

原文標題:RA MCU眾測寶典 | 在瑞薩CPKCOR-RA8D1B核心板上實現(xiàn)QSPI讀取外部Flash

文章出處:【微信號:瑞薩嵌入式小百科,微信公眾號:瑞薩嵌入式小百科】歡迎添加關注!文章轉載請注明出處。

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

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

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

    RA8D1 CPK開發(fā)試用】開箱與點燈

    一、前言 RA8D1 CPK開發(fā)是業(yè)界首款基于Arm Cortex-M85內核的32位圖形微控制器,板載資源豐富,性能優(yōu)越。運行在480MHz的主頻下可
    發(fā)表于 10-08 01:04

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

    。 CPKCOR-RA8D1B核心板電子為中國市場設計的模塊化開發(fā), 使用
    發(fā)表于 10-20 20:22

    CPKCOR-RA8D1】+ 1.RA8D1開箱點燈

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

    CPKCOR-RA8D1RA8D1開箱測試報告

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

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

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

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

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

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

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

    CPKCOR-RA8D1】+ 基礎串口打印測試

    本文將演示如何為CPKCOR-RA8D1開發(fā)配置串口功能,并實現(xiàn)最簡單的“Hello World”數(shù)據(jù)打印。串口是嵌入式開發(fā)中最常用、
    發(fā)表于 10-30 09:40

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

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

    CPKCOR-RA8D1】基礎串口打印測試

    本文將演示如何為CPKCOR-RA8D1開發(fā)配置串口功能,并實現(xiàn)最簡單的“Hello World”數(shù)據(jù)打印。串口是嵌入式開發(fā)中最常用、
    發(fā)表于 10-30 15:23

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

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

    RA2E1ADC讀取

    RA2E1ADC配置內部參考電壓讀取外部ADC值進行校準,采集不到內部參考電壓的值。同時外部
    發(fā)表于 11-07 21:07

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

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

    RA MCU眾測寶典 | CPKCOR-RA8D1B核心板實現(xiàn)QSPI讀取外部Flash

    RA生態(tài)工作室關注我們“RAMCU眾測寶典”中I2C/SPI通信與顯示驅動專題更新了。這次我們聚焦CPKCOR-RA8D1B核心板】開
    的頭像 發(fā)表于 02-06 18:02 ?5219次閱讀
    <b class='flag-5'>RA</b> MCU眾測寶典 | <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'>實現(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>