打印

模拟SPI问题

[复制链接]
楼主: chenyu988
手机看帖
扫描二维码
随时随地手机跟帖
21
chenyu988|  楼主 | 2012-11-24 11:45 | 只看该作者 回帖奖励 |倒序浏览
19# NE5532
主机发送接收程序需要制造上升下降沿,而从机则是通过读CLK2引脚上的电平跳变状态,以确定是否是上升或者下降沿来执行发送或者接收动作。
假设主机是上升沿发送数据,下降沿接收数据。那从机就是上升沿接收数据,下降沿发送数据
主机与从机的数据传输是同步的,主机上升沿发送数据的时候,从机此时开始接收数据
那从机里面岂不是要判断CLK1的电平状态?(CLK1与CLK2硬件连接)即判断CLK2的电平状态,比如:
if(CLK2==0)接收一位数据;
while(CLK2!=0)接收一位数据成功,数据移位;
我这样理解对吗?

使用特权

评论回复
22
chenyu988|  楼主 | 2012-11-24 11:47 | 只看该作者
19# NE5532
还有就是主机是上升沿发送,还是下降沿发送是随意的吗? 从机根据主机的状态进行相应的接收和发送。

使用特权

评论回复
23
NE5532| | 2012-11-24 11:49 | 只看该作者
你考虑问题不够全面
123654789 发表于 2012-11-24 11:44


你可以继续补充呀

使用特权

评论回复
24
NE5532| | 2012-11-24 11:51 | 只看该作者
19# NE5532
主机发送接收程序需要制造上升下降沿,而从机则是通过读CLK2引脚上的电平跳变状态,以确定是否是上升或者下降沿来执行发送或者接收动作。
假设主机是上升沿发送数据,下降沿接收数据。那从机就是上升 ...
chenyu988 发表于 2012-11-24 11:45


是这样的,另外你可以把CLK1和CLK2取了,哪里来的两个CLK,只有主机发送的1个,从机那个CLK是输入端,不正确的叫法可以把你自己整晕。

使用特权

评论回复
25
NE5532| | 2012-11-24 11:52 | 只看该作者
19# NE5532  
还有就是主机是上升沿发送,还是下降沿发送是随意的吗? 从机根据主机的状态进行相应的接收和发送。
chenyu988 发表于 2012-11-24 11:47


一般来说,从机多是固定的器件,而非单片机,这时候要根据器件的要求来选择沿,因为器件的特性你改不了。

使用特权

评论回复
26
blueshwu| | 2012-11-24 13:49 | 只看该作者
机控制CLK,至于MISO、MOSI、CS,都是可选的吧?看是不是双向通信、是不是多机通讯呗?:victory:

使用特权

评论回复
27
njp-1@qq.com| | 2012-11-24 15:26 | 只看该作者
Master主机:控制CLK的器件,谁控制时钟谁是主机
Slave从机:不控制CLK的器件,主机外的都是从机
Transmitter发送器:向数据线发送数据器件,这里SIMO主机作为发送器
Receiver接收器: 从数据线接收数据器件 ,这里SIMO从机作为接收器
I2C SPI 类似  掌握时序,最好2个芯片来控制试试  可以用一个带SPI另外一个模拟,示波器配合查看时序,看到效果会更好~!

使用特权

评论回复
28
njp-1@qq.com| | 2012-11-24 15:27 | 只看该作者
Master主机:控制CLK的器件,谁控制时钟谁是主机
Slave从机:不控制CLK的器件,主机外的都是从机
Transmitter发送器:向数据线发送数据器件,这里SIMO主机作为发送器
Receiver接收器: 从数据线接收数据器件 ,这里SIMO从机作为接收器
I2C SPI 类似  掌握时序,最好2个芯片来控制试试  可以用一个带SPI另外一个模拟,示波器配合查看时序,看到效果会更好~!

使用特权

评论回复
29
jlass| | 2012-11-24 19:28 | 只看该作者
主机的mosi接从机的mosi,不需要交叉,这点我支持ne5532的

使用特权

评论回复
30
chenyu988|  楼主 | 2012-11-24 19:56 | 只看该作者
25# NE5532
你好,我用430作为主机,51单片机作为从机,写了一个主机程序和一个从机程序,主机发送数据,从机接收,并把接收到的数据发回主机。
主机上升沿发送,下降沿接收,相应的从机上升沿接收,下降沿发送。
但主机接收到的数据与主机发送的数据不一致。发送00回读到的是FF,发送FF回读到的是00,发送其他的就乱了。
从机我接收部分是这样写的
unsigned char ReceiveByte(void)
{
  unsigned char i,tempbit,tempData;
  
  for(i=8;i>0;i--)
  {
    if(MOSI ==1)//判断收到的电平信号
    {
      tempbit = 1;
    }
    else
      tempbit = 0;  
    while(SCLK==0);//这里是否有问题
    tempData = ((tempData<<1)|tempbit);//数据读出操作
  }
SCLK是时钟线,从机只需要等待判断就行了吗?

使用特权

评论回复
31
bigblueman| | 2012-11-24 19:59 | 只看该作者
学习学习。

使用特权

评论回复
32
chenyu988|  楼主 | 2012-11-24 20:12 | 只看该作者
25# NE5532
发现我把主机输出高低电平对应数据1 0弄反了,发00收到00 发FF收到FF,但发其他的还是接收不对,我再看看。

使用特权

评论回复
33
NE5532| | 2012-11-24 20:33 | 只看该作者
你那里确实有问题,什么叫下降沿?

“时钟信号从高电平变到低电平的跳变叫下降沿”

while(SCLK==0);

这个是表达上述意思的么?是不是应该这样写呢?

while(SCLK == 1);   //等时钟变高
while(SCLK == 0);   //等时钟变低,下降沿到来

另外说两点,楼主整个帖子的问题都在于描述问题,如果楼主自己按名词解释的要求说清楚什么叫MOSI、MISO,什么叫上升沿、下降沿,可能自己都知道错在哪里了。

另外你这种从机的写法,从机基本没办法做其他的事情了,只能傻等主机时钟,建议把从机的CLK用外部中断来做。

使用特权

评论回复
34
chenyu988|  楼主 | 2012-11-24 21:32 | 只看该作者
33# NE5532
谢谢,但我收到的数据一直不对(除了00和FF),是不是从机51用的IO模拟SPI,要捕捉CLK的每个脉冲还要处理数据,所以丢数据的机会很大?

使用特权

评论回复
35
NE5532| | 2012-11-24 22:24 | 只看该作者
你没有检测沿,所以一旦检测到低电平,就连续采了8次样,当然只有前部数据都是0和1的才是真确的,所以只有0x00和0xFF收得对。

简单说,就是你把一个Bit收了8次。

使用特权

评论回复
36
NE5532| | 2012-11-24 22:25 | 只看该作者
33# NE5532  
谢谢,但我收到的数据一直不对(除了00和FF),是不是从机51用的IO模拟SPI,要捕捉CLK的每个脉冲还要处理数据,所以丢数据的机会很大?
chenyu988 发表于 2012-11-24 21:32


你有没有认真看33楼的回帖啊?

使用特权

评论回复
37
dqyubsh| | 2012-11-24 22:37 | 只看该作者
放着省事偏弄这么麻烦,双向通讯可以用串口啊,或者选择那些带硬件SPI、I2C的单片机,这劲费的,不值。

没有中断没有寄存器,连握手线都不加,我想不出怎么干能有什么前途。

使用特权

评论回复
38
chenyu988|  楼主 | 2012-11-24 22:39 | 只看该作者
36# NE5532
我看了33楼回帖增加了对沿的判断,但收到的数据不对

使用特权

评论回复
39
NE5532| | 2012-11-24 22:45 | 只看该作者
36# NE5532  
我看了33楼回帖增加了对沿的判断,但收到的数据不对
chenyu988 发表于 2012-11-24 22:39


还要考虑是不是主机端发快了,先写测试程序跟踪主机的时钟信号,看有没有掉。37楼说得对,串口通讯远比这个来得简单。是在要用SPI,也建议用外中断来写。

使用特权

评论回复
40
chenyu988|  楼主 | 2012-11-24 22:58 | 只看该作者
39# NE5532
谢谢,也谢谢37楼,我不是项目上用到这个。我就是想自学下模拟SPI,可能刚开始的时候我认为把模拟SPI调通了,能正确接到数据了 就算会SPI了,但经过你们这么一说,发现其实就单单一个SPI,还有考虑其他方面的东西,比如你说的我程序一直在等待,没法干其他事了,所以又要用到中断

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则