在线时间101 小时
UID3617445
注册时间2020-2-7
NXP金币217

TA的每日心情 | 开心 2025-7-10 13:07 |
---|
签到天数: 43 天 连续签到: 1 天 [LV.5]常住居民I
版主
  
- 积分
- 1528

- 最后登录
- 2025-7-23
|
基于LPC54XXX无内部flash,只有外部flash。
在使用外部flash启动,需要操作外部flash,需要将操作flash的函数定位到内部sram地址上,才能进行操作。
从外部flash启动中,操作spifi flash ,spifi不能进行初始化和reset。参考代码如下。
注意:读写操作都需要将函数定位到SRAM中执行,
注意W25Q128 flash芯片擦除是以4k大小除除的。
- for (i=0 ; i < 1024; i++)
- {
- if(i<=256)
- {
- g_buffer1[i] = 0x11;
- }
- if(i>255 && i<512){
- g_buffer1[i] =0x22;
- }
- if(i>=512 && i<768){
- g_buffer1[i] = 0x33;
- }
- if(i>=768 && i<1024){
- g_buffer1[i] = 0x44;
- }
-
- }
- //write_flash_sector(0x5000+0x400,(unsigned int*)buffer,1024);
- Erase_page(0x1000);
-
- Prog_Page(0x1000,(unsigned int*)buffer, 1024 );
-
- w25q_flash_read_byte(0x5000,&rxbuf,1024);
-
- void Erase_page(unsigned int PageAddr)
- {
- /* Reset the SPIFI to switch to command mode */
- EXAMPLE_SPIFI->STAT = SPIFI_STAT_RESET_MASK;
- /* Wait for the RESET flag cleared by HW */
- while (EXAMPLE_SPIFI->STAT & SPIFI_STAT_RESET_MASK)
- {
- }
- //EnableIRQ(SPIFI0_IRQn);
-
- /* Write enable */
- SPIFI_SetCommand(EXAMPLE_SPIFI, &command[WRITE_ENABLE]);
- /* Set address */
- //SPIFI_SetCommandAddress(EXAMPLE_SPIFI, PageAddr);
- EXAMPLE_SPIFI->ADDR = PageAddr;
- /* Erase sector */
- SPIFI_SetCommand(EXAMPLE_SPIFI, &command[ERASE_SECTOR]);
- /* Check if finished */
- check_if_finish();
-
- /* Reset to memory command mode */
- EXAMPLE_SPIFI->STAT = SPIFI_STAT_RESET_MASK;
- /* Wait for the RESET flag cleared by HW */
- while (EXAMPLE_SPIFI->STAT & SPIFI_STAT_RESET_MASK)
- {
- }
-
- SPIFI_SetMemoryCommand(EXAMPLE_SPIFI, &command[READ]);
-
- }
- #pragma arm section
- #pragma arm section code = "RAMCODE"
- void Prog_Page(unsigned int Addr, uint32_t *data, uint32_t len)
- {
- uint32_t *pData = data;
- uint32_t page=0;
- uint32_t i = 0, j = 0,datatmp=0;
- //PRINTF("Prog_Page");
- while(page<4)
- {
- /* Reset the SPIFI to switch to command mode */
- EXAMPLE_SPIFI->STAT = SPIFI_STAT_RESET_MASK;
- /* Wait for the RESET flag cleared by HW */
- while (EXAMPLE_SPIFI->STAT & SPIFI_STAT_RESET_MASK)
- {
- }
-
- SPIFI_SetCommand(EXAMPLE_SPIFI, &command[WRITE_ENABLE]);
- //SPIFI_SetCommandAddress(EXAMPLE_SPIFI, Addr);
- EXAMPLE_SPIFI->ADDR = Addr + page*PAGE_SIZE;
- SPIFI_SetCommand(EXAMPLE_SPIFI, &command[PROGRAM_PAGE]);
- #if 0
- for (i = 0; i < PAGE_SIZE/4; i ++)
- {
- EXAMPLE_SPIFI->DATA = *(pData++);
- }
- #else
- for (i = 0; i < PAGE_SIZE; i += 4)
- {
- for (j = 0; j < 4; j++)
- {
- datatmp |= ((uint32_t)(pData[i + j + page*PAGE_SIZE])) << (j * 8);
- }
- EXAMPLE_SPIFI->DATA = datatmp;
- datatmp = 0;
- }
- #endif
- page++;
- check_if_finish();
-
- /* Reset to memory command mode */
- EXAMPLE_SPIFI->STAT = SPIFI_STAT_RESET_MASK;
- /* Wait for the RESET flag cleared by HW */
- while (EXAMPLE_SPIFI->STAT & SPIFI_STAT_RESET_MASK)
- {
- }
-
- SPIFI_SetMemoryCommand(EXAMPLE_SPIFI, &command[READ]);
-
- }
- }
-
复制代码 读操作:
- uint8_t w25q_flash_read_byte(uint32_t addr,uint8_t *rxbuf,uint32_t num)
- {
- //uint32_t data[];
- uint8_t recv_buffer[33];
- uint32_t i=0,result=-1;
- uint8_t *val = (uint8_t *)FSL_FEATURE_SPIFI_START_ADDR;
- memset(recv_buffer,0,sizeof(recv_buffer));
- /* Reset the SPIFI to switch to command mode */
- EXAMPLE_SPIFI->STAT = SPIFI_STAT_RESET_MASK;
- /* Wait for the RESET flag cleared by HW */
- while (EXAMPLE_SPIFI->STAT & SPIFI_STAT_RESET_MASK)
- {
- }
- /* Reset to memory command mode */
- //SPIFI_ResetCommand(EXAMPLE_SPIFI);
-
- SPIFI_SetMemoryCommand(EXAMPLE_SPIFI, &command[READ]);
-
-
- for (i; i <num; i++)
- {
- // val = (uint8_t *)(FSL_FEATURE_SPIFI_START_ADDR + addr);
- // PRINTF("Data error 111 in address 0x%x, the value in memory is 0x%x\r\n", addr, *val);
- val = (uint8_t *)(FSL_FEATURE_SPIFI_START_ADDR + addr);
- //PRINTF("%d Data address addr 0x%x the value in memory is 0x%x\r\n", i,addr, *val);
- addr++;
-
-
- }
- return result;
- }
复制代码
|
|