野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 378|回复: 2

STM32U585OCTOSPI读取 ICNA3306 显示屏 ID 失败,求助;

[复制链接]
发表于 7 天前 | 显示全部楼层 |阅读模式
本帖最后由 黎明降至 于 2025-4-8 18:04 编辑

我使用ospi接口驱动icna3306AMOLED屏幕读取id,获取的数据都是0,不知道怎么解决,求助各位看一下是我代码哪里有问题
/* OCTOSPI1 init function */
void MX_OCTOSPI1_Init(void)
{
    /* USER CODE BEGIN OCTOSPI1_Init 0 */

    /* USER CODE END OCTOSPI1_Init 0 */

    OSPIM_CfgTypeDef sOspiManagerCfg = {0};
    HAL_OSPI_DLYB_CfgTypeDef HAL_OSPI_DLYB_Cfg_Struct = {0};

    /* USER CODE BEGIN OCTOSPI1_Init 1 */

    /* USER CODE END OCTOSPI1_Init 1 */

    hospi1.Instance = OCTOSPI1;
    hospi1.Init.ChipSelectHighTime = 1;
    hospi1.Init.FifoThreshold = 32;
    hospi1.Init.SampleShifting = HAL_OSPI_SAMPLE_SHIFTING_HALFCYCLE;
    hospi1.Init.DualQuad = HAL_OSPI_DUALQUAD_DISABLE;
    hospi1.Init.DeviceSize = 31;
    hospi1.Init.ClockMode = HAL_OSPI_CLOCK_MODE_3;
    hospi1.Init.ClockPrescaler = 16;
    hospi1.Init.WrapSize = HAL_OSPI_WRAP_NOT_SUPPORTED;
    hospi1.Init.MemoryType = HAL_OSPI_MEMTYPE_MACRONIX;
    hospi1.Init.FreeRunningClock = HAL_OSPI_FREERUNCLK_DISABLE;
    hospi1.Init.DelayHoldQuarterCycle = HAL_OSPI_DHQC_DISABLE;
    hospi1.Init.ChipSelectBoundary = 0;
    hospi1.Init.DelayBlockBypass = HAL_OSPI_DELAY_BLOCK_BYPASSED;
    hospi1.Init.MaxTran = 0;
    hospi1.Init.Refresh = 0;

    if (HAL_OSPI_Init(&hospi1) != HAL_OK)
    {
        Error_Handler();
    }
    sOspiManagerCfg.ClkPort = 1;
    sOspiManagerCfg.NCSPort = 1;
    sOspiManagerCfg.IOLowPort = HAL_OSPIM_IOPORT_1_LOW;
    if (HAL_OSPIM_Config(&hospi1, &sOspiManagerCfg, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
    {
        Error_Handler();
    }
    HAL_OSPI_DLYB_Cfg_Struct.Units = 0;
    HAL_OSPI_DLYB_Cfg_Struct.PhaseSel = 0;
    if (HAL_OSPI_DLYB_SetConfig(&hospi1, &HAL_OSPI_DLYB_Cfg_Struct) != HAL_OK)
    {
        Error_Handler();
    }
    /* USER CODE BEGIN OCTOSPI1_Init 2 */

    /* USER CODE END OCTOSPI1_Init 2 */
}

void HAL_OSPI_MspInit(OSPI_HandleTypeDef *ospiHandle)
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
    if (ospiHandle->Instance == OCTOSPI1)
    {
        /* USER CODE BEGIN OCTOSPI1_MspInit 0 */

        /* USER CODE END OCTOSPI1_MspInit 0 */

        /** Initializes the peripherals clock */
        PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_OSPI;
        PeriphClkInit.OspiClockSelection = RCC_OSPICLKSOURCE_SYSCLK;
        if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
        {
            Error_Handler();
        }

        /* OCTOSPI1 clock enable */
        __HAL_RCC_OSPIM_CLK_ENABLE();
        __HAL_RCC_OSPI1_CLK_ENABLE();

        __HAL_RCC_GPIOA_CLK_ENABLE();
        __HAL_RCC_GPIOB_CLK_ENABLE();
        /** OCTOSPI1 GPIO Configuration
         * PA3     ------> OCTOSPIM_P1_CLK
         * PA4     ------> OCTOSPIM_P1_NCS
         * PA6     ------> OCTOSPIM_P1_IO3
         * PA7     ------> OCTOSPIM_P1_IO2
         * PB0     ------> OCTOSPIM_P1_IO1
         * PB1     ------> OCTOSPIM_P1_IO0
         */
        GPIO_InitStruct.Pin = GPIO_PIN_3;
        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
        GPIO_InitStruct.Pull = GPIO_PULLUP;
        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
        GPIO_InitStruct.Alternate = GPIO_AF10_OCTOSPI1;
        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

        GPIO_InitStruct.Pin = GPIO_PIN_4;
        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
        GPIO_InitStruct.Pull = GPIO_PULLUP;
        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
        GPIO_InitStruct.Alternate = GPIO_AF3_OCTOSPI1;
        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

        GPIO_InitStruct.Pin = GPIO_PIN_6 | GPIO_PIN_7;
        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
        GPIO_InitStruct.Pull = GPIO_NOPULL;
        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
        GPIO_InitStruct.Alternate = GPIO_AF10_OCTOSPI1;
        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

        GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1;
        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
        GPIO_InitStruct.Pull = GPIO_NOPULL;
        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
        GPIO_InitStruct.Alternate = GPIO_AF10_OCTOSPI1;
        HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

        /* OCTOSPI1 DMA Init */
        /* GPDMA1_REQUEST_OCTOSPI1 Init */

        /* USER CODE BEGIN OCTOSPI1_MspInit 1 */

        /* USER CODE END OCTOSPI1_MspInit 1 */
    }
}
uint16_t LCD_SendCommand(uint8_t cmd)
{
    OSPI_RegularCmdTypeDef sCommand = {0};

    sCommand.InstructionMode = HAL_OSPI_INSTRUCTION_1_LINE;
    sCommand.Instruction = cmd;

    sCommand.Address = 0;
    sCommand.AddressMode = HAL_OSPI_ADDRESS_1_LINE;
    sCommand.AddressSize = HAL_OSPI_ADDRESS_24_BITS;

    sCommand.AlternateBytesMode = HAL_OSPI_ALTERNATE_BYTES_NONE;
    sCommand.AlternateBytesSize = HAL_OSPI_ALTERNATE_BYTES_8_BITS;
    sCommand.AlternateBytes = 0;

    sCommand.DataDtrMode = HAL_OSPI_DATA_DTR_DISABLE;
    sCommand.SIOOMode = HAL_OSPI_SIOO_INST_EVERY_CMD;

    sCommand.DataMode = HAL_OSPI_DATA_NONE;
    sCommand.DummyCycles = 0;
    sCommand.NbData = 0;

    if (HAL_OSPI_Command(&hospi1, &sCommand, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
    {
        return HAL_ERROR;
    }
    return HAL_OK;
}

uint8_t ICNA3306_ReadData(uint8_t address)
{
    uint8_t idBuffer[3] = {0};
    OSPI_RegularCmdTypeDef sCommand = {0};

    /* 配置操作类型 */
    sCommand.OperationType = HAL_OSPI_OPTYPE_COMMON_CFG;

    /* 指令阶段:采用单线发送 */
    sCommand.InstructionMode = HAL_OSPI_INSTRUCTION_1_LINE;
    sCommand.InstructionDtrMode = HAL_OSPI_INSTRUCTION_DTR_DISABLE;
    sCommand.Instruction = 0x03; // 读数据命令
    sCommand.FlashId = HAL_OSPI_FLASH_ID_1;
    sCommand.AlternateBytesMode = HAL_OSPI_ALTERNATE_BYTES_NONE;
    sCommand.AlternateBytesSize = HAL_OSPI_ALTERNATE_BYTES_8_BITS;
    sCommand.AlternateBytes = 0;

    /* 地址阶段:采用单线传输 */
    sCommand.AddressMode = HAL_OSPI_ADDRESS_1_LINE;
    sCommand.AddressSize = HAL_OSPI_ADDRESS_24_BITS;
    sCommand.Address = 0x000000 | (address << 8);

    /* 数据阶段:采用单线接收 */
    sCommand.DataMode = HAL_OSPI_DATA_1_LINE;
    sCommand.DataDtrMode = HAL_OSPI_DATA_DTR_DISABLE;
    sCommand.DummyCycles = 0;
    sCommand.NbData = 3;
    sCommand.DQSMode = HAL_OSPI_DQS_DISABLE; // 不使用DQS

    sCommand.SIOOMode = HAL_OSPI_SIOO_INST_EVERY_CMD;

    if (HAL_OSPI_Command(&hospi1, &sCommand, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
    {
        printf("Command failed\r\n");
        return 0;
    }
    if (HAL_OSPI_Receive(&hospi1, idBuffer, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
    {
        printf("Receive failed\r\n");
        return 0;
    }

    printf("SINGLE RAW ID: 0x%02X 0x%02X 0x%02X\r\n", idBuffer[0], idBuffer[1], idBuffer[2]);
    return idBuffer[0];
}



    // 硬件复位
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); // 复位引脚拉低
    HAL_Delay(100);                                       // 等待10ms
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);   // 复位引脚拉高
    // 软件复位
    LCD_SendCommand(0x01); // Software Reset
    HAL_Delay(120);

    // 设置单线SPI模式
    LCD_SendCommand(0xFF);
    // 退出Sleep模式
    LCD_SendCommand(0x11);
    // 读取ID
    ICNA3306_ReadData(0x04); // 0x04对应RDDID命令




时序图

时序图
野火论坛202504081604179606..png
野火论坛202504081604048135..png
野火论坛202504081603367563..png

ICNA_3306_Datasheet_release_V0_03_20211008_2_966e953f85.pdf

9.87 MB, 下载次数: 3

主题推荐

回复

使用道具 举报

发表于 4 天前 | 显示全部楼层
你的LCD_SendCommand();发出数据对吗?似乎地址设置为0了,正常你RESET LCD应该可以看到现象吧
野火论坛202504111734549239..png
回复 支持 反对

举报

 楼主| 发表于 前天 00:02 | 显示全部楼层
Nalimca 发表于 2025-4-11 17:39
你的LCD_SendCommand();发出数据对吗?似乎地址设置为0了,正常你RESET LCD应该可以看到现象吧 ...

感谢你的回答,已经解决问题了,确实是这个没有写好。后面修改我可以点亮屏幕,不过id还是读不到,不管了。
回复 支持 反对

举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2025-4-15 21:52 , Processed in 0.144007 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表