找回密码
 立即注册

QQ登录

只需一步,快速开始

打印 上一主题 下一主题
开启左侧

[Real Time Processor] SPI_Flash Execution Problem

[复制链接]
跳转到指定楼层
楼主
yonggo 发表于 2024-3-17 19:08:10 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 yonggo 于 2024-3-19 21:11 编辑

管理員好,各位神人好,想請問一下
我透過新唐提供的https://github.com/OpenNuvoton/MA35D1_RTP_BSP
裡面的MA35D1_RTP_BSP/SampleCode/StdDriver/SPI_Flash,
我的開發版是MA35D16F987C,Flash為winbond的W25N02ZEIR
步驟如下:

1. 將這個源碼用NuEclipse編譯出SPI_Flash.elf
2. 放置到MA35D1的/usr/fw這個資料夾(自己建立的)
3. # echo -n /usr/fw > /sys/module/firmware_class/parameters/path
4. # echo -n SPI_Flash.elf > /sys/class/remoteproc/remoteproc0/firmware
5. # echo start > /sys/class/remoteproc/remoteproc0/state
6. 利用UART16 print 出結果
-----------------------------------------------------------------------------------------------
問題1: 在 uint16_t SpiFlash_ReadMidDid(void) 函數卡住(如圖片)
並沒有跳到if判斷的結果:
if((u16ID = SpiFlash_ReadMidDid()) != 0xEF14)
{
    printf("Wrong ID, 0x%x\n", u16ID);
    while(1);
}
else
    printf("Flash found: W25X16 ...\n");
-----------------------------------------------------------------------------------------------
問題2: 想更改SYS_Init函數中的XT1_OUT與XT1_IN串口設置
void SYS_Init(void)
{
    /* Set XT1_OUT(PF.2) and XT1_IN(PF.3) to input mode */
    PF->MODE &= ~(GPIO_MODE_MODE2_Msk | GPIO_MODE_MODE3_Msk);
    ...
}
但手冊中XT1_OUT及XT1_IN並不在MA35D16F987的PF.2和PF.3,想請問如何設定?
-----------------------------------------------------------------------------------------------
註:有更改UART16及SPI0串口設置
void SYS_Init(void){
    ...
    /* Set GPE multi-function pins for UART0 RXD and TXD */    SYS->GPD_MFPH &= ~(SYS_GPD_MFPH_PD10MFP_Msk | SYS_GPD_MFPH_PD11MFP_Msk);
    SYS->GPD_MFPH |= SYS_GPD_MFPH_PD10MFP_UART16_RXD | SYS_GPD_MFPH_PD11MFP_UART16_TXD;

    /* Setup SPI0 multi-function pins */
    /* GP G */
    SYS->GPG_MFPL &= ~(SYS_GPG_MFPL_PG0MFP_Msk);
    SYS->GPG_MFPL |= SYS_GPG_MFPL_PG0MFP_SPI0_SS0;
    /* GP B */
    SYS->GPB_MFPH &= ~(SYS_GPB_MFPH_PB9MFP_Msk);
    SYS->GPB_MFPH |= SYS_GPB_MFPH_PB9MFP_SPI0_CLK;
    /* GP L */
    SYS->GPL_MFPH &= ~(SYS_GPL_MFPH_PL14MFP_Msk | SYS_GPL_MFPH_PL15MFP_Msk);
    SYS->GPL_MFPH |= SYS_GPL_MFPH_PL14MFP_SPI0_MOSI | SYS_GPL_MFPH_PL15MFP_SPI0_MISO;
}

圖片結果:











SPI_Flash halt.png (121.45 KB, 下载次数: 45)

SPI_Flash halt.png
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 顶 踩
回复

使用道具 举报

推荐
qwang 发表于 2024-3-20 13:42:35 | 只看该作者

回帖奖励 +1

看起来是卡在   // wait tx finish
    while(SPI_IS_BUSY(SPI_FLASH_PORT));
请确认一下TFA dts里SSPCC的设置
是否spi0有分配给subm
回复 支持 1 反对 0

使用道具 举报

板凳
 楼主| yonggo 发表于 2024-3-29 23:50:17 | 只看该作者
感谢回覆, 已在/home/user/buildroot/MA35D1_Buildroot/output/build/arm-trusted-firmware-custom/fdts/ma35d1.dtsi中sspcc module加入SPI0_SUBM如下:
sspcc: sspcc@404F0000 {
    compatible="nuvoton,ma35d1-sspcc";
    reg=<0x0 0x404F0000 0x0 0x1000>;
    config=<UART0_TZNS>,
        ...
        <SPI0_SUBM>;
};
回复 支持 反对

使用道具 举报

地板
 楼主| yonggo 发表于 2024-3-29 23:56:09 | 只看该作者
qwang 发表于 2024-3-20 13:42
看起来是卡在   // wait tx finish
    while(SPI_IS_BUSY(SPI_FLASH_PORT));
请确认一下TFA dts里SSPCC的 ...

目前执行SPI_Flash.elf仍卡在此while()中,
uint16_t SpiFlash_ReadMidDid(void) {
    ...
    while(!SPI_GET_RX_FIFO_EMPTY_FLAG(SPI_FLASH_PORT))
    {
        printf("receiving RX data...\n");
        u8RxData[u8DataCnt++]=SPI_READ_RX(SPI_FLASH_PORT);
    }
}
回复 支持 反对

使用道具 举报

5#
 楼主| yonggo 发表于 2024-3-30 00:00:02 | 只看该作者
本帖最后由 yonggo 于 2024-3-30 00:20 编辑
yonggo 发表于 2024-3-29 23:56
目前执行SPI_Flash.elf仍卡在此while()中,
uint16_t SpiFlash_ReadMidDid(void) {
    ...

我在spi.c中的SPI_Open()函数的else判断式:
else {
    spi->CLKDIV=(spi->CLKDIV & (~SPI_CLKDIV_DIVIDER_Msk)) | (u32Div<<SPI_CLKDIV_DIVIDER_Pos);
    u32RetValue=(u32ClkSrc/(u32Div + 1U));
    printf("u32Div=%u\n", u32Div);
    printf("spi->CLKDIV=%u\n", spi->CLKDIV);
}
得到u32Div=17,spi->CLKDIV=0,无法写入spi相關寄存器
写入spi相關寄存器需要設定嗎
回复 支持 反对

使用道具 举报

6#
 楼主| yonggo 发表于 2024-3-30 00:19:02 | 只看该作者
SPI_Flash main中已有解锁寄存器的相关代码:

SYS_UnlockReg.png (36.28 KB, 下载次数: 33)

SYS_UnlockReg.png
回复 支持 反对

使用道具 举报

7#
 楼主| yonggo 发表于 2024-4-1 22:12:30 | 只看该作者
qwang 发表于 2024-3-20 13:42
看起来是卡在   // wait tx finish
    while(SPI_IS_BUSY(SPI_FLASH_PORT));
请确认一下TFA dts里SSPCC的 ...

感謝回覆,已解決所有問題。
1. 改完<SPI0_SUBM>後,要重新make arm-trusted-firmware-rebuild。(buildroot環境)
2. A35與M4不能共同持有SPI0的使用權,如果要使用M4 SPI的話,需要將linux-custom中的ma35d1.dtsi中的spi0狀態改為disable。
回复 支持 反对

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies |上传

本版积分规则

新唐MCU