-
Notifications
You must be signed in to change notification settings - Fork 18
/
main.c
163 lines (142 loc) · 4.29 KB
/
main.c
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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
//
// SPI シリアルフラッシュメモリ W25Q64 操作検証プログラム
// W25Q64のメモリ領域構造
// 総バイト数 8388608
// メモリ空間 24ビットアドレス指定 0x00000 - 0x7FFFFF
// ブロック数 128 (64KB/ブロック)
// セクタ数 2048 ( 4KB/セクタ)
// 総セクタ数 2048
#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>
#include <string.h>
#include <wiringPiSPI.h>
#include "W25Q64.h"
#define SPI_CHANNEL 0 // /dev/spidev0.0
//#define SPI_CHANNEL 1 // /dev/spidev0.1
//
// 書込みデータのダンプリスト
// dt(in) : データ格納先頭アドレス
// n(in) : 表示データ数
//
void dump(uint8_t *dt, uint32_t n) {
uint16_t clm = 0;
uint8_t data;
uint8_t sum;
uint8_t vsum[16];
uint8_t total =0;
uint32_t saddr =0;
uint32_t eaddr =n-1;
printf("----------------------------------------------------------\n");
uint16_t i;
for (i=0;i<16;i++) vsum[i]=0;
uint32_t addr;
for (addr = saddr; addr <= eaddr; addr++) {
data = dt[addr];
if (clm == 0) {
sum =0;
printf("%05x: ",addr);
}
sum+=data;
vsum[addr % 16]+=data;
printf("%02x ",data);
clm++;
if (clm == 16) {
printf("|%02x \n",sum);
clm = 0;
}
}
printf("----------------------------------------------------------\n");
printf(" ");
for (i=0; i<16;i++) {
total+=vsum[i];
printf("%02x ",vsum[i]);
}
printf("|%02x \n\n",total);
}
int main() {
uint8_t jedc[3]; // JEDEC-ID
uint8_t buf[256]; // 取得データ
uint8_t wdata[26]; // 書込みデータ
uint8_t i;
uint16_t n; // 取得データ数
// SPI channel 0 を 2MHz で開始。
// Start SPI channel 0 with 2MHz
if (wiringPiSPISetup(SPI_CHANNEL, 2000000) < 0) {
printf("SPISetup failed:\n");
}
// フラッシュメモリ利用開始
// Start Flush Memory
W25Q64_begin(SPI_CHANNEL);
// JEDEC IDの取得テスト
// JEDEC ID Get
//W25Q64_readManufacturer(buf);
W25Q64_readManufacturer(jedc);
printf("JEDEC ID : ");
for (i=0; i< 3; i++) {
printf("%x ",jedc[i]);
}
printf("\n");
// Unique IDの取得テスト
// Unique ID Get
W25Q64_readUniqieID(buf);
printf("Unique ID : ");
for (i=0; i< 8; i++) {
printf("%x ",buf[i]);
}
printf("\n");
// データの読み込み(アドレス0から256バイト取得)
// Read 256 byte data from Address=0
memset(buf,0,256);
n = W25Q64_read(0, buf, 256);
printf("Read Data: n=%d\n",n);
dump(buf,256);
// 高速データの読み込み(アドレス0から256バイト取得)
// First read 256 byte data from Address=0
memset(buf,0,256);
n = W25Q64_fastread(0, buf, 256);
printf("Fast Read Data: n=%d\n",n);
dump(buf,256);
// セクタ単位の削除
// Erase data by Sector
n = W25Q64_eraseSector(0,true);
printf("Erase Sector(0): n=%d\n",n);
memset(buf,0,256);
n = W25Q64_read (0, buf, 256);
dump(buf,256);
// データ書き込みテスト
// Write data to Sector=0 Address=10
for (i=0; i < 26;i++) {
wdata[i]='A'+i; // A-Z
}
n = W25Q64_pageWrite(0, 10, wdata, 26);
printf("page_write(0,10,d,26): n=%d\n",n);
// データの読み込み(アドレス0から256バイト取得)
// Read 256 byte data from Address=0
memset(buf,0,256);
n = W25Q64_read(0, buf, 256);
printf("Read Data: n=%d\n",n);
dump(buf,256);
// データ書き込みテスト
// Write data to Sector=0 Address=0
for (i=0; i < 10;i++) {
wdata[i]='0'+i; // 0-9
}
n = W25Q64_pageWrite(0, 0, wdata, 10);
printf("page_write(0,0,d,10): n=%d\n",n);
// 高速データの読み込み(アドレス0から256バイト取得)
// First read 256 byte data from Address=0
memset(buf,0,256);
n = W25Q64_fastread(0,buf, 256);
printf("Fast Read Data: n=%d\n",n);
dump(buf,256);
// ステータスレジスタ1の取得
// Get fron Status Register1
buf[0] = W25Q64_readStatusReg1();
printf("Status Register-1: %x\n",buf[0]);
// ステータスレジスタ2の取得
// Get fron Status Register2
buf[0] = W25Q64_readStatusReg2();
printf("Status Register-2: %x\n",buf[0]);
return 0;
}