当前位置: 首页 > 知识库问答 >
问题:

Arduino Mega到ADC SPI通信不工作

华甫
2023-03-14

我使用SPI通信尝试连接我的Arduino Mega 2560作为主从ADC芯片(Max 1247)在外部时钟模式,但我一直收到相同的值(RB1=255,RB2=255,RB3=255)或所有零每当我运行我的代码。还有一个触摸屏(工作)连接。除了与Arduino的ADC芯片通信外,一切正常。

我尝试删除定义头,并改变时钟。也不要改变任何东西(这可能是因为其他错误)。

//Portion of Header

//Defining SPI connections

#define SELPIN 53 //Selection Pin

#define DATAOUT 50 //MIS0

#define DATAIN  51 //MOSI

#define SPICLOCK  52//Clock

#define SSTRB 43 //SSTRB


#include <Adafruit_GFX.h> 

#include "MCUFRIEND_kbv.h"


MCUFRIEND_kbv tft(A3, A2, A1, A0, A4);

int sstrb = 0;  

byte TB1 = B11101111;  

byte RB1;  

byte RB2;  

byte RB3;  

byte RB4;

//SETUP

void setup(){  

  pinMode(SELPIN, OUTPUT);  

  pinMode(sstrb, INPUT);  

  pinMode(DATAOUT, INPUT); 

  pinMode(DATAIN, OUTPUT);

  pinMode(SPICLOCK, OUTPUT);

  //disable device to start.

  digitalWrite(SELPIN, HIGH);

  digitalWrite(SPICLOCK, LOW);

  digitalWrite(DATAIN, LOW);

}

void loop(){

//Some other touch screen stuff prefaces this..

else if (currentPage == '3') {
    if (tp.z > myTouch.pressureThreshhold) {
      x = tp.x;
      y = tp.y;
      //Back button command

      if ((x >= 20) && (x <= 900) && (y >= 0) && (y <= 320)) {
        homescreen();
        currentPage = '0';
      }

      else if ((x >= 700) && (x <= 800) && (y >= 350) && (y <= 875)) {
        //loop

        SPI.beginTransaction(SPISettings(1000000, MSBFIRST, SPI_MODE0));

        digitalWrite(SELPIN, LOW);

        //The line beneath might take care of transmitting dataout, and receiving datain (vs currently doing seperately)?.

        RB1 = SPI.transfer(TB1);

        Serial.print("\r\nRB1="); Serial.print(RB1);

        digitalRead(sstrb);

        if (sstrb == 0){

          RB2 = SPI.transfer(0x0);

          Serial.print("\r\nRB2="); Serial.print(RB2);

          RB3 = SPI.transfer(0x0);

          Serial.print("\r\nRB3="); Serial.print(RB3);

          digitalWrite(SELPIN, HIGH);

          digitalWrite(SELPIN, LOW);

          SPI.endTransaction();

          tft.fillRoundRect(40, 20, 300, 70, 15, RED);

          tft.setCursor(150, 45);

          tft.setTextColor(WHITE);

          tft.setTextSize(3);

          tft.print("3A");

          tp = myTouch.getPoint();

          pinMode(YP, OUTPUT);

          pinMode(XM, OUTPUT);

          digitalWrite(YP, HIGH);

          digitalWrite(XM, HIGH);

        }

        else{

          Serial.print("SSTRB is high");

        }

      }

    }

  }

}

错误包括RB1=255;RB2=255;RB3=255或全部为零。

共有1个答案

佴阳辉
2023-03-14

我不能确定这是否是你问题的根源,但我发现了以下内容:

您将SSTRB定义为插脚43

#define SSTRB 43 //SSTRB

但你实际上从未使用过这个值。相反你也定义了

int sstrb = 0;

下面的几行,然后用它来定义引脚0作为输入

pinMode(sstrb, INPUT);

我想这应该是

pinMode(SSTRB, INPUT);

然后,在循环中有这些行

digitalRead(sstrb);
if (sstrb == 0){

如果digitalRead实际上什么都不做(从引脚0读取并丢弃该值),我假设您想要写入

sstrb = digitalRead(SSTRB);

否则,sstrb实际上永远不会更改,并且始终为0。

另外,由于数据表(https://datasheets.maximintegrated.com/en/ds/MAX1246-MAX1247.pdf#page=13)声明

在外部时钟模式下,[…]。在控制字节的最后一位之后,SSTRB脉冲高达一个时钟周期。

bool wasHigh = false;
do {
    sstrb = digitalRead(SSTRB);
    if( sstrb == 1 ){ 
        wasHigh = true; 
    }
}while( !(wasHigh && sstrb == 0) );

请注意,如果脉冲在此等待之前发生,或者从未发生,则您将无休止地停留在该循环中。您可能不想在此处添加中断条件或超时。当然,您也可以使用中断来解决此问题。

 类似资料:
  • 在深入了解WebSocket的需求之前,有必要先了解一下现有的技术,这些技术用于服务器和客户端之间的双工通信。这些技术如下 - 轮询 长轮询 数据流 回发和AJAX HTML5 轮询 轮询可以定义为一种方法,无论传输中存在哪些数据,它都执行周期性请求。定期请求以同步方式发送。客户端在指定的时间间隔内向服务器发出定期请求。服务器的响应包括可用数据或其中的一些警告消息。 长轮询 顾名思义,长轮询包括类

  • 我正在构建一个鼓机,我已经存储了一个带有kick声音的示例头文件,它的值介于0和170之间。我想通过SPI将其发送到10位MCP4811 DAC,然后将其输出到3.5毫米音频插孔。 我有我的MISO,MOSI,SCK和复位引脚连接到我的USB编程器以及DAC。 这里是存储在"samples. h"中的音频文件的片段。 因此,它是2221位的样本。我想用SPI发送到DAC,频率=22 kHz。 我使

  • 我的程序从用户那里获取一个URL,所以它可以对互联网上的任何网站提出请求。我试图使这成为可能,我查找了所有关于“Android HTTP Cleartext”错误的答案,并做出了这一点,但它仍然不允许我连接我的测试本地PHP服务器,我在这里遗漏了什么? 我的安全配置:

  • 这是怎么回事?它不是按降序打印考试成绩,我也没有得到平均值的值。显示 0.0 她给我的指示是: 该类将允许用户在数组中输入5个分数。然后它将按降序重新排列数据并计算数据集的平均值。 属性: •data[]-将包含分数的数组 • 平均值 — 分数的算术平均值 方法: 平均-构造函数。它将为数组分配内存。使用for循环重复向用户显示提示,该提示应指示用户应输入分数1、分数2等。注意:计算机从0开始计数

  • 我在viewpager中设置了三个片段,就像滑动选项卡布局一样。我需要将字符串值从一个片段传递到另一个片段。 首先,我试着建立一个接口,就像这里的答案建议如何在片段之间传递数据,这对我不起作用。想法是片段A告诉主活动,然后主活动告诉片段B。 所以我寻找不同的答案 http://android-er.blogspot.com/2012/06/communication-between-fragmen