Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arduino Mega到ADC SPI通信不工作_Arduino_Spi_Adc - Fatal编程技术网

Arduino Mega到ADC SPI通信不工作

Arduino Mega到ADC SPI通信不工作,arduino,spi,adc,Arduino,Spi,Adc,我正在使用SPI通信尝试在外部时钟模式下将我的Arduino Mega 2560作为主机与ADC芯片作为从机(Max 1247)连接,但每次运行代码时,我都会收到相同的值(RB1=255,RB2=255,RB3=255)。还连接了一个触摸屏(可正常工作)。除了与Arduino的通讯,一切都正常 我尝试过删除define头并改变时钟。也不要更改任何内容(可能是因为其他错误) //标题部分 //定义SPI连接 #定义SELPIN 53//选择插脚 #定义DATAOUT 50//MIS0 #在51//

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

我尝试过删除define头并改变时钟。也不要更改任何内容(可能是因为其他错误)

//标题部分
//定义SPI连接
#定义SELPIN 53//选择插脚
#定义DATAOUT 50//MIS0
#在51//MOSI中定义数据
#定义SPICLOCK 52//Clock
#定义SSTRB 43//SSTRB
#包括
#包括“MCUFRIEND_kbv.h”
MCUFRIEND_kbv tft(A3、A2、A1、A0、A4);
int-sstrb=0; 
字节TB1=B11101111; 
字节RB1; 
字节RB2; 
字节RB3; 
字节RB4;
//设置
无效设置(){
pinMode(SELPIN,输出)
引脚模式(sstrb,输入)
引脚模式(数据输出、输入)
pinMode(数据输入、输出);
pinMode(SPICLOCK,输出);
//禁用设备以启动。
数字写入(SELPIN,高);
数字写入(SPICLOCK,低电平);
数字写入(数据输入,低电平);
}
void循环(){
//其他一些触摸屏的东西就在这之前。。
else if(currentPage==“3”){
如果(tp.z>myTouch.pressureThreshhold){
x=tp.x;
y=tp.y;
//后退按钮命令

如果((x>=20)&&(x=0)&&&(y=700)&&&(x=350)&&(y我不能肯定这是否是你问题的根源,但我发现了以下几点:

您将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

另外,由于数据表()中说明

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

如果您使用的是外部时钟模式,我假设您更希望在继续之前等待此脉冲结束。您可以执行如下繁忙等待:

bool wasHigh = false;
do {
    sstrb = digitalRead(SSTRB);
    if( sstrb == 1 ){ 
        wasHigh = true; 
    }
}while( !(wasHigh && sstrb == 0) );
请注意,如果脉冲在此等待之前出现或从未出现,您将无休止地留在该循环中。您可能不想在此处添加中断条件或超时。当然,您也可以使用中断来解决此问题


附加说明:您正在检查
sstrb
是否仅为0的分支中调用
endTransaction
。我不知道SPI库如何处理在不先结束旧事务的情况下再次开始事务,它可能工作正常,我只是想让您知道这可能是一个潜在的陷阱。

这帮了大忙随着我对sstrb的困惑。我还发现我对SELPIN和连接到CS的pin进行分组是错误的。我认为它们是相同的,但一旦我将它们分开,并更新代码以匹配您在sstrb上添加的部分,一切都按预期进行了。很高兴听到现在一切都正常了。总是很乐意提供帮助。
bool wasHigh = false;
do {
    sstrb = digitalRead(SSTRB);
    if( sstrb == 1 ){ 
        wasHigh = true; 
    }
}while( !(wasHigh && sstrb == 0) );