乐鑫技术交流
直播中

绝代双骄

11年用户 1094经验值
私信 关注
[问答]

求助,关于SPI问题求解

您好,
我正在尝试与 Max31865 adafruit PCB 进行通信,但没有成功。我检查了所有引脚和连接,并确认我使用示例草图 (Arduino ide) 运行 max31865 库并且工作正常,这意味着连接、pcb 故障已被排除。esp8622 来自 olimex,我按照说明手册使用 HSD 端口(引脚 12、13、14、15)。我和 Arduino 一起用过。esp 基本版本是 3.0 alpha 69。请找到我试图从寄存器 0x​​00 读取失败的以下代码。
io(po,15,1)
spi.setup(500000,1,1)
delay 1000
io(po,15,0)
received_data = spi.hex(“00”,1)
print received_data
io(po,15,1)
延迟 100
io(po,15,0)
spi.hex(“00C2”,2)
io(po,15,1)
延迟 100
io(po,15,0)
received_data = spi.hex(“00”,1)
io(po,15,1)
打印 received_data
我总是收到 FF 或 00。我尝试了不同的频率 (50000,1000000) 但没有成功。你能恢复我做错了什么吗?
此外,请使用 arduino IDE 找到工作代码
#include  
//数据表第 12 页表 1 中定义的寄存器
静态字节配置 = 0b10000000;//0x80H                          
静态字节 read_Configuration = 0b00000000; //0x00H
静态字节 Write_High_Fault_Threshold_MSB = 0b10000011; //0x83H
静态字节 Write_High_Fault_Threshold_LSB = 0b10000100; //0x84H
静态字节 Read_High_Fault_Threshold_MSB = 0b00000011;//0x03H
静态字节 Read_High_Fault_Threshold_LSB = 0b00000100; //0x04H
静态字节 Write_Low_Fault_Threshold_MSB = 0b10000101; //0x85H
静态字节 Write_Low_Fault_Threshold_LSB = 0b10000110; //0x86H
静态字节 Read_Low_Fault_Threshold_MSB = 0b00000101; //0x05H
静态字节 Read_Low_Fault_Threshold_LSB = 0b00000110; //0x06H
静态字节 Fault_Status = 0b00000111; //0x07H
//Callendar-Van Dusen方程用于温度线性化。方程的系数如下:
//R(T) = R0(1 + aT + bT^2 + c(T - 100)T^3)

静态浮动 b = -0.0000005775;
静态浮动 c = -0.00000000000418301;
浮动参考电阻;//威廉希尔官方网站 板上安装的参考电阻。
浮动 RTD_Resistance;//0 度时的 RTD 电阻。请参阅您的 RTD 数据表。
//局部变量
double Temperature = 0; //变量定义为从 getTemp() 读取数据并显示在串行控制台上。
字节 Fault_Error = 0;//读取故障寄存器和计算故障
字节值的变量= 0;// 定义了一个变量来显示串口输出的内容
const int slaveSelectPin = 15; //使用数字引脚 52 进行片选
//int DRDY = 50;
/* Write(byte, byte) 函数需要寄存器地址和数据写入相应序列调用时提供的寄存器。
写入功能确实需要在设置中正确定义 slaveSelectPin。更改 slaveSelectPin 的变量名称也需要更改 Write 函数“slaveSelectPin”名称
*/
void Write(byte w_addr, byte data)
{ digitalWrite(slaveSelectPin,LOW);   
  SPI.transfer(w_addr);                 
  SPI.传输(数据);               
  digitalWrite(slaveSelectPin,HIGH);}
//读取函数(byte)接受要读取的寄存器地址并将寄存器的内容返回给循环函数
  byte Read(byte r_addr)
  { digitalWrite(slaveSelectPin,LOW);
    SPI.transfer(r_addr); // 从配置寄存器读取
    值 = SPI.transfer(0xFF); // 虚拟写入提供 SPI 时钟信号以读取                                                                     
    digitalWrite(slaveSelectPin,HIGH);
    返回值;}
/* get_Temp() 函数检查是否设置了 LSB RTD 寄存器的故障位 (D0)。如果是,则转换中止。如果
未设置故障位,则启动转换。然后将数字代码计算为温度值并打印在串行控制台上。
对于线性化,使用 Callendar-Van Dusen 方程。
R(T) = R0(1 + aT + bT^2 + c(T - 100)T^3)
*/
void get_Temp()
{ 字节 lsb_rtd = 读取(0x02);  
   byte fault_test = lsb_rtd&0x01;
   while(fault_test == 0)
     {
       //if(digitalRead(DRDY) == 0)
         byte msb_rtd = Read(0x01);                                             
           浮动 RTD = ((msb_rtd << 7)+((lsb_rtd & 0xFE) >> 1)); //结合 RTD_MSB 和 RTD_LSB 来表示十进制值。在移位/Anding 期间移除 MSB 和 LSB
           float R = (RTD*Reference_Resistor)/32768;//ADC RTD代码到电阻的转换
           float Temp = -RTD_Resistance*a + sqrt(RTD_Resistance*RTD_Resistance*a*a - 4*RTD_Resistance*b*(RTD_Resistance-R)); //RTD电阻到温度的转换
           Temp = Temp/(2*RTD_Resistance*b);
           Serial.print(\"RTD 测得的温度为:\"); Serial.println(Temp, 4); //控制台打印温度
           延迟(100);
           lsb_rtd = 读(0x02);
           fault_test = lsb_rtd&0x01;
      }
   Serial.println(\"检测到错误。测得的 RTD 电阻不在阈值寄存器指定的范围内。\");   
}
//Fault(byte) 函数需要提供故障位的内容。它检查设置的位并在串行控制台上提供错误位信息。
无效故障(字节故障)
    {Serial.println(故障,BIN);
      字节温度= 0;//创建的临时变量:目的是找出故障寄存器中设置了哪个错误位
      temp = fault & 0x80; //逻辑与故障寄存器内容 0b10000000 检测 D7 错误位
      if(temp>0) {Serial.println(\"Bit D7 is Set. It\'s Possible your RTD device is disconnected from RTD+ or RTD-. Please verify your connection and高故障阈值\");}
      temp = fault & 0x40;
      if(temp>0) {Serial.println(\"位 D6 已设置。可能是你的 RTD+ 和 RTD- 短路了。请验证你的连接和你的低故障阈值。\"); }
      temp = 故障 & 0x20;
      if(temp>0){Serial.println(\"Bit D5 is Set.Vref- is greater than 0.85 * Vbias\");

      if(temp>0){Serial.println(\"Bit D4 已设置。请参阅数据表了解更多信息\");}
      temp = fault &0x08;
      if(temp>0){Serial.println(\"Bit D3 is Set. Please refer to data sheet for more information\");}
      temp = fault &0x04;
      if(temp>0){Serial.println(\"Bit D2 is Set. Please refer to data sheet for more information\");}
    }
void setup() {   
  Serial.begin(9600); // 串行通信波特率
  pinMode (slaveSelectPin, OUTPUT); // 将 CS 终端定义为输出
// pinMode (DRDY, INPUT); // DRDY 终端作为输入
  SPI.begin();   
  SPI.setClockDivider(128); // 将 SPI 时钟设置为 625 MHz。请注意,在进行任何更改之前初始化 SPI 总线非常重要。
  Serial.println(\"这是 MAX31865 的示例代码 - RTD 到数字转换器:\");
  写入(配置,0b10000000);//使能max31865的Vbias
  value = Read(read_Configuration); //读取配置寄存器的内容以验证与 max31865 的通信是否正确完成
        if (value == 128)
            { Write(Write_High_Fault_Threshold_MSB, 0xFF); //写入高故障阈值 MSB
                Write(Write_High_Fault_Threshold_LSB, 0xFF); //写入高故障阈值 LSB
                写(Write_Low_Fault_Threshold_MSB,0x00);//写入低故障阈值 MSB
                Write(Write_Low_Fault_Threshold_MSB, 0x00); //写入低故障阈值 LSB   
                Reference_Resistor = 430; //EVM 上安装的参考电阻
                RTD_Resistance = 100;//0 度时的 RTD 电阻
                Serial.println(\"与 max31865 通信成功\");}
        else
            { Serial.println(\"无法与设备通信。请检查您的连接并重试\");} }
  void
loop()
{ //在开始使用 RTD 到数字转换之前,用户可以做一个初步测试,以检测他们的 RTD 连接是否有故障与 max31865
      Fault_Error = Read(Fault_Status);         
      //如果未检测到故障,则调用 get_Temp() 并启动转换。结果显示在串行控制台上     
      if(Fault_Error == 0)
       { Write(Configuration, 0b11000000);
          get_Temp(); //调用 get_Temp() 读取 RTD 寄存器并转换为温度读数
        }
      else{
      //如果检测到故障,将调用故障寄存器并在串行控制台中显示故障列表。用户应在继续操作之前排除故障      
        Serial.println(\"检测到故障。请参考下面的故障位:\");
        Serial.println(\" \");
        故障(故障_错误);
        写入(配置,0b10000010);延迟(700);//故障寄存器不会自动清除。用户应在每次故障后清除它。
        写入(配置,0b11000000);延迟(700);} //再次将设备设置为自动配置。   
}


更多回帖

发帖
×
20
完善资料,
赚取积分