|
使用Platformio平台的libopencm3开发框架来开发STM32G0,以下为EEPROM M24C02的使用方法。 7 @# j! [- b" q' r" H2 i* z' W, @
1 新建项目建立eeprom项目
0 B2 `) f5 x0 |
在PIO的Home页面新建项目,项目名称eeprom,选择开发板为 MonkeyPi_STM32_G070RB,开发框架选择libopencm3;
# }! N+ W5 d+ |+ J( K% P
- 1upload_protocol = cmsis-dap. s9 J E: X& }( {2 H
- 2debug_tool = cmsis-dap
复制代码 8 E, ^; l5 T9 M, } n6 Z( ]4 Z0 q$ V. @
5 p1 @6 Q) N7 ^$ ^- A2 编写程序首先从之前的I2C项目中拷贝sw_i2c库文件夹到当前项目的lib目录下: 3 X/ M( G. x$ e- q4 V4 f
; k8 R- N" r$ K8 x
+ o6 }- e4 d/ j l6 p; Y
本次不使用串口打印,直接使用SEGGER rtt打印,因此将SEGGER RTT也放置在lib目录下,便于调试打印: - 1void log(const char* fmt, ...)
8 ^/ Q- L/ P) Q8 h7 P! t* s$ a - 2{3 g- s5 ~4 K# S9 N7 W
- 3 va_list va;
- A ]$ [& `; h+ K0 C - 4 va_start(va, fmt);
& \. j# \0 j- l$ \: t - 5 SEGGER_RTT_vprintf(0,fmt,&va);% c: j |) \) v" ?" s
- 6 va_end(va);
9 ^% |7 V" ~$ e - 7}
复制代码 8 A1 O, t, b' n- C4 D# K
2.1 EEPROM 写数据- 1static inline bool m24cxx_write_one_byte(uint8_t addr, uint8_t data)
) g5 B+ L9 M% f" U6 z) D4 i, t - 2{6 a3 E3 f. R+ V- D0 Q3 H. n0 l
- 3 uint8_t buffer[2];0 }2 |2 @8 [( D& h7 A
- 4
/ @/ I" h. c: g# \( [ - 5 buffer[0] = addr;
7 Y1 q( l1 ^2 I* f - 6 buffer[1] = data;. v$ i, y( D; v
- 7 return sw_i2c_transfer(M24CXX_DEVICE_ADDR, buffer, 2, 0, 0);
( N3 n1 p5 Y$ V9 z) q# |! `& Q7 g/ O - 8}
复制代码
7 P! S1 `/ x2 w) U' O! }& [ `, D: X1 ^) k
2.2 EEPROM 读数据
5 b3 \( ^5 F/ d; P5 A1 T- 1static inline bool m24cxx_read_one_byte(uint8_t addr, uint8_t *ptr)
- @! w3 F4 {( c - 2{
1 c' m& ?' g! s8 G' d# } - 3 return sw_i2c_transfer(M24CXX_DEVICE_ADDR, &addr, 1, ptr, 1);
0 M% S7 f1 b1 x - 4}
复制代码
6 D- v% N" O& i7 V; X# e7 q; @' R- }9 |: T7 _& w6 ^- i
3 连接硬件进行测试将EEPROM模块与开发的I2C引脚连接好: ; E# {/ \- q/ `. u" V3 Z
, o. d% \& p+ W2 G+ n
( O+ e3 z3 ]$ u2 J1 J
先执行程序进行写入: - 1int main(void)
. s3 n+ a/ P3 I( [ - 2{
6 Z1 V5 _2 m' p' W* E. ? - 3 sys_clock_setup();
% `+ X1 P5 v J4 H# Q - 4. T7 D7 N. {+ _! V2 o2 M9 c
- 5 log("init sw i2c.\r\n");' |+ W8 ]7 s- C; O3 a
- 6* v/ z2 }7 K8 m& ?4 m8 x
- 7 sw_i2c_init();( o9 S4 ~- l; M5 Z* v
- 8" h! V( ?) O4 r6 y$ M! X; ?# c6 c
- 9 log("eeprom read testing.\r\n");
2 S6 b4 u! u- D4 B2 N; | - 101 i; i1 n3 {/ Y. z% B
- 11 uint8_t addr = 0x01;, M; @% n4 W3 q' W+ X7 Z' J: g
- 12 uint8_t read_data=0;
. U7 \" B4 C9 A7 m+ b; X - 13 uint8_t write_data = 0x88;+ ?" r% O0 p' Q5 e( W. P5 F
- 148 ?9 {5 Y# e" C+ T5 s
- 15 #if 00 W: `* R0 ~- n7 U: _8 D1 W
- 16 m24cxx_read_one_byte(addr,&read_data);
, O3 M: D- @# f! ^ - 17* k: a; Q4 }! q' A2 P' K1 W
- 18 if(read_data == write_data){
' { r M$ _( j7 D - 19 log("eeprom write ok\r\n");
* q% \( q. R. c1 n% q$ c: z+ C - 20 }else{3 l$ t5 g- _9 h8 B; t4 r1 b
- 21 log("ERR:EEPROM write failed.\r\n");' ~ B# L0 y3 j) c
- 22 }
& o7 _" c2 {% h7 C* S6 a4 ? l - 23" x" }: z9 A ~! M8 y
- 24 #endif& B l# Q; A* [. n4 r
- 25( w( Z! l0 V! a% l; V3 O' h4 ^8 S
- 26 log("eeprom write.\r\n");
- u) |" s3 E) L. q+ m! k - 277 A! H! D$ T+ Q1 b
- 28 m24cxx_write_one_byte(addr, write_data);6 }! d, v; P; P s% o+ _
- 29
' V" }( f" E$ b0 j( n - 30 delay_ms(5);//wait write done
4 ?5 `- E6 q. q - 31
* p o9 n/ I0 b0 ?4 b - 32 while(1){/*do nothing*/}///!!!not go here.0 h& {. R+ _5 N2 E, I/ o. Q) Y
- 33 return 0;8 A1 D2 Q% N+ s, m, p# B/ ^
- 34}
复制代码
( _, `/ V1 E7 X然后将读取部分的程序注释打开: - 1 #if 1" ?% {) k: `( |7 O: R
- 2 m24cxx_read_one_byte(addr,&read_data);
5 I1 k# V% ?" n. d - 3; g6 S: m6 } ?. d7 |
- 4 if(read_data == write_data){+ `! B6 ?% T. X) u) P- v
- 5 log("eeprom write ok\r\n");
$ C" f, |- V5 s0 B# S - 6 }else{
* V; h( ^; G/ O$ }+ b' T - 7 log("ERR:EEPROM write failed.\r\n");$ x4 v# {/ U* P% j9 W
- 8 }) k% Y! j5 ^: P& e9 B$ i
- 9
0 ?0 I* s8 k9 q% ?8 U3 q - 10 #endif
复制代码将开发板断电后重新上电可以看到测试正确:
" Y( ^$ F) Z0 ~6 F4 `% J, L" q" |- c" |" w8 p
7 B. p" x* p/ x, _注:写入数据根据M24C02的数据手册,其 Write time 为5ms,因此写入后要进行等待其写入完成; , j; \+ m: n6 G- g
2 q9 {/ ]. i; D1 D8 v$ {/ a |