ps2xu 发表于 2014-6-2 16:41:56

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

本帖最后由 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数据寄存器会发送原来接收到的值,这是怎么回事?求教诲:
正确的截图

错误的截图:



落叶不落春雨 发表于 2014-6-2 19:00:46

这是基于PC的逻辑分析仪???

ps2xu 发表于 2014-6-3 07:20:58

是的,就是数据传输出错!

wxws 发表于 2014-6-3 09:35:56

不会呀,用ARDUINO带的DEMO也这样?

ps2xu 发表于 2014-6-3 09:40:37

wxws 发表于 2014-6-3 09:35 static/image/common/back.gif
不会呀,用ARDUINO带的DEMO也这样?
您的意思是自带的DEMO也会偶尔出现SPI数据误传吗?

friskit 发表于 2014-6-3 15:47:58

共地了么……

ps2xu 发表于 2014-6-3 16:07:02

friskit 发表于 2014-6-3 15:47 static/image/common/back.gif
共地了么……

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

qptimus 发表于 2014-6-3 20:05:39

上代码,你确定不是你代码里的问题么,这种时候首先要检查的是代码吧

ps2xu 发表于 2014-6-4 08:14:52

我在想代码应该不会有问题,最大问题是SPI.H库里的传输函数,总觉得不太对。呵呵
#include <stdio.h>
#include <Arduino.h>
#include <avr/pgmspace.h>
#include<SPI.h>
#define uchar unsigned char
//initial i.o port
void IO_Initila(void)
{
// digitalWrite(SS, LOW);
pinMode(MISO,OUTPUT);
pinMode(SS, INPUT);
pinMode(SCK, INPUT);
pinMode(MOSI, INPUT);
SPCR |= _BV(SPE);

}
//SlaveInit
void SPI_SlaveInit(void)
{
SPCR=(1<<SPE);
SPCR |= _BV(DORD);
SPCR |= _BV(CPOL);
SPCR |= _BV(CPHA);
}

void setup()
{
pinMode(12,OUTPUT);
pinMode(13,OUTPUT);
digitalWrite(12,HIGH);//ACKPIN 每个8 bits数据发送之后的最后一个时钟周期变低
Serial.begin(115200);
}
void loop()
{
IO_Initila();
SPI_SlaveInit();
    while(digitalRead(SS)==0)
{
Serial.print("read:");
Serial.print(SPI.transfer(0xFF));
Serial.print("-");
Serial.print(SPI.transfer(0x41));
Serial.print("-");
Serial.print(SPI.transfer(0x5A));
Serial.print("-");
Serial.print(SPI.transfer(0xFF));
Serial.print("-");
Serial.println(SPI.transfer(0xFD));
delayMicroseconds(2);
pinMode(SS, OUTPUT);
digitalWrite(SS,HIGH);

}
}
//改SPI.H的函数
byte SPIClass::transfer(byte _data) {
SPDR = _data;
while (!(SPSR & _BV(SPIF)))
    ;
delayMicroseconds(6);//ACKPIN 每个8 bits数据发送之后的最后一个时钟周期变低
digitalWrite(12,LOW);
delayMicroseconds(6);
digitalWrite(12,HIGH);
return SPDR;
}
页: [1]
查看完整版本: 各位高手,SPI数据传输问题,求教诲!