完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
您好,
我正在尝试与 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_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);} //再次将设备设置为自动配置。 } |
|
相关推荐 |
|
只有小组成员才能发言,加入小组>>
191个成员聚集在这个小组
加入小组470 浏览 1 评论
1646 浏览 2 评论
642浏览 6评论
536浏览 5评论
有没有办法在不使用混杂模式的情况下实现Wifi驱动程序接收缓冲区访问中断呢?
515浏览 5评论
517浏览 4评论
507浏览 4评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-2-23 09:43 , Processed in 0.711230 second(s), Total 72, Slave 56 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191