当前位置:首页 >> 信息与通信 >>

93c66与spi驱动程序


SPI 总线在单片机系统中的实现 2007-04-28 10:56 来源:mcuzb

//-----------------------函数声明,变量定义-----------------------------------------#include <reg51.h> #include <intrins.h> sbit SCK=P

1^0; // 将 p1.0 口模拟时钟输出 sbit MOSI=P1^1; // 将 p1.1 口模拟主机输出 sbit MISO=P1^2; // 将 p1.2 口模拟主机输入 sbit SS1=P1^3; // 将 p1.3 口模拟片选 #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};

//----------------------------------------------------------------------------------// 函数名称: SPISendByte // 入口参数: ch // 函数功能: 发送一个字节 //----------------------------------------------------------------------------------void SPISendByte(unsigned char ch) { unsigned char idata n=8; // 向 SDA 上发送一位数据字节,共八位 SCK = 1 ; //时钟置高 SS1 = 0 ; //选择从机 while(n--) { delayNOP(); SCK = 0 ; if((ch&0x80) == 0x80) { MOSI = 1; } else { MOSI = 0; } // 传送位 1 //时钟置低 // 若要发送的数据最高位为 1 则发送位 1

// 否则传送位 0

delayNOP(); ch = ch<<1; // 数据左移一位 SCK = 1 ;

//时钟置高

} } //----------------------------------------------------------------------------------// 函数名称: SPIreceiveByte

// 返回接收的数据 // 函数功能: 接收一字节子程序 //----------------------------------------------------------------------------------unsigned char SPIreceiveByte() { unsigned char idata n=8; // 从 MISO 线上读取一上数据字节,共八位 unsigned char tdata; SCK = 1; //时钟为高 SS1 = 0; //选择从机 while(n--) { delayNOP(); SCK = 0; //时钟为低 delayNOP(); tdata = tdata<<1; // 左移一位,或_crol_(temp,1) if(MISO == 1) tdata = tdata|0x01; // 若接收到的位为 1,则数据的最后一位置 1 else tdata = tdata&0xfe; // 否则数据的最后一位置 0 SCK=1; } return(tdata); } //----------------------------------------------------------------------------------// 函数名称: SPIsend_receiveByte // 入口参数: ch // 返回接收的数据 // 函数功能:串行输入/输出子程序 //----------------------------------------------------------------------------------unsigned char SPIsend_receiveByte(unsigned char ch) { unsigned char idata n=8; // 从 MISO 线上读取一上数据字节,共八位 unsigned char tdata; SCK = 1; //时钟为高 SS1 = 0; //选择从机 while(n--) { delayNOP(); SCK = 0; //时钟为低 delayNOP(); { tdata = tdata<<1; // 左移一位,或_crol_(temp,1) if(MISO == 1) tdata = tdata|0x01; // 若接收到的位为 1,则数据的最后一位置 1

else tdata = tdata&0xfe; // 否则数据的最后一位置 0 } { if((ch&0x80) == 0x80) // 若要发送的数据最高位为 1 则发送位 1 { MOSI = 1; // 传送位 1 } else { MOSI = 0; // 否则传送位 0 } ch = ch<<1; // 数据左移一位 } SCK=1; } return(tdata);

93C46/93c06/93c56/93c66/93c86 的驱动程序(C51)
时间:2007-04-03 来源: 作者: 点击:1140 字体大小:【大 中 小】

/*———————————————————— 〖说明〗SPI 总线驱动程序 包括的普通封装标准模式,特殊封装标准模式 默认 11.0592Mhz 的晶振。 〖文件〗93CXX.C ﹫2003/5/12 —————————————————————*/ /*通用 93c06-93c86 系列使用说明 93c06=93c4693c56=93c6693c76=93c86 dipx 可以自行定义*/ #include "reg51.h" #include "intrins.h" /*----------------------------------------------------SPI 93cXX 系列时序函数调用(普通封装) 调用方式:自行定义﹫2001/05/12 函数说明:私有函数,封装各接口定义 -----------------------------------------------------*/ #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 位函数调用﹫2001/05/12 函数说明:私有函数,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 系列时序函数调用(特殊封装) 调用方式:自行定义﹫2001/05/12 函数说明:私有函数,特殊封装各接口定义 -----------------------------------------------------*/ #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 位函数调用﹫2001/05/12 函数说明:私有函数,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) ﹫2001/05/12 函数说明:私有函数,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) ﹫2001/05/12 函数说明:私有函数,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) ﹫2001/05/12 函数说明:私有函数,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) ﹫2001/05/12 函数说明:私有函数,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() ﹫2001/05/12 函数说明:私有函数,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); }


相关文章:
第十二章 串行总线应用
外围设置 FLASHRAM、网络控制器、LCD 显示驱动器、A/D 转换器和 MCU 等。SPI...2、SPI 总线的组成 三、SPI 芯片举例 93C66A/B,为 4K 位(A 为 512*8,...
93C46-86
*通用 93c06-93c86 系列使用说明 93c06=93c4693c56=93c6693c76=93c86 dipx...SPI 专用 93c46 普通封装驱动程序 ---*/ void high46(void) { di_93=1;...
MSP430F1XX KFB使用例程_信息与通信_工程科技_专业资料
(带锂电池座电池); 3、 93c66,SPI 接口 EEPROM; 4、 24Cxx,IIC 接口 EEPROM; 【人机界面】 5、 4 个通用按键、1 个复位按键; 6、 1602 液晶接口; ...
更多相关标签:
oled spi驱动程序 | ssd1306的spi驱动程序 | spi驱动程序 | si4438 spi驱动程序 | cc2530 spi驱动程序 | 单片机spi驱动程序 | ssd1309的spi驱动程序 | xpt2046 spi2驱动程序 |