?? x5045.c
字號:
#include "public.h"
/*
//寫使能子程序
void wren_cmd(void)
{
uchar aa;
SCK=0; // Bring SCK low
CS=0; // Bring /CS low
aa=WREN_INST;
inbyte(aa); // Send WREN instruction
SCK=0; // Bring SCK low
CS=1; // Bring /CS high
}
//寫使能復位子程序
void wrdi_cmd(void)
{
uchar aa;
SCK=0; // Bring SCK low
CS=0; // Bring /CS low
aa=WRDI_INST;
inbyte(aa); // Send WRDI instruction
SCK=0; // Bring SCK low
CS=1; // Bring /CS high
}
//寫狀態寄存器子程序
void wrsr_cmd(void)
{
uchar aa;
SCK=0; // Bring SCK low
CS=0; // Bring /CS low
aa=WRSR_INST;
inbyte(aa); // Send WRSR instruction
aa=STATUS_REG;
inbyte(aa); // Send status register
SCK=0; // Bring SCK low
CS=1; // Bring /CS high
wip_poll(); // Poll for completion of write cycle
}
//讀狀態寄存器,讀出的數據放入到aa中
uchar rdsr_cmd (void)
{
uchar aa;
SCK=0;
CS=0;
aa=RDSR_INST;
inbyte(aa);
aa=outbyte();
SCK=0;
CS=1;
return aa;
}
//字節寫入,aa為寫入的數據,dd為寫入的地址,對于25045而言為000-1FF
void byte_write(aa,dd)
uchar aa;
uint dd;
{
SCK=0;
CS=0;
inbyte((((uchar)(dd-0XFF))<<3)|WRITE_INST);// Send WRITE instruction including MSB of address
//將高位地址左移3位與寫入先導字相或,得到正確的先導字寫入5045
inbyte((uchar)(dd));
//輸出低位地址到5045
inbyte(aa);
//寫入數據到5045的對應單元
SCK=0;
CS=1;
wip_poll();
//檢測是否寫完
}
//字節讀出,其中dd為讀出的地址,返回的值為讀出的數據
uchar byte_read(dd)
uint dd;
{
uchar cc;
SCK=0;
CS=0;
inbyte((((uchar)(dd-0XFF))<<3)|READ_INST);// Send READ_INST instruction including MSB of address
//將高位地址左移3位與讀出先導字相或,得到正確的先導字寫入5045
inbyte((uchar)(dd));
//輸出低位地址到5045
cc=outbyte();//得到讀出的數據
SCK=0;
CS=1;
return cc;
}
//頁面寫入,其中aa1,aa2,aa3,aa4為需要寫入的4個數據(最大也就只能一次寫入4個字,dd為寫入的首地址
void page_write(aa1,aa2,aa3,aa4,dd)
uchar aa1,aa2,aa3,aa4;
uint dd;
{
SCK=0;
CS=0;
inbyte((((uchar)(dd-0XFF))<<3)|WRITE_INST);// Send WRITE instruction including MSB of address
//將高位地址左移3位與寫入先導字相或,得到正確的先導字寫入5045
inbyte((uchar)(dd));
//寫入低位地址到5045
inbyte(aa1);
//寫入數據1到5045的對應單元
inbyte(aa2);
//寫入數據2到5045的對應單元
inbyte(aa3);
//寫入數據3到5045的對應單元
inbyte(aa4);
//寫入數據4到5045的對應單元
SCK=0;
CS=1;
wip_poll();
}
//連續讀出,由于函數的返回值只能為1個,對于連續讀出的數據只能使用指針作為函數的返回值才能做到返回一系列的數組
//sequ_read:
unsigned int *page_read(n,dd)
uchar n;//n是希望讀出的數據的個數,n<=11
unsigned int dd;//dd是讀出數據的首地址
{
uchar i;
uchar pp[10];
unsigned int *pt=pp;
SCK=0;
CS=0;
inbyte((((uchar)(dd-0XFF))<<3)|READ_INST);
for (i=0;i<n;i++)
{
pp[i]=outbyte();
}
return (pt);
}
//復位DOG
void rst_wdog (void)
{
//網上源程序有問題
CS=0;
CS=1;
}
//檢測寫入的過程是否結束
void wip_poll(void)
{
uchar aa;
uchar idata my_flag;
for (aa=1;aa>MAX_POLL;aa++)
{
my_flag=rdsr_cmd();
if ((my_flag&&0x01)==0) {aa=MAX_POLL;}//判斷是否WIP=0,即判斷是否寫入過程已經結束,若結束就跳出,否則繼續等待直到達到最大記數值
}
}
*/
//輸入一個數據到5045,此數據可能為地址,先導字,寫入的數據等
void inbyte(uchar aa)
{
uchar i; //LHM QUESTION:為什么只有7bits,哦,是8bits
for(i=0;i<=6;i++){
SCK=0;
SI=((aa>>(7-i))&0x01);
SCK=1;
}
SCK=0;
SI=aa&0x01;
SCK=1;
SI=0;
}
//得到一個數據,此數據可能為狀態寄存器數據,讀出的單元數據等
uchar outbyte(void)
{
uchar bb;
uchar i;
bb=0; //LHM QUESTION:為什么 SCK賦1后馬上賦0
for(i=0;i<=7;i++){
SCK=1;
SCK=0;
bb=((bb<<1)|SO);
}
return(bb);
}
//寫5045(包含寫寄存器,寫數據至存儲陣列)
void write5045(void)
{
uchar aa;
//設置寫使能
CS=0; //CS為低
SCK=0; //SCK為低
aa=WREN_INST;
inbyte(aa); // Send WREN instruction
SCK=0;
CS=1;
//寫狀態寄存器
CS=0;/*CS為低*/
SCK=0;
aa=WRSR_INST;
inbyte(aa);
aa=STATUS_REG;/*為0x30時,是不允許復位的.設置看門狗動作的超時周期為:200ms*/
inbyte(aa);
SCK=0;
CS=1;
//讀狀態寄存器,檢查WIP位,為0,則沒有寫操作;為1,則正在進行寫操作。//LHM UNDERSTAND:等到寫完再做下一步
do{
CS=0;
SCK=0;
aa=RDSR_INST;
inbyte(aa);
aa=outbyte();
SCK=0;
CS=1;
}while((aa&0x01)==1);
//設置寫使能
CS=0;//CS為低
SCK=0;//SCK為低
aa=WREN_INST;
inbyte(aa);
SCK=0;
CS=1;
//從以下的地址開始選輸入數據至存儲器陣列
CS=0;
SCK=0;
aa=WRITE_INST;
inbyte(aa);
aa=0x00;//放在5045的00H開始的位置
inbyte(aa);
inbyte(data5045.cF0);
inbyte(data5045.cF1);
inbyte(data5045.cF2);
inbyte(data5045.cF3);
inbyte(data5045.cF4);
SCK=0;
CS=1;
//讀狀態寄存器,檢查WIP位,為0,則沒有寫操作;為1,則正在進行寫操作。//LHM UNDERSTAND:等到寫完再做下一步
do{
CS=0;
SCK=0;
aa=RDSR_INST;
inbyte(aa);
aa=outbyte();
SCK=0;
CS=1;
}while((aa&0x01)==1);
}
//將數據從存儲陣列中讀出
void read5states(void)
{
uchar aa;
CS=0;
SCK=0;
aa=READ_INST; //LHM QUESTION: Read instruction 的位3選擇器件的高半部分,還是低半部分
inbyte(aa);
aa=0x00;
inbyte(aa);
data5045.cF0=outbyte();
data5045.cF1=outbyte();
data5045.cF2=outbyte();
data5045.cF3=outbyte();
data5045.cF4=outbyte();
SCK=0;
CS=1;
}
//LHM COMMENT:資料上說,為防止看門狗復位,在看門狗超時以前CS引腳應該進行由高到低的觸發。以下更保險一些。
void watchdog(void)
{
P3_5=!P3_5;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -