C51 Flash 读写操作

C51 Flash 读写操作

###问题:下位机返回的数据,不是传感器的数据,有没有连接传感器,返回的数值也都一样。刚开始认为是标定的问题,把标定的函数搞明白,知道怎么去标定数据。但是标定完成后,数据还是不正确。

###思路:检查一下读取的Flash的驱动是不是有问题。写一个简单的函数,通过调用原来的读写函数,对flash里面的数值进行操作,每次下位机开断电,都会通过串口发送flash内部的数值,并每次把flash里的数据加一,然后再放到flash。简单的验证一下可以往flash内部进行数据的读写。

结果:每次返回的数值 不会发生变化。

最后可以试一试外部的存储芯片模块。。。。24C08

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

unsigned char xdata hc[3]={0,0,0};


//-----------------存储标定的k、b值--------------
void Save_flash(void)
{
uint8 i,j;
EA=0; //禁止中断
FLSCL=0x89; //FLASH 写/擦除定时(Fosc=18.432MHz) 允许FLASH写
PSCTL=0x07; //临时FLASH 允许FLASH 写/擦除
FLASH_ADDR[0]=0; //向待擦除扇区内的任何一个地址写入一个数据字节?擦除 临时FLASH
for(i=0;i<2;i++) //写入数据FLASH
{
PSCTL=0x00; //程序数据FLASH 禁止FLASH 写/擦除
j=hc[i]; //读FLASH存储器 与PSWE无关
PSCTL=0x05; //临时FLASH 禁止擦除 允许写
FLASH_ADDR[i]=j;
}
FLSCL=0x4f; //禁止FLASH 写/擦除
PSCTL=0x00; //程序数据FLASH 禁止FLASH 写/擦除
EA=1;
}
//-------------从MCU中读取出标定的k、b值------------------------
void Read_flash(void)
{
uint8 i,j;
uint8 code *FLASH_READ; //code定义的数据在flash中
FLASH_READ=0x0000;
for(i=0;i<2;i++)
{
PSCTL=0x04; //选择数据FLASH扇区 禁止FLASH 写/擦除
j=FLASH_READ[i]; //读取数据flash 0x0000区
PSCTL=0x00; //选择程序Flash 禁止写/擦除
hc[i]=j; //读程序flash
}
}


void main()
{

WDTCN = 0xde; // Disable watchdog timer 关闭看门狗
WDTCN = 0xad;
SYSCLK_Init();
PORT_Init();
ADC0_Init();
UART0_Init();

Read_All();
Para[0]++;
Save_Para();


P2 = 0x00;
EA = 1; // Enable global interrupts

Send_Buf0[0] = Para[0]; //发送帧头
Send_Buf0[1] = 0x00;
Send_Max = 2;
Send_p = 0;
SCON0 &= 0xef; //REN0 = 0 禁止开始接收
SBUF0 = 0x41; //启动回答数据事件

while(1)
{
WDTCN = 0xa5; //使能并复位看门狗定时器
}
}

原始对flash保存的代码,这里的Para变量是这么define的 uint8 xdata Para[112];