打印

[PSoC 4] 问一下PSOC4 flash读写的问题

[复制链接]
308|3
跳转到指定楼层
楼主
本帖最后由 qw014756 于 2019-7-12 16:24 编辑

入手的片子是CY8C4147  128K ,看提供的CYflash.c里只有写函数,请问具体读取和擦除是怎么实现的。
也不是很清楚 这些资料去哪找,麻烦知道的说一下,谢谢

使用特权

评论回复

相关资料

沙发
 楼主 | 2019-7-12 16:14 | 只看该作者
uint32 CySysFlashWriteRow(uint32 rowNum, const uint8 rowData[])
{
    volatile uint32 retValue = CY_SYS_FLASH_SUCCESS;
    volatile uint32 clkCnfRetValue = CY_SYS_FLASH_SUCCESS;
    volatile uint32 parameters[(CY_FLASH_SIZEOF_ROW + CY_FLASH_SRAM_ROM_DATA) / sizeof(uint32)];
    uint8  interruptState;

    #if (CY_FLASH_CHECKSUM_WORKAROUND)
        uint32 needChecksumWorkaround = 0u;
        uint32 savedIndex = 0u;
        uint32 savedValue = 0u;
        uint32 checksum = 0u;
        uint32 bits = 0u;
        uint32 i;
    #endif  /* (CY_FLASH_CHECKSUM_WORKAROUND) */

    if ((rowNum < CY_FLASH_NUMBER_ROWS) && (rowData != 0u))
    {
        /* Copy data to be written into internal variable */
        (void)memcpy((void *)&parameters[2u], rowData, CY_FLASH_SIZEOF_ROW);

        #if (CY_FLASH_CHECKSUM_WORKAROUND)

            for (i = 2u; i < ((CY_FLASH_SIZEOF_ROW / sizeof(uint32)) + 2u); i++)
            {
                uint32 tmp = parameters[i];
                if (tmp != 0u)
                {
                    checksum += tmp;
                    bits |= tmp;
                    savedIndex = i;
                }
            }

            needChecksumWorkaround = ((checksum == 0u) && (bits != 0u)) ? 1u : 0u;
            if (needChecksumWorkaround != 0u)
            {
                savedValue = parameters[savedIndex];
                parameters[savedIndex] = 0u;
            }
        #endif  /* (CY_FLASH_CHECKSUM_WORKAROUND) */

        /* Load Flash Bytes */
        parameters[0u] = (uint32) (CY_FLASH_GET_MACRO_FROM_ROW(rowNum)        << CY_FLASH_PARAM_MACRO_SEL_OFFSET) |
                         (uint32) (CY_FLASH_PAGE_LATCH_START_ADDR             << CY_FLASH_PARAM_ADDR_OFFSET     ) |
                         (uint32) (CY_FLASH_KEY_TWO(CY_FLASH_API_OPCODE_LOAD) << CY_FLASH_PARAM_KEY_TWO_OFFSET  ) |
                         CY_FLASH_KEY_ONE;
        parameters[1u] = CY_FLASH_SIZEOF_ROW - 1u;

        CY_FLASH_CPUSS_SYSARG_REG = (uint32) &parameters[0u];
        CY_FLASH_CPUSS_SYSREQ_REG = CY_FLASH_CPUSS_REQ_START | CY_FLASH_API_OPCODE_LOAD;
        CY_NOP;
        retValue = CY_FLASH_API_RETURN;

        if(retValue == CY_SYS_FLASH_SUCCESS)
        {
            /***************************************************************
            * Mask all the exceptions to guarantee that Flash write will
            * occur in the atomic way. It will not affect system call
            * execution (flash row write) since it is executed in the NMI
            * context.
            ***************************************************************/
            interruptState = CyEnterCriticalSection();

            clkCnfRetValue = CySysFlashClockBackup();

        #if(CY_IP_SPCIF_SYNCHRONOUS)
            if(clkCnfRetValue == CY_SYS_FLASH_SUCCESS)
            {
                retValue = CySysFlashClockConfig();
            }
        #endif  /* (CY_IP_SPCIF_SYNCHRONOUS) */

            if(retValue == CY_SYS_FLASH_SUCCESS)
            {
                /* Write Row */
                parameters[0u]  = (uint32) (((uint32) CY_FLASH_KEY_TWO(CY_FLASH_API_OPCODE_WRITE_ROW) <<  CY_FLASH_PARAM_KEY_TWO_OFFSET) | CY_FLASH_KEY_ONE);
                parameters[0u] |= (uint32)(rowNum << 16u);

                CY_FLASH_CPUSS_SYSARG_REG = (uint32) &parameters[0u];
                CY_FLASH_CPUSS_SYSREQ_REG = CY_FLASH_CPUSS_REQ_START | CY_FLASH_API_OPCODE_WRITE_ROW;
                CY_NOP;
                retValue = CY_FLASH_API_RETURN;
            }

            #if (CY_FLASH_CHECKSUM_WORKAROUND)

                if ((retValue == CYRET_SUCCESS) && (needChecksumWorkaround != 0u))
                {
                    (void)memset((void *)&parameters[2u], 0, CY_FLASH_SIZEOF_ROW);
                    parameters[savedIndex] = savedValue;

                    /* Load Flash Bytes */
                    parameters[0u] = (uint32) (CY_FLASH_GET_MACRO_FROM_ROW(rowNum)        << CY_FLASH_PARAM_MACRO_SEL_OFFSET) |
                                     (uint32) (CY_FLASH_PAGE_LATCH_START_ADDR             << CY_FLASH_PARAM_ADDR_OFFSET     ) |
                                     (uint32) (CY_FLASH_KEY_TWO(CY_FLASH_API_OPCODE_LOAD) << CY_FLASH_PARAM_KEY_TWO_OFFSET  ) |
                                     CY_FLASH_KEY_ONE;
                    parameters[1u] = CY_FLASH_SIZEOF_ROW - 1u;

                    CY_FLASH_CPUSS_SYSARG_REG = (uint32) &parameters[0u];
                    CY_FLASH_CPUSS_SYSREQ_REG = CY_FLASH_CPUSS_REQ_START | CY_FLASH_API_OPCODE_LOAD;
                    CY_NOP;
                    retValue = CY_FLASH_API_RETURN;


                    if(retValue == CY_SYS_FLASH_SUCCESS)
                    {
                        /* Program Row */
                        parameters[0u]  =
                            (uint32) (((uint32) CY_FLASH_KEY_TWO(CY_FLASH_API_OPCODE_PROGRAM_ROW) <<
                                                    CY_FLASH_PARAM_KEY_TWO_OFFSET) | CY_FLASH_KEY_ONE);
                        parameters[0u] |= (uint32)(rowNum << 16u);

                        CY_FLASH_CPUSS_SYSARG_REG = (uint32) &parameters[0u];
                        CY_FLASH_CPUSS_SYSREQ_REG = CY_FLASH_CPUSS_REQ_START | CY_FLASH_API_OPCODE_PROGRAM_ROW;
                        CY_NOP;
                        retValue = CY_FLASH_API_RETURN;
                    }
                }
            #endif  /* (CY_FLASH_CHECKSUM_WORKAROUND) */

            if(clkCnfRetValue == CY_SYS_FLASH_SUCCESS)
            {
                clkCnfRetValue = CySysFlashClockRestore();

                if(clkCnfRetValue != CY_SYS_FLASH_SUCCESS)
                {
                    retValue = clkCnfRetValue;
                }
            }

            CyExitCriticalSection(interruptState);
        }
    }
    else
    {
        retValue = CY_SYS_FLASH_INVALID_ADDR;
    }

    return (retValue);
}

使用特权

评论回复
板凳
 楼主 | 2019-7-12 16:15 | 只看该作者
只看到了是按照扇区去写,然后扇区怎么擦除呢

使用特权

评论回复
地板
 楼主 | 2019-7-12 16:23 | 只看该作者
有知道去哪找资料的么

使用特权

评论回复
扫描二维码,随时随地手机跟帖
*滑动验证:
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

在线客服 快速回复 返回顶部 返回列表