极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 12551|回复: 8

各位高手,SPI数据传输问题,求教诲!

[复制链接]
发表于 2014-6-2 16:41:56 | 显示全部楼层 |阅读模式
本帖最后由 ps2xu 于 2014-6-4 09:10 编辑

各位高手:
      本人写SPI从机数据输出程序:
          SPI.transfer(0XFF);
          SPI.transfer(0X41);
          SPI.transfer(0X5A);
          SPI.transfer(0XFF);
          SPI.transfer(0XFF);
本应该:主出数据                          从出数据
               0X01                        0XFF
               0X42                        0X41
               0X00                        0X5A
               0X00                        0XFF
               0X00                        0XFF
但经常会出现SPI数据寄存器会发送原来接收到的值,这是怎么回事?求教诲:
正确的截图


错误的截图:



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2014-6-2 19:00:46 | 显示全部楼层
这是基于PC的逻辑分析仪???
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-6-3 07:20:58 | 显示全部楼层
是的,就是数据传输出错!
回复 支持 反对

使用道具 举报

发表于 2014-6-3 09:35:56 | 显示全部楼层
不会呀,用ARDUINO带的DEMO也这样?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-6-3 09:40:37 | 显示全部楼层
wxws 发表于 2014-6-3 09:35
不会呀,用ARDUINO带的DEMO也这样?

您的意思是自带的DEMO也会偶尔出现SPI数据误传吗?
回复 支持 反对

使用道具 举报

发表于 2014-6-3 15:47:58 | 显示全部楼层
共地了么……
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-6-3 16:07:02 | 显示全部楼层
friskit 发表于 2014-6-3 15:47
共地了么……

共地了,这个现象,感觉上是SPI寄存器上要发送的数据是刚刚上一次通信收到的数据,而要发送的新数据不能及时导入寄存器。
回复 支持 反对

使用道具 举报

发表于 2014-6-3 20:05:39 | 显示全部楼层
上代码,你确定不是你代码里的问题么,这种时候首先要检查的是代码吧
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-6-4 08:14:52 | 显示全部楼层
我在想代码应该不会有问题,最大问题是SPI.H库里的传输函数,总觉得不太对。呵呵
  1. #include <stdio.h>
  2. #include <Arduino.h>
  3. #include <avr/pgmspace.h>
  4. #include<SPI.h>
  5. #define uchar unsigned char
  6. //initial i.o port
  7. void IO_Initila(void)
  8. {
  9. // digitalWrite(SS, LOW);
  10. pinMode(MISO,OUTPUT);
  11.   pinMode(SS, INPUT);
  12.   pinMode(SCK, INPUT);
  13.   pinMode(MOSI, INPUT);
  14.   SPCR |= _BV(SPE);

  15. }
  16. //SlaveInit
  17. void SPI_SlaveInit(void)
  18. {
  19.   SPCR=(1<<SPE);
  20.   SPCR |= _BV(DORD);
  21.   SPCR |= _BV(CPOL);
  22.   SPCR |= _BV(CPHA);
  23. }

  24. void setup()
  25. {
  26.   pinMode(12,OUTPUT);
  27.   pinMode(13,OUTPUT);
  28.   digitalWrite(12,HIGH);//ACKPIN 每个8 bits数据发送之后的最后一个时钟周期变低
  29. Serial.begin(115200);
  30. }
  31. void loop()
  32. {
  33.   IO_Initila();
  34.   SPI_SlaveInit();
  35.     while(digitalRead(SS)==0)
  36.   {
  37. Serial.print("read:");
  38. Serial.print(SPI.transfer(0xFF));
  39. Serial.print("-");
  40. Serial.print(SPI.transfer(0x41));
  41. Serial.print("-");
  42. Serial.print(SPI.transfer(0x5A));
  43. Serial.print("-");
  44. Serial.print(SPI.transfer(0xFF));
  45. Serial.print("-");
  46. Serial.println(SPI.transfer(0xFD));
  47. delayMicroseconds(2);
  48. pinMode(SS, OUTPUT);
  49. digitalWrite(SS,HIGH);

  50.   }
  51. }
  52. //改SPI.H的函数
  53. byte SPIClass::transfer(byte _data) {
  54.   SPDR = _data;
  55.   while (!(SPSR & _BV(SPIF)))
  56.     ;
  57.   delayMicroseconds(6);//ACKPIN 每个8 bits数据发送之后的最后一个时钟周期变低
  58.   digitalWrite(12,LOW);
  59.   delayMicroseconds(6);
  60.   digitalWrite(12,HIGH);
  61.   return SPDR;
  62. }
  63.   
复制代码
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-14 04:49 , Processed in 0.076616 second(s), 23 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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