1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
|
#include "gd32f30x.h"
#include <stdio.h>
#include "gd32f307c_eval.h"
#include "exmc_nandflash.h"
#define BUFFER_SIZE (0x100U)
#define NAND_GD_MAKERID (0xC8U)
#define NAND_GD_DEVICEID (0xF1U)
int main(void)
{
/* LED initialize */
gd_eval_led_init(LED2);
gd_eval_led_init(LED4);
/* config the USART */
gd_eval_com_init(EVAL_COM0);
/* config the EXMC access mode */
exmc_nandflash_init();
/* read NAND ID */
nand_read_id(&nand_id);
printf("read NAND ID");
/* print NAND ID */
printf("\r\nNand flash ID:0x%X 0x%X 0x%X 0x%X\r\n",nand_id.maker_id,nand_id.device_id,
nand_id.third_id,nand_id.fourth_id);
if((NAND_GD_MAKERID == nand_id.maker_id) && (NAND_GD_DEVICEID == nand_id.device_id))
{
/* set the read and write the address */
zone = 0;
block = 10;
page = 0;
pageoffset = 1100;
writereadaddr = ((zone * NAND_ZONE_SIZE + block) * NAND_BLOCK_SIZE + page)
* NAND_PAGE_SIZE + pageoffset;
/* whether address cross-border */
if((writereadaddr + BUFFER_SIZE ) > NAND_MAX_ADDRESS)
{
printf("\r\naddress cross-border");
/* failure, light on LED4 */
gd_eval_led_on(LED4);
while(1);
}
/* fill writebuffer with 0x00.. */
fill_buffer_nand(txbuffer, BUFFER_SIZE , 0x00);
/* write data to nand flash */
status = nand_write(writereadaddr, txbuffer, BUFFER_SIZE);
if(NAND_OK == status)
{
printf("\r\nwrite data successfully!");
}
else
{
printf("\r\nwrite data failure!");
/* failure, light on LED4 */
gd_eval_led_on(LED4);
while(1);
}
/* read data from nand flash */
status = nand_read(writereadaddr, rxbuffer, BUFFER_SIZE);
if(NAND_OK == status)
{
printf("\r\nread data successfully!");
}
else
{
printf("\r\nread data failure!\n\r");
/* failure, light on LED4 */
gd_eval_led_on(LED4);
while(1);
}
/* Read and write data comparison for equality */
writereadstatus = 0;
for(j = 0; j < BUFFER_SIZE; j++)
{
if(txbuffer[j] != rxbuffer[j])
{
writereadstatus++;
break;
}
}
printf("\r\nthe result to access the nand flash:");
if (writereadstatus == 0)
{
printf("\r\naccess NAND flash successfully!");
gd_eval_led_on(LED2);
}
else
{
printf("\r\naccess NAND flash failure!");
/* failure, light on LED4 */
gd_eval_led_on(LED4);
while(1);
}
printf("\r\nprintf data to be read:\r\n");
for(k = 0; k < BUFFER_SIZE; k ++)
{
printf("0x%02X ",rxbuffer[k]);
}
}
else
{
printf("\n\rread NAND ID failure!\n\r");
/* failure, light on LED4 */
gd_eval_led_on(LED4);
while(1);
}
while (1);
}
|