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)32 void 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)68 uint32_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)92 uint32_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)118 uint32_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)143 uint32_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)158 uint16_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