7924|5

1170

帖子

0

TA的资源

至上芯片

楼主
 

软件模拟SPI总线读写,速度No.1,请高手打檑台 [复制链接]

最近在调试我设计的MP3,用到SPI读写SD卡和向VS1003B发送数据,因为MP3对数据流速度相当敏感,遂对软件SPI进行了优化,目前已能流畅播放了。 我的SPI总线单字节读写函数如下,自认为速度最快了,已至极致,纵然汇编实现,也只能打个平手,51高手请指正。 #include "..\inc\includes.h" sbit c_SPI_SI = P1^5; sbit c_SPI_SO = P1^6; sbit c_SPI_CLK = P1^7; #define Macro_Set_SI_High() c_SPI_SI = 1 #define Macro_Set_SI_Low() c_SPI_SI = 0 #define Macro_Set_CLK_High() c_SPI_CLK = 1 #define Macro_Set_CLK_Low() c_SPI_CLK = 0 /* //----------------标准C语言版----------------------------------------- //可移植性好,易读,易移植 uint8 SD_SPI_ReadByte(void) { uchar ucReadData; uchar ucCount; ucReadData = 0; Macro_Set_SI_High(); for(ucCount=0; ucCount<8; ucCount++) { ucReadData <<= 1; Macro_Set_CLK_Low(); Macro_Set_CLK_High(); if(c_SPI_SO) { ucReadData |= 0x01; } } return(ucReadData); } void SD_SPI_WriteByte(uint8 ucSendData) { uchar ucCount; uchar ucMaskCode; ucMaskCode = 0x80; for(ucCount=0; ucCount<8; ucCount++) { Macro_Set_CLK_Low(); if(ucMaskCode & ucSendData) { Macro_Set_SI_High(); } else { Macro_Set_SI_Low(); } Macro_Set_CLK_High(); ucMaskCode >>= 1; } } */ //-------------------------标准优化版SPI读写函数--------- uchar bdata ucReadData; sbit ReadData_Bit0 = ucReadData^0; sbit ReadData_Bit1 = ucReadData^1; sbit ReadData_Bit2 = ucReadData^2; sbit ReadData_Bit3 = ucReadData^3; sbit ReadData_Bit4 = ucReadData^4; sbit ReadData_Bit5 = ucReadData^5; sbit ReadData_Bit6 = ucReadData^6; sbit ReadData_Bit7 = ucReadData^7; uchar bdata ucWriteData; sbit WriteData_Bit0 = ucWriteData^0; sbit WriteData_Bit1 = ucWriteData^1; sbit WriteData_Bit2 = ucWriteData^2; sbit WriteData_Bit3 = ucWriteData^3; sbit WriteData_Bit4 = ucWriteData^4; sbit WriteData_Bit5 = ucWriteData^5; sbit WriteData_Bit6 = ucWriteData^6; sbit WriteData_Bit7 = ucWriteData^7; uint8 SD_SPI_ReadByte(void) { //初始化SI引脚状态 Macro_Set_SI_High(); //Bit7 Shift Out Macro_Set_CLK_Low(); Macro_Set_CLK_High(); ReadData_Bit7 = c_SPI_SO; //Bit6 Shift Out Macro_Set_CLK_Low(); Macro_Set_CLK_High(); ReadData_Bit6 = c_SPI_SO; //Bit5 Shift Out Macro_Set_CLK_Low(); Macro_Set_CLK_High(); ReadData_Bit5 = c_SPI_SO; //Bit4 Shift Out Macro_Set_CLK_Low(); Macro_Set_CLK_High(); ReadData_Bit4 = c_SPI_SO; //Bit3 Shift Out Macro_Set_CLK_Low(); Macro_Set_CLK_High(); ReadData_Bit3 = c_SPI_SO; //Bit2 Shift Out Macro_Set_CLK_Low(); Macro_Set_CLK_High(); ReadData_Bit2 = c_SPI_SO; //Bit1 Shift Out Macro_Set_CLK_Low(); Macro_Set_CLK_High(); ReadData_Bit1 = c_SPI_SO; //Bit0 Shift Out Macro_Set_CLK_Low(); Macro_Set_CLK_High(); ReadData_Bit0 = c_SPI_SO; return(ucReadData); } void SD_SPI_WriteByte(uint8 ucSendData) { ucWriteData = ucSendData; //Bit7 Shift Out To SD Card Macro_Set_CLK_Low(); c_SPI_SI = WriteData_Bit7; Macro_Set_CLK_High(); //Bit6 Shift Out To SD Card Macro_Set_CLK_Low(); c_SPI_SI = WriteData_Bit6; Macro_Set_CLK_High(); //Bit5 Shift Out To SD Card Macro_Set_CLK_Low(); c_SPI_SI = WriteData_Bit5; Macro_Set_CLK_High(); //Bit4 Shift Out To SD Card Macro_Set_CLK_Low(); c_SPI_SI = WriteData_Bit4; Macro_Set_CLK_High(); //Bit3 Shift Out To SD Card Macro_Set_CLK_Low(); c_SPI_SI = WriteData_Bit3; Macro_Set_CLK_High(); //Bit2 Shift Out To SD Card Macro_Set_CLK_Low(); c_SPI_SI = WriteData_Bit2; Macro_Set_CLK_High(); //Bit1 Shift Out To SD Card Macro_Set_CLK_Low(); c_SPI_SI = WriteData_Bit1; Macro_Set_CLK_High(); //Bit0 Shift Out To SD Card Macro_Set_CLK_Low(); c_SPI_SI = WriteData_Bit0; Macro_Set_CLK_High(); }
此帖出自单片机论坛

最新回复

yjj
恩,哈哈。我也晕了  详情 回复 发表于 2009-7-13 13:56
点赞 关注
 

回复
举报

1170

帖子

0

TA的资源

至上芯片

沙发
 

回复: 软件模拟SPI总线读写,速度No.1,请高手打檑台

奉上测试程序及测试记录 void TestSD_SPIFunc(void) { uchar ucCount; uchar ucReadData; ucCount = 0; //开始 for(ucCount=0; ucCount<10; ucCount++) { SPI_TransferByte(0x88); //用C语言实现的写字节机器周期数为188 //用C51的bData变量,采用位指令直接传送操作,共用机器机器49 } for(ucCount=0; ucCount<50; ucCount++) { ucReadData = SPI_ReadByte(); //用C语言实现的SPI读字节机器赌周期为154 //自用C51的bData变量,采用位指令操作读字节机器周期为49 } ucCount= 88; //结束 SD_read_sector(0,Page_Buf); }
此帖出自单片机论坛
 
 

回复

1170

帖子

0

TA的资源

至上芯片

板凳
 

回复: 软件模拟SPI总线读写,速度No.1,请高手打檑台

每移一位占用4个机器周期 很奇怪51指令,读一个位到C用一个机器周期,而将C输出到位地址用2个机器周期,而且必须通过C中转。 MOV C,Bit 周期1,编码10100010 MoV bit,C 周期2,编码10010010
此帖出自单片机论坛
 
 
 

回复

34

帖子

0

TA的资源

纯净的硅(中级)

4
 
看不懂~~~~~~~~~~~~
此帖出自单片机论坛
 
 
 

回复

77

帖子

0

TA的资源

五彩晶圆(初级)

5
 
最好把你程序的格式排版一下,这么弄还没看就眼晕了。
此帖出自单片机论坛
 
 
 

回复

391

帖子

0

TA的资源

纯净的硅(高级)

6
 
恩,哈哈。我也晕了
此帖出自单片机论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表