» 您尚未 登录   注册 | 搜索 | 社区服务 | 帮助 | 无图版 | 左右分栏


AVR与虚拟仪器论坛 AVRVi.com -> AVR单片机论坛(主坛) -> 一个高效的模拟SPI的读写函数。
 XML   RSS 2.0   WAP 

AVRVI的淘宝店 AVR单片机学习套餐 EasyAVR M128开发板 SK 国内最专业AVR开发工具商城

--> 本页主题: 一个高效的模拟SPI的读写函数。 加为IE收藏 | 收藏主题 | 上一主题 | 下一主题
admin

终身成就奖 金点子奖 原创先锋奖 技术群用户
头衔:先行者先行者

级别: 管理员
精华: 72
发帖: 3831
威望: 3906 点
金钱: 85105 VI
贡献值: 60 点
技术积分: 67 点
在线时间:2168(小时)
注册时间:1970-01-01
最后登录:2008-08-11
查看作者资料 发送短消息 推荐此帖 引用回复这个帖子

0 一个高效的模拟SPI的读写函数。

unsigned char RW_SPI(unsigned char val){
unsigned char BitCounter;
for (BitCounter=8;BitCounter!=0;BitCounter--){
CLK=0;
//write
DI=0;
if(val&0x80)                    
  DI=1;
val<<=1;
CLK=1;
//read
if(DO)
  val =1;                          

}
CLK=0;
return val;
}

此函数把SPI的读写功能集成在一块,传递的val既是向SPI写的数据,也是从SPI读取的数据,只需要在执行读或写之前把MCU的I/O脚设置成相应的输出或输入即可。(因为在大部分应用中,是把SPI的DI和DO相连并用MCU的一个IO口来读写)。

调用示例:

#define NULL 0

SETIO=OUTPUT;
CS=0;
RW_SPI(0xab);
CS=1;

//向SPI写0xab数据。



CS=0;
SETIO=INPUT;

Byte=RW_SPI(NULL);             //这里传递的NULL是没有任何意义的,可以是任何数据,只是为了保证函数的格式.
CS=1;
//读取SPI数据。


此函数对于许多低档片子来模拟SPI非常有用,代码量小,功能齐全。稍微修改,可以模拟SPI的其它模式。

2008年网站第一个开源项目 Ethernet IO Kit,单片机上网,网络开发板,网络控制

AVRVi 与您共同发展! 赠人玫瑰,手留余香。
一份好的资料,放在机器中会成为垃圾文件;
如果共享出来,就能有成千上万的朋友受益;
每人贡献一点,中国的电子技术将迅速提高。
[楼 主] | Posted: 07-24 23:07 顶端
zzh



金点子奖 优秀斑竹奖

级别: 论坛版主
精华: 0
发帖: 270
威望: 471 点
金钱: 3001 VI
贡献值: 255 点
技术积分: 0 点
在线时间:202(小时)
注册时间:2007-08-02
最后登录:2008-08-18
查看作者资料 发送短消息 推荐此帖 引用回复这个帖子



很典型的代码例;
2008年网站第一个开源项目 Ethernet IO Kit,单片机上网,网络开发板,网络控制

zzh
[1 楼] | Posted: 07-25 07:18 顶端

AVR与虚拟仪器论坛 AVRVi.com -> AVR单片机论坛(主坛)