您好,
我正在尝试与 Max31865 adafruit
PCB 进行
通信,但没有成功。我检查了所有引脚和连接,并确认我使用示例草图 (Arduino ide) 运行 max31865 库并且工作正常,这意味着连接、pcb 故障已被排除。esp8622 来自 olimex,我按照说明手册使用 HSD 端口(引脚 12、13、14、15)。我和 Arduino 一起用过。esp 基本版本是 3.0 alpha 69。请找到我试图从寄存器 0x00 读取失败的以下代码。
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_Configura
tion = 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);} //再次将设备设置为自动配置。
}