一乐电子

一乐电子百科

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
查看: 2998|回复: 3
收起左侧

C8051F310在系统编程Flash

[复制链接]
发表于 2013-10-12 14:15 | 显示全部楼层 |阅读模式
C8051F310在系统编程Flash
C8051F310在系统编程Flash
# a5 a8 y5 Y0 K6 K$ F- S

" I/ D9 c$ N) v单片机,有些数据设置后需要掉电不丢失,一般首先想到的是使用eeprom,比如AVR中的Atmega系列有内部eeprom,也可以外接AT24C01之类的eeprom。这里介绍另外一种参数保存方法,Silicon Laboratories的C8051F系列,其内部程序存储区Flash可以在系统编程,功能类似于eeprom,掉电不丢失。5 y! T6 {; Y5 `. w( R
C8051F310内部有16K的在系统可编程Flash,地址从0x0000到0x3dff,以512字节作为一个扇区,这意味着每次擦除的时候,是对整个扇区擦除(置1),它不是面向单字节操作的,这点与eeprom不同。
+ x" s2 n5 I; v* d: x读Flash:3 v3 \8 C4 c, l# A: I& d; Y
unsigned char code TestStrings[] = “Hello,eeworld!”;
. b: G5 E2 A. H使用code定义的常量,Keil将其保存到Flash里,我们读Flash里的内容,同样地,其地址指向的数据类型应该是unsigned char code,所以,我们读Flash的某地址的内容,可以通过以下方式来读:  ^1 @7 @  j' l6 e; o8 q4 |
DataGet = (*((unsigned char code*)DataAddr));! D! A: \( h  i2 c( `' m9 ^
读取DataAddr地址里的Flash常量到DataGet,其实,这个常量并非就一定是常量,它是可以修改的,即写Flash,待会介绍如何写Flash,说是Flash数据可能准确点。
, u% k# D6 J5 W先说说上面右边的定义吧,
5 {1 w+ V' i* d$ [, \DataAddr是一个地址,最后面那个*说明它是一个指针,unsigned char code说明它指向的数据类型,第一个*是指向,相当于读出该地址的数据,最后赋值给DataGet。# i7 \6 j4 Z2 y; |# a5 X/ e7 B
汇编中读取用MOVC指令来读取Flash数据。
. V; P4 z# O# e$ x1 x0 [读取指定长度的Flash数据:
: C: G8 d6 y: j. v1 cvoid Flash_Read(unsigned int DataAddr,unsigned int DataLength,unsigned char *pData)" p0 E9 W  y% D
{& c- E" j2 B$ Q7 W& B+ \+ H
    bit SaveEA;! V# G  o  G' x
    SaveEA = EA;   
: d1 e& L- `) ]* @    EA = 0;            
% ?; u( m& Z+ ?- U  l+ V+ O, ~) y! P/ {    while(DataLength--)
% s+ t7 q- q- ?7 S/ a: ?5 h: @    {) [0 r2 [7 m% O2 G8 _
        (*(pData++)) = (*((unsigned char  code*)(DataAddr++)));3 g- t% [, j  f# \8 C2 T) m0 B: g
    }
' e; D- q/ a7 u% z    EA = SaveEA;% ~7 }/ @- l. A- U8 e
}$ S1 R% C+ N6 M" l2 ]' |9 L
擦除Flash:3 {1 Z( X& O6 s2 k+ P& z7 [
Flash的位一旦被写0了,必须通过擦除,才能让它回到1,直接1是不行的。所以,如果需要重新写数据到Flash某地址,须先擦除掉,擦除操作将会使所在的整个扇区的512字节全部变成0xff。写Flash数据时,其数据类型是unsigned char xdata,汇编使用MOVX指令,请注意,MOVX同样用XRAM写,所以,最后PSWE 位应被清‘0’,以使 MOVX 指令不再指向程序存储器。MOVX读指令总是指向 XRAM。- G4 Z8 t8 f6 Z- U% D1 P7 u1 I& B
擦除步骤:4 _) G4 ^( z' m5 d; j/ x1 ]
1.禁止中断(建议这样做)。1 w6 v* z+ c* A0 e
2.置‘1’程序存储器擦除允许位(PSCTL中的PSEE),以允许 FLASH 扇区擦除。
4 R( a) T; _! }' u3.置‘1’程序存储器写允许位(PSCTL中的PSWE),以允许 FLASH 写入。$ ]4 G2 r5 l- I+ g* J
4.向 FLKEY写第一个关键码:0xA5。' k* N9 l) C3 @* X. u
5.向 FLKEY写第二个关键码:0xF1。" P& ~" a! V- \) p6 r
6.用 MOVX 指令向待擦除页内的任何一个地址写入一个数据字节。

1 C, N/ ]& X3 [
. {% n: l2 \: o  H
% c$ [4 k; ~4 v/ c" _! x

$ O4 s: q- n' x1 Yvoid Flash_Eraser(unsigned int DataAddr)
( U( w( n! ~4 {" K{  //只擦除DataAddr所在扇区的数据,实际应当根据用的数据量来擦除需要的扇区。/ i6 R  x( ?. f: k% D5 t0 {
    bit SaveEA;
2 s. t7 ?, X/ W    SaveEA = EA;   - {/ N( m- F% U% B- @" T
    EA = 0;
; e- P4 x4 K6 |) v8 S" |    PSCTL = 0x03;//写允许、擦出允许
5 Q+ v/ o! l: E" z4 L! |9 s    FLKEY = 0xa5;//写关键字( r& d" {- _/ \: x
    FLKEY = 0xf1;0 i9 ?4 u7 E. v7 G! }
    //写入任意数据,flash将擦除该页512字节0 @$ m: z' x0 l5 h
    (*((unsigned char xdata*) DataAddr)) = 0xff;0 `0 m. A/ x$ B. Q9 v
    PSCTL = 0x00;//禁止写和擦除, x0 o2 Y7 J7 ?0 {! A% P
}$ s% c" s. F7 I9 Y; E& |$ R6 w
写Flash:. a# M+ V- E" l9 n
数据类型是unsigned char xdata。写Flash一般步骤:
) z, F# g7 j' O- x1. 禁止中断(建议这样做)。
1 ?  N3 B3 A* y' b2. 擦除包含目标地址的FLASH页(见上节的说明)。
) i; \! f$ E0 y3 h( p3. 置‘1’PSCTL 中的 PSWE 位。7 ^& O2 s) S& d% o2 j! Q
4. 清除 PSCTL 中的PSEE位。% Y8 g. X3 \6 Z/ `3 |! p
5. 向 FLKEY写第一个关键码:0xA5。) r; u4 X; ~& U1 {, Q
6. 向 FLKEY写第二个关键码:0xF1。% {  A: N4 W5 P/ V- A
7. 用 MOVX 指令向扇区内的目标地址写入一个数据字节。
- `) q2 q8 I+ y6 j0 D重复步骤 5-7,直到写完每个字节。在完成了对 FLASH 的数据写入后,PSWE 位应被清‘0’,以使 MOVX 指令不再指向程序存储器。
9 E0 D& R: o4 r% b3 t" l6 H( Z. Gvoid Flash_Write(unsigned int DataAddr,unsigned int DataLength,unsigned char *pData)3 E2 [3 f- ?, n3 Z7 _0 z5 l
{
5 H/ a& B& ^  M8 U9 ?# H    bit SaveEA;
' N. `% n1 C& ?/ h4 Z& `5 L    SaveEA = EA;   7 C" N/ H9 V3 s0 A5 t, ~! z$ m" [
    EA = 0;
& a! Z" k4 f/ d5 w- C    PSCTL = 0x01;//写允许- X: z: D! W4 i. i
    while(DataLength--)6 R+ m: q8 k; u, N* y
    {
8 ^5 R- S6 B3 g; i( q        FLKEY = 0xa5;//写关键字# K  Z, n, \5 |& p7 D% N) ]7 q& [2 L
        FLKEY = 0xf1;
; ]/ F3 B, W6 d2 Q        (*((unsigned char xdata*)(DataAddr++))) = (*(pData++));
, r7 {7 ?: S$ N. v4 b    }# ~0 Z" v' w4 n0 J" t
    PSCTL = 0x00;//禁止写和擦除: O! T, q' z- m% _1 Y: Z& w1 q
    EA = SaveEA;
; g5 t0 F* q$ c" A- i6 V1 ~# d}# q& w+ K0 ]6 Q5 w: t' d2 I
注意:
8 [, ^: y' s# P1 R1.Flash擦除是整块擦除,所以,写数据的时候,应先读出该扇区有用的数据,擦除后,重新写入Flash。否则全部置位0xff。  P( k3 m' ]9 @  A( c% r$ b& t" |3 q
2.Flash是512字节作为一个扇区的,写入大量数据的时候,要选好地址,要知道自己用了哪几个扇区,擦除的时候,用到的扇区都应该擦除。少量数据的话,尽量把数据都放在同一个扇区,方便改写,也节省时间。/ K: L8 ?7 i' ~" Z* a0 ^
3.一些参数:
8 }  c0 {5 G$ R! ]8 X
9 r$ U' D' [6 y6 X
 楼主| 发表于 2013-10-12 14:30 | 显示全部楼层
C8051F MCU应 用 笔 记& X, \- X: ^1 J' }

$ C% g+ [8 J2 nAN009 — 从应用程序写 FLASH ) p8 ]5 W6 N/ ^1 @0 r; U
( @" k) V; S4 l$ F
相关器件 " S6 C& e% r7 i, `
本应用笔记适用于下列器件:
: Q: t6 S3 G( A) L- {/ R( D+ h# Y& g. mC8051F000、C8051F001、C8051F002、C8051F005、C8051F006、C8051F007、C8051F010、
7 y" ?2 P& V! E# x  K: Y7 I1 M2 TC8051F011 和 C8051F012。 & U/ h2 @; ^0 B# {  g, H
引言 / n( F0 S( A$ T7 F
本应用笔记的目的是说明如何从应用程序写FLASH。在应用编程允许将FLASH用于非易失性* h- d8 @4 r/ Y, X$ q9 c2 b
信息的存储(例如配置参数),还可以允许采用JTAG接口之外的另一种接口(例如UART)进行在
9 D4 ^: T: Q6 W; D$ t系统引导装载。本笔记的最后给出了如何读和写FLASH的‘C’代码。 & ?+ _( E& t+ h" i% t2 N9 \
关键点
. p- d0 L, ]- I' Y  在应用编程允许将FLASH用于非易失性信息的存储,这一点与EEPROM类似。
$ o- `* X) v* X7 r5 Y7 R$ Q  FLASH写/擦除寿命在 – 40 ~ + 85℃的工业温度范围内保证在 10000 次以上。
# l% Y( S7 K2 n* U( S- M6 u  FLASH存储器用 MOVC指令读取(MOVC a, @A+DPTR)。 , v: _/ c! ?$ P# S0 h7 N
  FLASH存储器用 MOVX 指令写入(MOVX @A+DPTR, a)。
: w" D; z! f$ x( K* w5 N  FLASH页以 512 字节分界(0200h, 0400h, 依此类推)。 4 Z6 @* c) w. E  P
  FLASH写操作只能写入 0。因此在写一个 FLASH字节之前,包含该字节的页必须首先被擦除
/ L/ k( ~& y2 W3 S4 h# i(使该页中的所有位都为 1)。 # b8 t) [$ V. V' s* M
  在进行 FLASH写或擦除之前,必须根据当前的系统时钟设置 FLSCL 中的 FLASCL 位。
) `2 t) t2 K/ [, V  在进行 FLASH写之前,必须将 PSWE 置 1。
0 k2 ?$ A4 ]4 P+ n; x4 h  在进行 FLASH擦除之前,必须将 PSWE 和 PSEE 置 1。
" z5 K5 l, O4 L( w7 _7 q  FLASH页的擦除操作是将PSWE和PSEE置1并向该页512字节中的任一字节进行写操作。 : t! }% V2 f6 y( U  M( U, Z
  含有读锁定字节和写/擦除锁定字节的 FLASH页不能由用户软件擦除(但是,该页可以由用户
0 S1 y  }# Q' H" p- g! r软件写入)。该页只能通过 JTAG 接口擦除。
: w6 x1 `4 _7 I! w; t过程
: R5 Y- F" o4 w4 f0 TFLASH 是按一系列 512 字节的页组织的。另外还有一个 128 字节的页,该页位于 FLASH 的
: F& }/ F- A! D) F4 _! {顶部,起始地址为 0x8000。由于写一个 FLASH字节只能对各位写入 0,因此在写一个 FLASH字" F5 R8 P+ R7 L5 _2 w. X9 q
节之前,该字节必须被初始化为 0xFF。一个 FLASH擦除操作将一页内的所有字节初始化为 0xFF。
( R6 T2 c' b" H2 u/ [( D擦除一个 FLASH 页
) T; U( T% {! x4 q( u一个 FLASH 页可以通过下述过程擦除: / E4 d5 v" H  V6 W- [& h% I$ p+ v4 [
1.根据当前系统时钟频率值按 C8051F000 数据表的说明设置 FLSCL(当使用缺省的 2MHz
; u0 t# Z0 M/ I2 l内部振荡器时,FLSCL=0x86)。 1 U5 f/ i- N. a5 g0 `" [7 b

/ i+ e# j( v# o' _Silicon Laboratories Inc. 新华龙电子有限公司
5 ?/ `8 L* e: y1 p# O- b# X+ R4635 Boston Lane 深圳市福田区华强北路现代之窗大厦A座13F C室(518013) 3 @$ v  D6 e" A" L
Austin, TX 78735 电话:0755-83645240 83645242 83645244 83645251 7 h! o; ^+ v6 ]' r' f% g
Email: mcuinfo@silabs.com (版权所有) 电邮:shenzhen@xhl.com.cn
' e: Q5 a7 ~+ F' J9 ^- Y0 K# YInternet: www.silabs.com 网址:www.xhl.com.cn  
5 h1 m3 ~& G$ @& l2 g/ i& w2 _6 ^' F) H3 ~; ]2 k

& J  e  X) y1 @4 kAN009 — 从应用程序写 FLASH 8 }: a$ K3 F& I5 x3 Q: I7 K
8 j9 b- U) }2 {6 ?: w8 y
2. 通过向 PSCTL写入 03h 使 PSWE 和 PSEE 置 1。
: X' K9 a& _$ T8 a, g# e3. 向待擦除页内的任一字节写入任意值:
% w1 j# Y, ~+ d; R. Q. F( K% p ; 初始化 DPTR,使其指向待擦除页内的地址   x6 `  T; `* v9 k
mov DPTR, #address . k6 X0 {% x+ `' U; C0 f
; 启动擦除过程
6 ~. G$ r! J/ v6 L3 X, |& a movx @DPTR, a 2 i' k8 M  Q. J' m$ ]: Q9 l5 z
4.如果不再进行擦除操作,将 PSEE 设置为‘0’。
  H9 U' V+ D3 f, J  G; X) K擦除每个页需要 10到 20ms 的时间。注意:CPU内核在 FLASH擦除过程中停止工作,但外
; [) N; Y! a0 |1 `( J# F# X设(象 ADC、UART、SMBus 和定时器)仍然工作。在擦除过程中产生的任何中断都将被挂起,2 H- |# s; L' N# q
直到该过程结束。在写一个 FLASH字节期间 CPU的工作情况与此相同。
8 \! \' b' q4 E& k- k: P写一个 FLASH 字节 5 ?( v- j3 ~/ p3 D5 g. `+ }
下述过程用于写一个 FLASH字节:
* Q5 n- \" U3 p  A, _3 F7 d1. 根据当前系统时钟频率值按 C8051F000 数据表的说明设置 FLSCL(当使用缺省的 2MHz1 k) X2 P3 Q& c0 K; z/ o- q
内部振荡器时,FLSCL=0x86)。
" \# t8 ^! h5 m! V2. 通过向 PSCTL写入 01h 使 PSWE 置 1(PSEE 必须为‘0’)。 ; h' y4 {; u5 {% r
3. 写入字节数据。 % ]% L. A; w" M) }" o
; 初始化 DPTR,使其指向待写字节的地址 " [) G& e6 k/ `
mov DPTR, #address
( V5 D: A/ G+ ?5 S ; 将待写字节装入 acc
* r3 c3 @1 A( g mov a, #value 1 R" E4 w# f- f' w! q
; 启动写操作
( U0 j5 D# y0 P5 \3 |7 o: ~7 H7 C movx @DPTR, a 9 _* f" j: N7 J2 y9 x
4. 如果不再进行写操作,将 PSWE 设置为‘0’。 - r- T4 o/ _' X$ ?$ Q
每个 FLASH字节的写操作需要 20到 40μs 的时间。
( M* J/ |) B; D$ ?! X  l6 T& a) K更新 FLASH中的数据
0 `9 G) ]/ q9 k: [$ Q当保存一组配置信息时,经常需要在一组字节中单独改变某个字节的数值。单独更新某个字节
( f! i- i# q2 n; J3 V7 L- j1 m(或字节子集)的一般过程如下: ) ~" D% P$ @' Y% E* B5 |0 i
1. 将 FLASH页拷贝到一个临时存储区(RAM 或一个已被擦除的‘临时’FLASH页)。
3 g2 v7 K/ Q; s1 {( H0 r, L2. 擦除 FLASH页的数据。
0 i; @7 [& a7 G3. 将前面存储在临时存储区的内容复制到 FLASH页中。 2 t- p: ^1 S" ~8 N8 h+ g; x$ P# h2 g
用‘C’代码访问 FLASH
7 ?9 {/ x/ _5 Y* V' d6 B! E: p所附的示例代码说明了如何用‘C’程序擦除、写和读 FLASH 内容。由于 FLASH 读操作是
( _: W% |9 F/ K1 x! {% T用 MOVC 指令实现的,因此用于读操作的 FLASH 指针必须是 CODE 类型。由于 FLASH 写操作  D7 A! {* F) ^' p! R+ l6 d
是用 MOVX 指令实现的,所以用于写(或擦除)操作的 FLASH指针必须是 XDATA 类型。
9 u# B0 ]5 O" h. e  u# e- F# T! l7 l! V
2 AN009-1.0 JAN01
$ `8 ]* ^2 U' \+ J! ~8 i! \, r* O- t/ i+ a+ N- Y: O% N
# l8 b) c5 |) \  Q+ C; J- Y$ U. C

6 l" k/ i$ U  x) Z; _) `8 JAN009 — 从应用程序写 FLASH
2 A$ f) g4 l, }! S" d
! q- b: l7 L7 s6 F9 z软件示例 5 S; n5 M/ o% f* k* M5 h
//-----------------------------------------------------------------------------------------------------------------------
; F/ }3 m3 i. `) }2 A$ H, A9 U2 h// FLASH_1.c
# [0 `8 a% {3 H: |! q& r//-----------------------------------------------------------------------------------------------------------------------
( v) x5 b1 y: y0 j, ~//
  p5 A! |6 |5 w+ l7 _. t& X1 T// 作者:BW
# X( v# |8 v' A7 w5 F//
) {' q4 z8 N! X// 本示例程序给出了用‘C’程序擦除、写和读 FLASH存储器的例子。 7 h5 i; i1 A) p- K3 w3 U' W1 y
//
3 b# G+ K+ m( J  @0 X// 目标器件:C8051F000 或 C8051F010 / X6 C! a% u2 i
// 开发工具:KEIL C51 % l% Y# a3 H9 y. X, U* k6 `! J# K
// 7 C8 N7 O8 D; F3 s8 d
+ O& T/ [! y$ ^8 e5 F- I
//----------------------------------------------------------------------------- 9 Z% M$ k6 Z' U+ K# v% t1 Y1 t/ c
// 包含文件
; p" u  c3 U7 \) U9 I3 o//-----------------------------------------------------------------------------
0 i4 Y# b) d: R! P8 i$ o7 P, {8 u. u
#include <c8051f000.h> // SFR 声明
  @2 u1 V$ j" p2 b5 z5 r#include <stdio.h> 4 ?! d, ]9 H+ ?3 ]2 k- J+ [
0 q2 \! ?8 l" p
//-----------------------------------------------------------------------------
" L6 o  I+ R! ]/ O+ ^// Function PROTOTYPES   u; e$ e0 F; k
//-----------------------------------------------------------------------------
) k, M4 U# Y, |2 Q4 M: a' ~! ^# _9 h' |: e4 G
void main (void); 8 J+ x  u3 v4 I  P+ t; ]' B; ?# W/ I) J

# W# o. \5 b& Y# m" M# f//-----------------------------------------------------------------------------
, t. M1 z; e* y7 A// MAIN Routine 8 G1 n# u% b+ {
//----------------------------------------------------------------------------- ) n3 q3 ?: R: g! ~* r) `% z

/ M& j5 H% Q3 ?0 _8 C. c- d, @% pvoid main (void) { $ s5 ^) p7 T+ N/ C3 M& _  f' E

) P0 ^0 P0 s( ~2 N unsigned char test_string[ ] = "Howdy!"; // 将被拷贝到 FLASH中的字符串 ; `8 C3 N; \2 l
1 v, a& ~7 j# C4 n3 {, T
unsigned char xdata *pwrite; // 程序存储器空间的指针(FLASH),指向待写地址
0 P$ P/ \4 s- Z* Y" I, ]8 j unsigned char code *pread; // 程序存储器空间的指针(FLASH),指向待读地址 ) S% C0 K6 j' i3 N" e
unsigned char *pgen; // 一般指针
) n- o9 l, H$ t7 P char test; // 测试字符
9 r3 x8 O* d" P* R7 U4 M$ Y8 Y& [5 a3 L9 z7 B1 j0 C1 u; q
AN009-1.0 JAN01 3 # Q' G/ S& z% u9 m# X

: M/ v( m8 r  }& p% D  {$ a5 r, O) e

! z1 L7 ?: q0 b; h, G# v1 M: v: P& qAN009 — 从应用程序写 FLASH ) D( {: ^  `: T2 J
$ i/ O6 E& L+ C0 v( I
// 禁止看门狗定时器 , T" [% X, F" [; n8 ^
WDTCN = 0xde; ; n% ?9 I) P, R  Z7 D" |6 }# O
WDTCN = 0xad;
: t3 C, \: c8 E# F( k# \ // 擦除 128 字节的信息页(位于 0x8000)
* C. c$ I" o# i' X% R$ O FLSCL = 0x86; // 设置 FLASH标度寄存器(对 2MHz 系统时钟)
+ C& t$ {( Q% e% [ PSCTL = 0x03; // 将 PSWE 和 PSEE 置‘1’(MOVX 指令对应
* b4 G' R: [6 |: X // 的 FLASH页 & s# p7 a5 j5 W! C; o7 n3 s
pwrite = 0x8000; // 将指针指向待擦除页
( t# \' Z/ _+ z" Z& G *pwrite = 0; // 启动擦除过程
1 u  Z3 V$ T* n5 L2 |  M+ | PSCTL = 0x01; // 清除 PSEE,PSWE 仍然置 1
. q! ]4 L& r2 w6 F" ^8 U // MOVX 指令将写到对应的地址
# ^& i4 a% M; J: z' w
7 c) C) M' R4 [5 s // 现在我们要拷贝字符串 <test_string> 的内容到 FLASH页,从地址 0x8000 开始。
* L" g3 T* X, `9 M1 N& u
2 e8 `- M6 `, R) h% V; o- ^6 { pgen = test_string; // pgen 指向源字符串
' s+ o, _) |7 [  M# S! v  C: G do {
: E1 `, d7 ~/ U! u# z *pwrite++ = *pgen++; // 拷贝字节
! q1 R5 H$ G. V2 U } while (*pgen != '\0'); // 直到 NULL 结束符
$ M" H# a/ D4 h9 b* M
5 o% C, C& |! h; h* B *pwrite = NULL; // 用 NULL 结束目的字符串 8 u  D7 y& O* p/ y( c# y5 f
' g4 l+ E* c' S) J, e! a
PSCTL = 0; // 禁止 FLASH写
; x0 S7 |. O( l  w FLSCL = 0x8f; // 禁止 FLASH写
) Y5 l5 {( c: }, S* u3 F5 y! a. A! W4 ^8 b$ ^
// 现在我们读写入的字符串
" u3 t2 x% Q7 e' X3 k, Z
% Y2 M. ]6 @6 O pread = 0x8000; // 初始化 CODE 读指针为字符串起始地址 - P6 A' c" k( ~! a8 f* J9 V% u
1 ]6 o8 w) T5 U, S" Z9 `) s
test = 0x5a;
% a+ C: y$ A5 L& G; a do { 2 Q' s  y* U$ b: q/ b
test = *pread++; ' j: f9 d6 S4 b% g
} while (test != '\0');
$ F1 V. B1 h3 W; [3 h2 g8 Q( V, }
while (1) { // 原地循环
+ y' z6 }& K8 u6 _( d8 d% D }   J( V  M: w+ Z
} 5 [% ?* C' |* W/ P# @

  x' }6 }8 O. z: ^  r: ~2 N7 ^4 AN03 d% r, R1 Q; a$ ]: @
; d$ \  u0 Z8 k
发表于 2013-11-20 09:11 | 显示全部楼层
我烦的就是它的不能单字节操作,上位机进行数据写操作很恼火
 楼主| 发表于 2013-11-20 09:38 | 显示全部楼层
touren 发表于 2013-11-20 09:11: Z- Y3 E1 h; v# q
我烦的就是它的不能单字节操作,上位机进行数据写操作很恼火

, }8 l5 M. ?$ X) N# b它不是正直的EEPROM只能整个删,我也用得不爽。" q# G1 \1 e% E9 R# E7 n! p9 x% q

本版积分规则

QQ|一淘宝店|手机版|商店|电子DIY套件|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2024-6-15 18:21 , Processed in 0.050027 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表