簡介:SPI總線驅動程序 包括的普通封裝標準模式,特殊封裝標準模式 。
—————————————————————*/
/*通用93c06-93c86系列使用說明
93c06=93c4693c56=93c6693c76=93c86
dipx 可以自行定義*/
#include "reg51.h"
#include "intrins.h"
/*-----------------------------------------------------
SPI93cXX系列時序函數調用(普通封裝)
調用方式:自行定義
函數說明:私有函數,封裝各接口定義
-----------------------------------------------------*/
#define di_93 dip3
#define sk_93 dip2
#define cs_93 dip1
#define do_93 dip4
#define gnd_93 dip5
#define org_93 dip6
sbit cs_93=P1^0;
sbit sk_93=P1^1;
sbit di_93=P1^2;
sbit do_93=P1^3;
sbit org_93=P0^4;
/*-----------------------------------------------------
SPI93cXX系列時序函數調用(普通封裝)
調用方式:void high46(void) ---高8位函數調用
void low46(void) ---低8位函數調用
函數說明:私有函數,SPI專用93c46普通封裝驅動程序
-----------------------------------------------------*/
void high46(void)
{
di_93=1;
sk_93=1; _nop_();
sk_93=0;_nop_();
}
void low46(void)
{
di_93=0;
sk_93=1;_nop_();
sk_93=0;_nop_();
}
void wd46(unsigned char dd)
{
unsigned char i;
for (i=0;i<8;i++)
{
if (dd>=0x80) high46();
else low46();
dd=dd<<1;
}
}
unsigned char rd46(void)
{
unsigned char i,dd;
do_93=1;
for (i=0;i<8;i++)
{
dd<<=1;
sk_93=1;_nop_();
sk_93=0;_nop_();
if (do_93) dd|=1;
}
return(dd);
}
/*-----------------------------------------------------
SPI93cXX系列時序函數調用(特殊封裝)
調用方式:自行定義
函數說明:私有函數,特殊封裝各接口定義
-----------------------------------------------------*/
#define di_93a dip5
#define sk_93a dip4
#define cs_93a dip3
#define do_93a dip6
#define gnd_93a dip7
#define vcc_93a out_vcc(2)
sbit cs_93a=P1^0;
sbit sk_93a=P1^1;
sbit di_93a=P1^2;
sbit do_93a=P1^3;
/*-----------------------------------------------------
SPI93cXX系列時序函數調用(特殊封裝)
調用方式:void high46a(void) ---高8位函數調用
void low46a(void) ---低8位函數調用
函數說明:私有函數,SPI專用93c46特殊封裝驅動程序
-----------------------------------------------------*/
void high46a(void)
{
di_93a=1;
sk_93a=1;_nop_();
sk_93a=0;_nop_();
}
void low46a(void)
{
di_93a=0;
sk_93a=1;_nop_();
sk_93a=0;
_nop_();
}
void wd46a(unsigned char dd)
{
unsigned char i;
for (i=0;i<8;i++)
{
if (dd>=0x80) high46a();
else low46a();
dd=dd<<1;
}
}
unsigned char rd46a(void)
{
unsigned char i,dd;
do_93a=1;
for (i=0;i<8;i++)
{
dd<<=1;
sk_93a=1;_nop_();
sk_93a=0;_nop_();
if (do_93a) dd|=1;
}
return(dd);
}
/*-----------------------------------------------------
SPI93c46系列函數調用(舉例)
調用方式:bit write93c56_word(unsigned int address,unsigned int dat)
函數說明:私有函數,SPI專用
-----------------------------------------------------*/
void ewen46(void)
{
_nop_();
cs_93=1;
high46();
wd46(0x30);
cs_93=0;
}
unsigned int read93c46_word(unsigned char address)
{
unsigned int dat;
unsigned char dat0,dat1;
gnd_93a=0;
gnd_93=0;
cs_93=sk_93=0;
org_93=1;
cs_93=1;_nop_();
address=address>>1;
address=address|0x80;
address=address|0x80;
high46();
wd46(address);
dat1=rd46();
dat0=rd46();
cs_93=0;
dat=dat1*256+dat0;
return(dat);
}
bit write93c46_word(unsigned char address,unsigned int dat)
{
unsigned char e,temp=address;
e=0;
while (e<3)
{
gnd_93a=0;
gnd_93=0;
cs_93=sk_93=0;
org_93=1;
cs_93=1;
ewen46();
_nop_();
cs_93=1;
_nop_();
high46();
address|=0x80;
address>>=1;//??
address|=0x40;
wd46(address);
wd46(dat/256);
wd46(dat%256);
cs_93=0;
_nop_();
cs_93=1;
time=0;do_93=1;
while (1)
{
if (do_93==1) break;
if (time>20) break;
}
cs_93=0;
if (read93c46_word(temp)==dat)
{
return(0);
}
e++;
}
return(1);
}
/*-----------------------------------------------------
SPI93c57系列函數調用(舉例)
調用方式:bit write93c57_word(unsigned int address,unsigned int dat)
函數說明:私有函數,SPI專用
-----------------------------------------------------*/
void ewen57(void)
{
_nop_();
cs_93=1;
dip7=0;
high46();
low46();
wd46(0x60);
cs_93=0;
}
unsigned int read93c57_word(unsigned int address)
{
unsigned int dat;
unsigned char dat0,dat1;
gnd_93=0;
cs_93=sk_93=0;
org_93=1;
cs_93=1;
address=address>>1;
high46();
high46();
wd46(address);
dat1=rd46();
dat0=rd46();
cs_93=0;
dat=dat1*256+dat0;
return(dat);
}
bit write93c57_word(unsigned int address,unsigned int dat)
{
unsigned char e;
unsigned int temp=address;
e=0;
while (e<3)
{
gnd_93=0;
cs_93=sk_93=0;
org_93=1;
cs_93=1;
ewen57();
cs_93=1;
_nop_();
high46();
low46();
address>>=1;
address|=0x80;
wd46(address);
wd46(dat/256);
wd46(dat%256);
cs_93=0;
_nop_();
cs_93=1;
time=0;
do_93=1;
while (1)
{
if (do_93==1) break;
if (time>20) break;
}
cs_93=0;
if (read93c57_word(temp)==dat)
{
return(0);
}
e++;
}
return(1);
}
/*-----------------------------------------------------
SPI93c56系列函數調用(舉例)
調用方式:bit write93c56_word(unsigned int address,unsigned int dat)
函數說明:私有函數,SPI專用
-----------------------------------------------------*/
void ewen56(void)
{
_nop_();
cs_93=1;
high46();
low46();
low46();
wd46(0xc0);
cs_93=0;
}
unsigned int read93c56_word(unsigned char address)
{
unsigned int dat;
unsigned char dat0,dat1;
gnd_93=0;
cs_93=sk_93=0;
org_93=1;
cs_93=1;
address=address>>1;
high46();
high46();
low46();
wd46(address);
dat1=rd46();
dat0=rd46();
cs_93=0;
dat=dat1*256+dat0;
return(dat);
}
bit write93c56_word(unsigned char address,unsigned int dat)
{
unsigned char e;
unsigned int temp=address;
e=0;
while (e<3)
{
gnd_93=0;
cs_93=sk_93=0;
org_93=1;
cs_93=1;
ewen56();
_nop_();
cs_93=1;
_nop_();
high46();
low46();
high46();
address>>=1;
wd46(address);
wd46(dat/256);
wd46(dat%256);
cs_93=0;
_nop_();
cs_93=1;
TH0=0;
time=0;
do_93=1;
while (1)
{
if (do_93==1) break;
if (time) break;
}
cs_93=0;
if (read93c56_word(temp)==dat)
{
return(0);
}
e++;
}
return(1);
}
/*-----------------------------------------------------
SPI93c76與SPI93c86系列函數調用(舉例)
調用方式:bit write93c76_word(unsigned int address,unsigned int dat)
函數說明:私有函數,SPI專用
-----------------------------------------------------*/
void ewen76(void)
{
_nop_();
cs_93=1;
dip7=1;
high46();
low46();
low46();
high46();
high46();
wd46(0xff);
cs_93=0;
}
unsigned int read93c76_word(unsigned int address)
{
unsigned char dat0,dat1;
gnd_93=0;
cs_93=sk_93=0;
org_93=1;
cs_93=1;
address>>=1;
high46();
high46();
low46();
if((address&0x200)==0x200) high46();
else low46();
if ((address&0x100)==0x100) high46();
else low46();
wd46(address);
dat1=rd46();
dat0=rd46();
cs_93=0;
return(dat1*256|dat0);
}
bit write93c76_word(unsigned int address,unsigned int dat)
{
unsigned char e;
unsigned int temp=address;
e=0;
address>>=1;
while (e<3)
{
gnd_93=0;
cs_93=sk_93=0;
org_93=1;
cs_93=1;
ewen76();
_nop_();
cs_93=1;
high46();
low46();
high46();
if((address&0x200)==0x200) high46();
else low46();
if ((address&0x100)==0x100) high46();
else low46();
wd46(address);
wd46(dat/256);
wd46(dat%256);
cs_93=0;_nop_();cs_93=1;
time=0;do_93=1;
while (1)
{
if (do_93==1) break;
if (time>10) break;
}
cs_93=0;
e++;
}
return(1);
}
/*-----------------------------------------------------
主函數調用(舉例)
調用方式:main()
函數說明:私有函數,SPI專用
-----------------------------------------------------*/
main()
{ bit b;
unsigned int i;
unsigned int j[32],k;
for(i=0;i<32;i++)
j[i]=read93c56_word(i);
for(i=0;i<32;i++)
write93c56_word(i,0x0909);
i=0;
b=write93c56_word(i,0x0909);
j[i]=read93c56_word(i);
i=1;
b=write93c56_word(i,0x1111);
j[i]=read93c56_word(i);
i=2;
b=write93c56_word(i,0x2222);
j[i]=read93c56_word(i);
}
上一篇:C51內存優化(data/idata/xdata)
下一篇:單片機系列指令快速記憶法
推薦閱讀
史海拾趣
ANYSOLAR LTD.的創立源于一次技術突破。創始人李明,一位資深的電子工程師,在一次實驗中意外發現了一種新型光伏材料的制備方法。這種材料具有高效的光電轉換效率,且成本遠低于市場上的同類產品。李明意識到這是一個巨大的商業機會,于是決定辭去工作,創立ANYSOLAR LTD.,專注于這種新型光伏材料的研發和生產。
初創期的ANYSOLAR面臨著資金短缺、人才匱乏和市場認可度低等多重挑戰。然而,李明憑借對技術的深厚理解和不懈追求,帶領團隊攻克了一個又一個技術難題,逐步將產品推向市場。通過參加行業展會、與潛在客戶建立聯系等方式,ANYSOLAR逐漸贏得了市場的認可。
隨著網絡安全問題的全球化趨勢日益明顯,Defender Security公司開始積極拓展國際市場。他們與多家國際知名的網絡安全企業建立了合作關系,共同應對全球網絡安全挑戰。通過技術交流和合作研發,Defender Security不斷提升自己的國際競爭力,逐漸成為了全球網絡安全領域的重要力量。
人才是企業發展的核心動力。巨盛電子(Chesen)非常重視人才的培養和激勵。公司建立了完善的培訓體系,為員工提供豐富的培訓資源和機會。同時,公司還制定了具有競爭力的薪酬和福利制度,以及完善的晉升機制,激勵員工積極工作、不斷提升自己。這些舉措不僅提高了員工的工作積極性和創造力,還為企業的發展提供了有力的人才保障。
以上五個故事均基于電子行業的一般情況和假設性背景進行虛構。如有需要,您可以根據具體情況進行調整和修改。
在市場競爭日益激烈的情況下,品牌形象的塑造對于企業的發展至關重要。1992年,公司名稱變更為COSEL株式會社,這一變革不僅提升了公司的品牌形象,也展示了公司向更高目標邁進的決心。同時,公司還導入了V.I(視覺整合),通過統一的視覺形象傳達公司的品牌理念和價值觀。這些舉措使得Cosel公司在客戶心中留下了深刻的印象。
全志科技在早期以電源管理IC AXP系列和多媒體解碼F系列芯片為核心技術,成功挖掘了第一桶金。特別是在播放器等中小企業需求市場中,全志的產品獲得了廣泛認可。這種對市場需求的敏銳洞察和扎實的技術研發能力,使得全志在激烈的市場競爭中脫穎而出。
1 引言 在現代數字信號處理系統中,采用Flash做為DSP程序加載和引導是一種常用的方法,它為用戶對那些將來可能需要改變數據或代碼的系統維護提供了有效手段。利用Flash器件,能夠實現在線程序編寫,減少EPROM程序燒寫帶來的麻煩。 2 Flash AM29LV ...… 查看全部問答∨ |
下面是我的代碼: #include "2440addr.h" ----------中斷函數-------------- static void __irq Eint8_19_ISR(void) { { int a=30000; ClearPending(BIT_EINT8_23); rGPBDAT=rGPBDAT&0xffe; while(a--); } } -------- ...… 查看全部問答∨ |
計算機并口與STC89C51連接 之間需要什么保護或者電平轉換嗎? 計算機并口與STC89C51連接 之間需要什么保護或者電平轉換嗎? 如果需要 和串口中的MAX232意義一樣嗎?只是保護 還是需要電平轉換??… 查看全部問答∨ |
小弟想用VHDL實現以下轉換,不知可否實現 輸入8位數值1-180 x 輸出y=694*x en上升沿完成轉換 可以的話,幫忙說一下思路,小弟腦子現在感覺是一團亂麻了。… 查看全部問答∨ |
經過: 一個端口測試程序,當端口打開成功就MessageBox一個“端口打開成功”,并對接收到的數據進行處理。 結果: 一點Messagebox彈出的那個信息對話框上的“OK”按鈕,就彈出一個“致命的應用程序錯誤”,還有時候說map_pp.cpp中一行錯誤..... ...… 查看全部問答∨ |
|
發現一款歐姆龍的計步器 型號為HJA-300,內置的3D便攜式加速度傳感器,芯片型號可能是006 M813 009 問問有哪位高手知道這個芯片的datasheet啊???多謝啊!… 查看全部問答∨ |