各位高手,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数据寄存器会发送原来接收到的值,这是怎么回事?求教诲:
正确的截图
错误的截图:
这是基于PC的逻辑分析仪??? 是的,就是数据传输出错! 不会呀,用ARDUINO带的DEMO也这样? wxws 发表于 2014-6-3 09:35 static/image/common/back.gif
不会呀,用ARDUINO带的DEMO也这样?
您的意思是自带的DEMO也会偶尔出现SPI数据误传吗? 共地了么…… friskit 发表于 2014-6-3 15:47 static/image/common/back.gif
共地了么……
共地了,这个现象,感觉上是SPI寄存器上要发送的数据是刚刚上一次通信收到的数据,而要发送的新数据不能及时导入寄存器。 上代码,你确定不是你代码里的问题么,这种时候首先要检查的是代码吧 我在想代码应该不会有问题,最大问题是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]