1 /****************************************************************************************************************************************** 2 * 文件名称: SWM320_norflash.c 3 * 功能说明: SWM320单片机的NOR Flash驱动程序 4 * 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1 5 * 注意事项: 6 * 版本日期: V1.1.0 2017年10月25日 7 * 升级记录: 8 * 9 * 10 ******************************************************************************************************************************************* 11 * @attention 12 * 13 * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS WITH CODING INFORMATION 14 * REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. AS A RESULT, SYNWIT SHALL NOT BE HELD LIABLE 15 * FOR ANY DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE CONTENT 16 * OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING INFORMATION CONTAINED HEREIN IN CONN- 17 * -ECTION WITH THEIR PRODUCTS. 18 * 19 * COPYRIGHT 2012 Synwit Technology 20 *******************************************************************************************************************************************/ 21 #include "SWM320.h" 22 #include "SWM320_norflash.h" 23 24 25 /****************************************************************************************************************************************** 26 * 函数名称: NORFL_Init() 27 * 功能说明: NOR Flash控制器初始化 28 * 输 入: NORFL_InitStructure * initStruct 包含NOR Flash控制器相关设定值的结构体 29 * 输 出: 无 30 * 注意事项: 无 31 ******************************************************************************************************************************************/ NORFL_Init(NORFL_InitStructure * initStruct)32void NORFL_Init(NORFL_InitStructure * initStruct) 33 { 34 uint32_t i; 35 36 // 配置SRAM前需要刷新下SDRAM控制器 37 do { 38 SYS->CLKEN |= (1 << SYS_CLKEN_SDRAM_Pos); 39 40 while(SDRAMC->REFDONE == 0); 41 SDRAMC->REFRESH &= ~(1 << SDRAMC_REFRESH_EN_Pos); 42 43 for(i = 0; i < 1000; i++) __NOP(); 44 SYS->CLKEN &= ~(1 << SYS_CLKEN_SDRAM_Pos); 45 } while(0); 46 47 SYS->CLKEN |= (1 << SYS_CLKEN_NORFL_Pos); 48 49 NORFLC->CR = ((initStruct->DataWidth == 8 ? 1 : 0) << NORFLC_CR_BYTEIF_Pos) | 50 (initStruct->WELowPulseTime << NORFLC_CR_WRTIME_Pos) | 51 (initStruct->OEPreValidTime << NORFLC_CR_RDTIME_Pos); 52 53 NORFLC->IE = 3; 54 NORFLC->IF = 3; // 清除中断标志 55 if(initStruct->OperFinishIEn) NORFLC->IM &= ~(1 << NORFLC_IM_FINISH_Pos); 56 else NORFLC->IM |= (1 << NORFLC_IM_FINISH_Pos); 57 if(initStruct->OperTimeoutIEn) NORFLC->IM &= ~(1 << NORFLC_IM_TIMEOUT_Pos); 58 else NORFLC->IM |= (1 << NORFLC_IM_TIMEOUT_Pos); 59 } 60 61 /****************************************************************************************************************************************** 62 * 函数名称: NORFL_ChipErase() 63 * 功能说明: NOR Flash整片擦除 64 * 输 入: 无 65 * 输 出: uint32_t 0 擦除成功 1 擦除超时 66 * 注意事项: 无 67 ******************************************************************************************************************************************/ NORFL_ChipErase(void)68uint32_t NORFL_ChipErase(void) 69 { 70 uint32_t res; 71 72 NORFLC->CMD = (NORFL_CMD_CHIP_ERASE << NORFLC_CMD_CMD_Pos); 73 74 while(((NORFLC->IF & NORFLC_IF_FINISH_Msk) == 0) && 75 ((NORFLC->IF & NORFLC_IF_TIMEOUT_Msk) == 0)) __NOP(); 76 77 if(NORFLC->IF & NORFLC_IF_FINISH_Msk) res = 0; 78 else res = 1; 79 80 NORFLC->IF = NORFLC_IF_FINISH_Msk | NORFLC_IF_TIMEOUT_Msk; 81 82 return res; 83 } 84 85 /****************************************************************************************************************************************** 86 * 函数名称: NORFL_SectorErase() 87 * 功能说明: NOR Flash扇区擦除 88 * 输 入: uint32_t addr 要擦除扇区的起始地址 89 * 输 出: uint32_t 0 擦除成功 1 擦除超时 90 * 注意事项: MX29LV128DB 前8扇区为8K、后255扇区为64K MX29LV128DT 前255扇区为64K、后8扇区为8K 91 ******************************************************************************************************************************************/ NORFL_SectorErase(uint32_t addr)92uint32_t NORFL_SectorErase(uint32_t addr) 93 { 94 uint32_t res; 95 96 NORFLC->ADDR = addr; 97 NORFLC->CMD = (NORFL_CMD_SECTOR_ERASE << NORFLC_CMD_CMD_Pos); 98 99 while(((NORFLC->IF & NORFLC_IF_FINISH_Msk) == 0) && 100 ((NORFLC->IF & NORFLC_IF_TIMEOUT_Msk) == 0)) __NOP(); 101 102 if(NORFLC->IF & NORFLC_IF_FINISH_Msk) res = 0; 103 else res = 1; 104 105 NORFLC->IF = NORFLC_IF_FINISH_Msk | NORFLC_IF_TIMEOUT_Msk; 106 107 return res; 108 } 109 110 /****************************************************************************************************************************************** 111 * 函数名称: NORFL_Write() 112 * 功能说明: NOR Flash写 113 * 输 入: uint32_t addr 数据要写入的地址 114 * uint32_t data 要写入的数据 115 * 输 出: uint32_t 0 写入成功 1 写入超时 116 * 注意事项: 硬件连接,数据线为16位时,半字写入;数据线为8位时,字节写入 117 ******************************************************************************************************************************************/ NORFL_Write(uint32_t addr,uint32_t data)118uint32_t NORFL_Write(uint32_t addr, uint32_t data) 119 { 120 uint32_t res; 121 122 NORFLC->ADDR = addr; 123 NORFLC->CMD = (NORFL_CMD_PROGRAM << NORFLC_CMD_CMD_Pos) | (data << NORFLC_CMD_DATA_Pos); 124 125 while(((NORFLC->IF & NORFLC_IF_FINISH_Msk) == 0) && 126 ((NORFLC->IF & NORFLC_IF_TIMEOUT_Msk) == 0)) __NOP(); 127 128 if(NORFLC->IF & NORFLC_IF_FINISH_Msk) res = 0; 129 else res = 1; 130 131 NORFLC->IF = NORFLC_IF_FINISH_Msk | NORFLC_IF_TIMEOUT_Msk; 132 133 return res; 134 } 135 136 /****************************************************************************************************************************************** 137 * 函数名称: NORFL_Read() 138 * 功能说明: NOR Flash读 139 * 输 入: uint32_t addr 数据要读出的地址 140 * 输 出: uint32_t 读出的数据 141 * 注意事项: 硬件连接,数据线为16位时,半字读出;数据线为8位时,字节读出 142 ******************************************************************************************************************************************/ NORFL_Read(uint32_t addr)143uint32_t NORFL_Read(uint32_t addr) 144 { 145 NORFLC->ADDR = addr; 146 NORFLC->CMD = (NORFL_CMD_READ << NORFLC_CMD_CMD_Pos); 147 148 return (NORFLC->CMD & NORFLC_CMD_DATA_Msk); 149 } 150 151 /****************************************************************************************************************************************** 152 * 函数名称: NORFL_ReadID() 153 * 功能说明: NOR Flash读ID 154 * 输 入: uint32_t id_addr ID地址,此参数是芯片相关的,每种芯片都不同 155 * 输 出: uint16_t 读取到的ID 156 * 注意事项: 无 157 ******************************************************************************************************************************************/ NORFL_ReadID(uint32_t id_addr)158uint16_t NORFL_ReadID(uint32_t id_addr) 159 { 160 uint16_t id; 161 162 NORFLC->CMD = (NORFL_CMD_AUTO_SELECT << NORFLC_CMD_CMD_Pos); 163 164 NORFLC->ADDR = id_addr; 165 NORFLC->CMD = (NORFL_CMD_READ << NORFLC_CMD_CMD_Pos); 166 167 id = NORFLC->CMD & NORFLC_CMD_DATA_Msk; 168 169 NORFLC->CMD = (NORFL_CMD_RESET << NORFLC_CMD_CMD_Pos); // 退出ID读取模式 170 171 return id; 172 } 173