OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5309|回复: 2

有关SPI的相关问题请教

[复制链接]

33

主题

253

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
412
金钱
412
注册时间
2012-8-16
在线时间
0 小时
发表于 2014-7-22 00:20:14 | 显示全部楼层 |阅读模式
5金钱
产品开发时,使用硬件SPI没有问题,因为有很多的库可以选择
但是有时候很无奈的是,你的硬件资源SPI用完了,
或者基于某种原因你不得不使用软件模拟SPI
对于软件模拟SPI的问题,不是很明白
以下是问题的详细的描述:
先说一下SPI的WRITE时序:如图:


其时序描述如下:
[mw_shl_code=c,true]void Write_REG(unsigned char ADD,unsigned long int WR_DAT) { unsigned int m=0,j=0; unsigned long int temp1=0x800000; unsigned char temp2=0x20; // SEN=0; _nop_(); _nop_(); SEN=1; SDI=0; CLK=0; _nop_(); _nop_(); _nop_(); _nop_(); CLK=1; for(m=0;m<6;m++) { CLK=1; _nop_(); _nop_(); if(( ADD&temp2)==0x0) SDI=0; else SDI=1; _nop_(); CLK=0; _nop_(); temp2=temp2>>1; } for(j=0;j<24;j++) { CLK=1; _nop_(); if((WR_DAT&temp1)==0X0) SDI=0; else SDI=1; _nop_(); CLK=0 ; _nop_(); temp1=temp1>>1; } CLK=1; Delay_us(2); CLK=0; Delay_us(2); CLK=1; Delay_us(2); CLK=0; Delay_us(2); SEN=0; Delay_us(10); }[/mw_shl_code]
再说一下SPI的READ时序,如图:


其时序描述如下:
[mw_shl_code=c,true]unsigned long int Read_REG(unsigned char ADD) { unsigned int m=0,j=0; unsigned long int RD_DAT=0; unsigned char temp2=0x20,DAT=0; // SEN=0; _nop_(); _nop_(); SEN=1; SDI=1; CLK=0; _nop_(); _nop_(); _nop_(); _nop_(); CLK=1; for(m=0;m<6;m++) { CLK=1; _nop_(); _nop_(); if(( ADD&temp2)==0x0) SDI=0; else SDI=1; _nop_(); CLK=0; _nop_(); temp2=temp2>>1; } CLK=1; //第七个上升沿和下降沿 _nop_(); _nop_(); CLK=0; _nop_(); _nop_(); for(j=0;j<24;j++) { CLK=1; _nop_(); if(SD_LD0==0) DAT=0; else DAT=1; _nop_(); CLK=0 ; _nop_(); if(j<23) { RD_DAT=(RD_DAT|DAT )<<1; } else; } CLK=1; Delay_us(1); SEN=0; Delay_us(1); CLK=0; Delay_us(10); return(RD_DAT) ; } [/mw_shl_code]
然后就是本人对此有点疑问:
1.我想知道以上的时序图对应的描述是否OK?
2.在模拟SPI的时序或者其他的时序时,所要注意的是什么?
3.如何确定你的时序模拟的是对的?使用示波器看模拟后发的波形吗?
4.如何完整的用代码把一个时序图给完整的表达出来?
非常感谢路过的朋友,如果原子看到,麻烦帮下忙,谢谢!!!!!

开源的世界,你可以做主!!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-7-22 08:14:42 | 显示全部楼层
下面是我模拟SPI的时序程序,你可以参考一下
[mw_shl_code=c,true]u8 Soft_SPI_ReadWrite_Byte(u8 send_data) { u8 i; u8 rcv; // Soft_SPI_CLK = 0; Soft_SPI_MISO_IN(); //设置MISO为输入模式 for(i = 0;i < 8;i++) { if(send_data & 0x80) Soft_SPI_MOSI = 1; //放上数据 else Soft_SPI_MOSI = 0; send_data <<= 1; rcv <<= 1; Soft_SPI_CLK = 0; Soft_SPI_CLK = 1; //上升沿发送数据 if(Soft_SPI_MISO) rcv |= 0x01; //返回来的是"1" // Soft_SPI_CLK = 0; } Soft_SPI_CLK = 0; // return send_data; //返回接收到的数据 return rcv; }[/mw_shl_code]

现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

33

主题

253

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
412
金钱
412
注册时间
2012-8-16
在线时间
0 小时
 楼主| 发表于 2014-7-22 09:01:12 | 显示全部楼层
回复【2楼】Badu_Space:
---------------------------------
非常感谢!!!后面仔细看了一下
发现一点问题:
rcv没有初始化啊,在函数里面没有赋值,但是可以左移,这有点不可思议吧!!
按照我的理解,开始的时候是不是应该给rcv初始化赋值为0或者其他!!谢谢~~~
开源的世界,你可以做主!!
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-5 02:04

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表